diff --git a/app/__init__.py b/app/__init__.py
index 0ceb1d7cad06aacccef68f054d0ff4cca988a7af..22290e19e57b26f0101719d87c954646cd25d376 100644
--- a/app/__init__.py
+++ b/app/__init__.py
@@ -61,16 +61,22 @@ def create_app(config_class=None): # Có thể bỏ config_class hoặc dùng ch
 
     # --- Quan trọng: Đảm bảo các cấu hình cần thiết được thiết lập --- 
     # Nếu không có trong file config.py, cần có giá trị mặc định ở đây
-    app.config.setdefault('SECRET_KEY', 'a_default_secret_key_change_me')
+    app.config.setdefault('SECRET_KEY', 'a_default_secret_key_change_me_123') # Changed default key
     app.config.setdefault('SQLALCHEMY_DATABASE_URI', 'mysql://root:MinhDZ3009@localhost/ccu') 
     app.config.setdefault('SQLALCHEMY_TRACK_MODIFICATIONS', False)
     app.config.setdefault('UPLOAD_FOLDER', os.path.join(app.instance_path, 'uploads'))
     app.config.setdefault('WTF_CSRF_ENABLED', True)
+    
     # Tạo thư mục UPLOAD_FOLDER nếu chưa có
     upload_folder = app.config['UPLOAD_FOLDER']
     if not os.path.exists(upload_folder):
-        print(f"Creating upload folder: {upload_folder}") # Thêm log
-        os.makedirs(upload_folder)
+        try: # Thêm try-except để xử lý race condition có thể xảy ra
+            os.makedirs(upload_folder)
+            print(f"Created upload folder: {upload_folder}") # Thêm log
+        except FileExistsError:
+            pass # Thư mục đã được tạo bởi process khác
+        except Exception as e:
+            print(f"Error creating upload folder {upload_folder}: {e}") # Log lỗi nếu không tạo được
     # -----------------------------------------------------------------
     
     # Liên kết các extensions với app
@@ -93,6 +99,8 @@ def create_app(config_class=None): # Có thể bỏ config_class hoặc dùng ch
     from .routes.dietitians import dietitians_bp
     from .routes.dashboard import dashboard_bp
     from .routes.notifications import notifications_bp as notifications_blueprint
+    from .routes.main import main_bp # Import main_bp
+    # from .routes.errors import errors_bp # Đã comment out / xóa
     # from .api import api_bp # Xóa hoặc comment out dòng này
 
     app.register_blueprint(auth_bp)
@@ -102,20 +110,19 @@ def create_app(config_class=None): # Có thể bỏ config_class hoặc dùng ch
     app.register_blueprint(dietitians_bp)
     app.register_blueprint(dashboard_bp)
     app.register_blueprint(notifications_blueprint, url_prefix='/notifications') # Sử dụng tên đã đổi
-    # app.register_blueprint(api_bp, url_prefix='/api') # Xóa hoặc comment out dòng này
+    app.register_blueprint(main_bp) # Register main_bp
+    # app.register_blueprint(errors_bp) # Đã comment out / xóa
+    # app.register_blueprint(api_bp) # Xóa hoặc comment out dòng này
+
+    # Register dietitian blueprint
+    from .routes.dietitian import dietitian_bp
+    app.register_blueprint(dietitian_bp)
 
     # Import models để SQLAlchemy biết về chúng
     with app.app_context():
         from . import models
 
-    # --- Thêm Route cho Trang chủ ('/') --- 
-    @app.route('/')
-    def handle_root():
-        from flask_login import current_user # Import cục bộ để tránh circular import
-        if current_user.is_authenticated:
-            return redirect(url_for('dashboard.index'))
-        else:
-            return redirect(url_for('auth.login'))
-    # ----------------------------------------
+    # Thêm alias cho route 'handle_root'
+    app.add_url_rule('/', endpoint='handle_root', view_func=lambda: redirect(url_for('main.handle_root')))
 
     return app
diff --git a/app/forms/procedure.py b/app/forms/procedure.py
new file mode 100644
index 0000000000000000000000000000000000000000..306399f127c24a867e23255f3031cd057b40f6a3
--- /dev/null
+++ b/app/forms/procedure.py
@@ -0,0 +1,61 @@
+from flask_wtf import FlaskForm
+from wtforms import StringField, TextAreaField, SelectField, DateTimeField, SubmitField
+from wtforms.validators import DataRequired, Optional, ValidationError
+from app.models.encounter import Encounter
+from datetime import datetime
+
+# Danh sách các loại procedure phổ biến
+PROCEDURE_TYPES = [
+    ('', '-- Select Type --'),
+    ('Enteral Feeding Tube Placement', 'Enteral Feeding Tube Placement'),
+    ('Enteral Feeding Tube Change', 'Enteral Feeding Tube Change'),
+    ('Enteral Feeding Tube Removal', 'Enteral Feeding Tube Removal'),
+    ('Parenteral Nutrition Line Insertion', 'Parenteral Nutrition Line Insertion'),
+    ('Parenteral Nutrition Line Management', 'Parenteral Nutrition Line Management'),
+    ('Swallowing Assessment', 'Swallowing Assessment'),
+    ('Other', 'Other')
+]
+
+class ProcedureForm(FlaskForm):
+    """Form for adding or editing nutritional procedures."""
+    
+    # Liên kết với Encounter (bắt buộc)
+    encounter_id = SelectField('Associated Encounter*', coerce=int, validators=[DataRequired(message="Please select the encounter this procedure belongs to.")])
+    
+    # Loại procedure (bắt buộc)
+    procedureType = SelectField('Procedure Type*', choices=PROCEDURE_TYPES, validators=[DataRequired(message="Please select a procedure type.")])
+    
+    # Tên cụ thể (tùy chọn, ví dụ: tên loại ống sonde)
+    procedureName = StringField('Specific Name/Detail (Optional)')
+    
+    # Thời gian thực hiện (bắt buộc)
+    procedureDateTime = DateTimeField('Date and Time Performed*', format='%Y-%m-%dT%H:%M', default=datetime.utcnow, validators=[DataRequired(message="Please enter the date and time.")])
+
+    # Mô tả (tùy chọn)
+    description = TextAreaField('Description/Notes (Optional)', render_kw={"rows": 4})
+
+    # Kết quả (tùy chọn)
+    procedureResults = TextAreaField('Results/Outcome (Optional)', render_kw={"rows": 4})
+    
+    # Thời gian kết thúc (tùy chọn)
+    procedureEndDateTime = DateTimeField('End Date and Time (Optional)', format='%Y-%m-%dT%H:%M', validators=[Optional()])
+
+    submit = SubmitField('Save Procedure')
+
+    def __init__(self, patient_id=None, *args, **kwargs):
+        """Khởi tạo form, đặc biệt là populate Encounter choices."""
+        super(ProcedureForm, self).__init__(*args, **kwargs)
+        self.encounter_id.choices = [('', '-- Select Encounter --')]
+        if patient_id:
+            # Truy vấn các encounters của bệnh nhân để làm choices
+            # Sắp xếp theo thời gian giảm dần để encounter mới nhất lên đầu
+            encounters = Encounter.query.filter_by(patient_id=patient_id).order_by(Encounter.start_time.desc()).all()
+            self.encounter_id.choices.extend([
+                (enc.encounterID, f"{enc.custom_encounter_id or enc.encounterID} ({enc.start_time.strftime('%d/%m/%y %H:%M') if enc.start_time else 'N/A'})") 
+                for enc in encounters
+            ])
+
+    def validate_procedureEndDateTime(self, field):
+        """Đảm bảo thời gian kết thúc không trước thời gian bắt đầu."""
+        if field.data and self.procedureDateTime.data and field.data < self.procedureDateTime.data:
+            raise ValidationError('End time cannot be earlier than start time.') 
\ No newline at end of file
diff --git a/app/forms/report.py b/app/forms/report.py
index 7ad36128b3d2b423845821e266da290554cf76f2..f3f8d2a783e3b590856328f79257c0a9e906af7f 100644
--- a/app/forms/report.py
+++ b/app/forms/report.py
@@ -1,10 +1,16 @@
 from flask_wtf import FlaskForm
 from wtforms import StringField, TextAreaField, SelectField, DateField, FloatField, BooleanField, HiddenField, MultipleFileField, FileField
 from wtforms.validators import DataRequired, Optional
+# Import Procedure model để truy vấn
+from app.models.procedure import Procedure 
+from app.models.patient import Patient
 
 class ReportForm(FlaskForm):
     patient_id = StringField('Patient ID', validators=[DataRequired()])
     referral_id = HiddenField('Referral ID')
+    # Thêm trường chọn Procedure liên quan
+    related_procedure_id = SelectField('Related Procedure (Optional)', coerce=int, validators=[Optional()])
+    
     report_type = SelectField('Report Type', 
                               choices=[
                                   ('initial_assessment', 'Initial Assessment'),
@@ -26,7 +32,7 @@ class ReportForm(FlaskForm):
     nutrition_diagnosis = TextAreaField('Nutrition Diagnosis', validators=[DataRequired()])
     assessment_details = TextAreaField('Assessment Details', validators=[DataRequired()])
     intervention_plan = TextAreaField('Intervention Plan', validators=[DataRequired()])
-    intervention_summary = TextAreaField('Intervention Summary', validators=[DataRequired()])
+    intervention_summary = TextAreaField('Intervention Summary', validators=[DataRequired()]) # Giữ lại vì có thể cần tóm tắt khác procedure
     monitoring_plan = TextAreaField('Monitoring Plan', validators=[DataRequired()])
     nutritional_risk_score = FloatField('Nutritional Risk Score', validators=[Optional()])
     malnutrition_screening_result = SelectField('Malnutrition Screening Result',
@@ -38,16 +44,29 @@ class ReportForm(FlaskForm):
                                               validators=[Optional()])
     dietary_recommendations = TextAreaField('Dietary Recommendations', validators=[Optional()])
     supplement_recommendations = TextAreaField('Supplement Recommendations', validators=[Optional()])
-    enteral_feeding_recommendations = TextAreaField('Enteral Feeding Recommendations', validators=[Optional()])
-    parenteral_nutrition_recommendations = TextAreaField('Parenteral Nutrition Recommendations', validators=[Optional()])
+    enteral_feeding_recommendations = TextAreaField('Enteral Feeding Recommendations', validators=[Optional()]) # Sẽ được autofill
+    parenteral_nutrition_recommendations = TextAreaField('Parenteral Nutrition Recommendations', validators=[Optional()]) # Sẽ được autofill
     follow_up_needed = BooleanField('Follow-up Needed')
     follow_up_date = DateField('Follow-up Date', validators=[Optional()], format='%Y-%m-%d')
     attachments = MultipleFileField('Attachments', validators=[Optional()])
     status = SelectField('Status',
                         choices=[
-                            ('draft', 'Draft'),
-                            ('finalized', 'Finalized'),
-                            ('updated', 'Updated')
+                            ('Draft', 'Draft'), # Cập nhật giá trị Status
+                            ('Pending', 'Pending'),
+                            ('Completed', 'Completed')
                         ],
                         validators=[DataRequired()])
-    notes = TextAreaField('Additional Notes', validators=[Optional()]) 
\ No newline at end of file
+    notes = TextAreaField('Additional Notes', validators=[Optional()]) 
+
+    # Thêm hàm khởi tạo để xử lý choices cho related_procedure_id
+    def __init__(self, patient_id=None, *args, **kwargs):
+        super(ReportForm, self).__init__(*args, **kwargs)
+        # Khởi tạo choices rỗng
+        self.related_procedure_id.choices = [('', '-- Select Related Procedure --')]
+        if patient_id:
+            # Lấy danh sách procedures của bệnh nhân này
+            procedures = Procedure.query.filter_by(patient_id=patient_id).order_by(Procedure.procedureDateTime.desc()).all()
+            self.related_procedure_id.choices.extend([
+                (proc.id, f"{proc.procedureType} ({proc.procedureDateTime.strftime('%d/%m/%y %H:%M')})") 
+                for proc in procedures
+            ]) 
\ No newline at end of file
diff --git a/app/models/encounter.py b/app/models/encounter.py
index 77bb0daa0bebe4a11795a902b17b8f8071cd33b5..287df273bdbcc58d0498a49d079a16207d82b2bf 100644
--- a/app/models/encounter.py
+++ b/app/models/encounter.py
@@ -2,23 +2,36 @@ from app import db
 from datetime import datetime
 from app.models.user import User
 from app.models.patient import Patient
+from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Enum, Boolean
+from sqlalchemy.orm import relationship
+import enum
+
+class EncounterStatus(enum.Enum):
+    NOT_STARTED = "Not started"
+    ON_GOING = "On-going"
+    FINISHED = "Finished"
 
 class Encounter(db.Model):
     __tablename__ = 'encounters'
 
-    encounterID = db.Column(db.Integer, primary_key=True)
-    custom_encounter_id = db.Column(db.String(50), unique=True, nullable=True, index=True)
-    patient_id = db.Column(db.String(20), db.ForeignKey('patients.patientID'), nullable=False)
-    notes = db.Column(db.Text)
-    start_time = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, index=True)
-    dietitian_id = db.Column(db.Integer, db.ForeignKey('users.userID'), nullable=True)
-    status = db.Column(db.String(50), default='Active', nullable=False)
-    created_at = db.Column(db.DateTime, default=datetime.utcnow)
-    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
+    encounterID = Column(Integer, primary_key=True)
+    custom_encounter_id = Column(String(50), unique=True, nullable=True, index=True)
+    patient_id = Column(String(20), ForeignKey('patients.patientID'), nullable=False)
+    notes = Column(db.Text)
+    start_time = Column(DateTime, nullable=False, default=datetime.utcnow, index=True)
+    end_time = Column(DateTime, nullable=True)
+    encounter_type = Column(String(50))
+    status = Column(Enum(EncounterStatus), default=EncounterStatus.NOT_STARTED, nullable=False, index=True)
+    created_at = Column(DateTime, default=datetime.utcnow)
+    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
+    dietitian_id = Column(Integer, ForeignKey('users.userID'), nullable=True)
+    needs_intervention = Column(Boolean, nullable=True, default=None)
+    diagnosis = Column(String(255))
 
-    patient = db.relationship('Patient', back_populates='encounters')
-    assigned_dietitian = db.relationship('User', foreign_keys=[dietitian_id], backref='assigned_encounters')
-    measurements = db.relationship('PhysiologicalMeasurement', backref='encounter', lazy='dynamic', cascade='all, delete-orphan')
+    patient = relationship('Patient', back_populates='encounters')
+    assigned_dietitian = relationship('User', foreign_keys=[dietitian_id], backref='assigned_encounters')
+    measurements = relationship('PhysiologicalMeasurement', backref='encounter', lazy='dynamic', cascade='all, delete-orphan')
+    referrals = relationship('Referral', back_populates='encounter', lazy='dynamic', cascade='all, delete-orphan')
 
     def __repr__(self):
         display_id = self.custom_encounter_id if self.custom_encounter_id else self.encounterID
diff --git a/app/models/measurement.py b/app/models/measurement.py
index 4b64800ff1dcc302d2706dcfbf50242e5dd0ee33..cdfa8243b19c4802366f311f0d0fbb9e7e44d342 100644
--- a/app/models/measurement.py
+++ b/app/models/measurement.py
@@ -46,4 +46,38 @@ class PhysiologicalMeasurement(db.Model):
     updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
     
     def __repr__(self):
-        return f'<PhysiologicalMeasurement {self.id} for Patient {self.patient_id} in Encounter {self.encounter_id} at {self.measurementDateTime}>' 
\ No newline at end of file
+        return f'<PhysiologicalMeasurement {self.id} for Patient {self.patient_id} in Encounter {self.encounter_id} at {self.measurementDateTime}>'
+
+    def to_dict(self):
+        """Returns a dictionary representation of the measurement for ML processing."""
+        # Bao gồm tất cả các trường số có thể dùng làm feature
+        return {
+            # 'measurementID': self.id, # Có thể không cần ID
+            # 'encounterID': self.encounter_id, # Có thể không cần ID
+            # 'patientID': self.patient_id, # Có thể không cần ID
+            # 'measurementDateTime': self.measurementDateTime.isoformat() if self.measurementDateTime else None,
+            'end_tidal_co2': self.end_tidal_co2,
+            'feed_vol': self.feed_vol,
+            'feed_vol_adm': self.feed_vol_adm,
+            'fio2': self.fio2,
+            'fio2_ratio': self.fio2_ratio,
+            'insp_time': self.insp_time,
+            'oxygen_flow_rate': self.oxygen_flow_rate,
+            'peep': self.peep,
+            'pip': self.pip,
+            'resp_rate': self.resp_rate,
+            'sip': self.sip,
+            'tidal_vol': self.tidal_vol,
+            'tidal_vol_actual': self.tidal_vol_actual,
+            'tidal_vol_kg': self.tidal_vol_kg,
+            'tidal_vol_spon': self.tidal_vol_spon,
+            'temperature': self.temperature,
+            'heart_rate': self.heart_rate,
+            'respiratory_rate': self.respiratory_rate, # Lưu ý: có thể trùng với resp_rate? Kiểm tra lại features model dùng
+            'blood_pressure_systolic': self.blood_pressure_systolic,
+            'blood_pressure_diastolic': self.blood_pressure_diastolic,
+            'oxygen_saturation': self.oxygen_saturation,
+            'bmi': self.bmi,
+            'tidal_volume': self.tidal_volume, # Lưu ý: có thể trùng với tidal_vol? Kiểm tra lại features model dùng
+            'referral_score': self.referral_score
+        } 
\ No newline at end of file
diff --git a/app/models/patient.py b/app/models/patient.py
index da8b5db969506acba0941a31ffb444c67527b30a..db40ff3def1d4a7566718f952e00e251a3f2f45e 100644
--- a/app/models/patient.py
+++ b/app/models/patient.py
@@ -11,6 +11,13 @@ class Gender(enum.Enum):
     female = "female"  
     other = "other"
 
+# Định nghĩa Enum trạng thái mới cho Patient
+class PatientStatus(enum.Enum):
+    NOT_ASSESSED = "Not assessed"
+    NEEDS_ASSESSMENT = "Needs assessment"
+    ASSESSMENT_IN_PROGRESS = "Assessment in progress"
+    COMPLETED = "Completed"
+
 class Patient(db.Model):
     """Patient model containing basic patient information"""
     __tablename__ = 'patients'
@@ -21,7 +28,7 @@ class Patient(db.Model):
     age = Column(Integer, nullable=False)
     gender = Column(Enum('male', 'female', 'other', name='gender_types'), nullable=False)
     bmi = Column(Float, nullable=True)  # From CSV
-    status = Column(String(20), default='active', nullable=True)
+    status = Column(Enum(PatientStatus), default=PatientStatus.NOT_ASSESSED, nullable=False, index=True)
     height = Column(Float, nullable=True)  # Height in cm
     weight = Column(Float, nullable=True)  # Weight in kg
     blood_type = Column(String(10), nullable=True)
@@ -33,9 +40,15 @@ class Patient(db.Model):
     
     # Relationships
     encounters = relationship('Encounter', back_populates='patient', lazy='dynamic', order_by=desc('Encounter.start_time'))
-    dietitian_id = Column(Integer, ForeignKey('dietitians.dietitianID'), nullable=True)
-    dietitian = relationship('Dietitian', backref='patients', lazy=True)
+    # dietitian_id = Column(Integer, ForeignKey('dietitians.dietitianID'), nullable=True) # Bỏ cột cũ này
+    # dietitian = relationship('Dietitian', backref='patients', lazy=True) # Bỏ relationship cũ này
     
+    # Thêm trường mới để lưu userID của dietitian được gán
+    assigned_dietitian_user_id = Column(Integer, ForeignKey('users.userID'), nullable=True)
+    assigned_dietitian = relationship('User', foreign_keys=[assigned_dietitian_user_id], backref='assigned_patients')
+    # Thêm cột ngày gán
+    assignment_date = Column(DateTime, nullable=True)
+
     def __repr__(self):
         return f'<Patient {self.id}>'
     
diff --git a/app/models/procedure.py b/app/models/procedure.py
index 6a7ee6d4504c40f399821beb184024e162c82c29..7f5ebdab0abaeaaa878df50ee740f8a446069a28 100644
--- a/app/models/procedure.py
+++ b/app/models/procedure.py
@@ -1,5 +1,6 @@
 from datetime import datetime
 from app import db
+from sqlalchemy.orm import relationship # Import relationship
 
 class Procedure(db.Model):
     """Model for nutritional procedures and interventions"""
@@ -23,5 +24,9 @@ class Procedure(db.Model):
     created_at = db.Column(db.DateTime, default=datetime.utcnow)
     updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
     
+    # Relationships
+    encounter = relationship('Encounter', backref='procedures')
+    patient = relationship('Patient', backref='procedures')
+
     def __repr__(self):
         return f'<Procedure {self.id} - {self.procedureName}>'
diff --git a/app/models/referral.py b/app/models/referral.py
index 7267a352467bcf0019fbf88799d3c58a699d98f2..5a83dcdc1153235e52236c7ed594b1605291a821 100644
--- a/app/models/referral.py
+++ b/app/models/referral.py
@@ -1,6 +1,14 @@
 from datetime import datetime
 from app import db
 from sqlalchemy.ext.hybrid import hybrid_property
+from sqlalchemy.orm import relationship
+import enum
+
+# Định nghĩa Enum trạng thái mới cho Referral
+class ReferralStatus(enum.Enum):
+    DIETITIAN_UNASSIGNED = "Dietitian unassigned"
+    WAITING_FOR_REPORT = "Waiting for report"
+    COMPLETED = "Completed"
 
 class Referral(db.Model):
     """Model for dietitian referrals"""
@@ -13,17 +21,25 @@ class Referral(db.Model):
     # Referral fields from schema
     is_ml_recommended = db.Column(db.Boolean, default=False)
     is_staff_referred = db.Column(db.Boolean, default=False)
-    referral_status = db.Column(db.Enum('Not Needed', 'ML Recommended', 'Pending Review', 'Staff Referred', 'Completed', 'Rejected'), default='Not Needed')
+    # Cập nhật cột referral_status để sử dụng Enum mới và cho phép NULL
+    referral_status = db.Column(db.Enum(ReferralStatus), nullable=True, index=True)
     referralRequestedDateTime = db.Column(db.DateTime)
     referralCompletedDateTime = db.Column(db.DateTime)
     
-    dietitian_id = db.Column('dietitianID', db.Integer, db.ForeignKey('dietitians.dietitianID'))
     notes = db.Column(db.Text)
     
     # Timestamps
     createdAt = db.Column(db.DateTime, default=datetime.utcnow)
     updatedAt = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
     
+    # Relationships
+    encounter = relationship("Encounter", back_populates="referrals")
+    patient = relationship("Patient", backref="referrals")
+    
+    # Thêm liên kết mới với User (dietitian)
+    assigned_dietitian_user_id = db.Column(db.Integer, db.ForeignKey('users.userID'), nullable=True)
+    assigned_dietitian = relationship('User', foreign_keys=[assigned_dietitian_user_id], backref='assigned_referrals')
+    
     def __repr__(self):
         return f'<Referral {self.id} for Encounter {self.encounter_id}>'
         
@@ -62,4 +78,25 @@ class Referral(db.Model):
             patient_name = f"Patient ID {self.patient_id}"
 
         date_str = self.referralRequestedDateTime.strftime('%Y-%m-%d') if self.referralRequestedDateTime else "Unknown Date"
-        return f"Referral for {patient_name} ({date_str})" 
\ No newline at end of file
+        return f"Referral for {patient_name} ({date_str})" 
+        
+    def get_status_color(self):
+        """Trả về màu sắc tương ứng với trạng thái của giấy giới thiệu"""
+        status_colors = {
+            'Not Needed': 'secondary',
+            'ML Recommended': 'info',
+            'Pending Review': 'warning',
+            'Staff Referred': 'primary',
+            'Completed': 'success',
+            'Rejected': 'danger'
+        }
+        return status_colors.get(self.referral_status.name if self.referral_status else None, 'secondary')
+        
+    def get_priority_color(self):
+        """Trả về màu sắc dựa trên mức độ ưu tiên"""
+        # Mặc định trả về màu xám, coi như ưu tiên thấp
+        return 'blue'
+        
+    def priority_text(self):
+        """Trả về văn bản mô tả mức độ ưu tiên"""
+        # Mặc định là "Normal" 
\ No newline at end of file
diff --git a/app/models/report.py b/app/models/report.py
index ec7fc8d9de904fe57bb1355b856589128011080f..0f7acf6151b24fc339c0beda887673ccfbec6b8c 100644
--- a/app/models/report.py
+++ b/app/models/report.py
@@ -1,6 +1,7 @@
 from datetime import datetime
 from app import db
 from sqlalchemy.orm import relationship
+from app.models.procedure import Procedure # Import Procedure
 
 class Report(db.Model):
     """Model for dietitian reports and assessments"""
@@ -11,12 +12,19 @@ class Report(db.Model):
     author_id = db.Column('authorID', db.Integer, db.ForeignKey('users.userID'), nullable=False)
     # Khóa ngoại tới Patient
     patient_id = db.Column('patientID', db.String(20), db.ForeignKey('patients.patientID'), nullable=False)
+    # Khóa ngoại tới Encounter
+    encounter_id = db.Column('encounterID', db.Integer, db.ForeignKey('encounters.encounterID'), nullable=True)
     # Khóa ngoại tới Referral (tùy chọn)
     referral_id = db.Column('referralID', db.Integer, db.ForeignKey('referrals.referralID'), nullable=True)
+    # Khóa ngoại tới dietitian (người được gán)
+    dietitian_id = db.Column('dietitianID', db.Integer, db.ForeignKey('users.userID'), nullable=True)
+    # Khóa ngoại tới Procedure (tùy chọn)
+    related_procedure_id = db.Column(db.Integer, db.ForeignKey('procedures.procedureID'), nullable=True)
 
     report_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
     report_type = db.Column(db.String(50), nullable=False) # e.g., 'initial_assessment', 'follow_up'
-    status = db.Column(db.String(20), default='draft') # e.g., 'draft', 'finalized'
+    status = db.Column(db.String(20), default='Draft') # e.g., 'Draft', 'Pending', 'Completed'
+    completed_date = db.Column(db.DateTime, nullable=True)
     
     # Assessment Fields
     nutritional_status = db.Column(db.String(100))
@@ -47,7 +55,11 @@ class Report(db.Model):
     # Relationships
     author = relationship('User', backref='reports_authored', foreign_keys=[author_id])
     patient = relationship('Patient', backref='reports')
+    encounter = relationship('Encounter', backref='reports')
     referral = relationship('Referral', backref='related_report')
+    dietitian = relationship('User', backref='assigned_reports', foreign_keys=[dietitian_id])
+    # Relationship tới Procedure
+    procedure = relationship('Procedure', backref=db.backref('related_reports', lazy='dynamic'))
     # attachments = relationship('ReportAttachment', backref='report', cascade='all, delete-orphan') # Sẽ thêm model Attachment sau nếu cần
 
     def __repr__(self):
diff --git a/app/routes/auth.py b/app/routes/auth.py
index 6a1311c02d88d7785f5a9c692a1350dfbdaba0cb..e3a41551c78b5ca91ec5fd56217cd7b72d208162 100644
--- a/app/routes/auth.py
+++ b/app/routes/auth.py
@@ -52,14 +52,26 @@ def login():
         next_page = request.args.get('next')
         flash('Đăng nhập thành công!', 'success')
         
-        # Chuyển hướng đến trang được yêu cầu hoặc trang chính
+        # Chuyển hướng đến trang được yêu cầu hoặc dashboard phù hợp với vai trò
+        redirect_url = None
         if next_page:
             # Kiểm tra an toàn cho URL chuyển hướng (is_safe_url cần được định nghĩa hoặc import)
             # if is_safe_url(next_page): 
-            #     return redirect(next_page)
+            #    redirect_url = next_page
             # Tạm thời cho phép mọi next_page nếu không có is_safe_url
-             return redirect(next_page)
-        return redirect(url_for('dashboard.index'))
+             redirect_url = next_page # Giữ nguyên logic next_page nếu có
+
+        if not redirect_url:
+            # Nếu không có next_page, chuyển hướng dựa trên vai trò
+            if user.role == 'Dietitian':
+                redirect_url = url_for('dietitian.dashboard')
+            elif user.role == 'Admin':
+                redirect_url = url_for('dashboard.index')
+            else:
+                # Mặc định (hoặc cho các vai trò khác)
+                redirect_url = url_for('main.handle_root') # Dùng handle_root để nó tự phân luồng lại lần nữa nếu cần
+
+        return redirect(redirect_url)
     
     return render_template('login.html', form=form, title='Đăng nhập')
 
diff --git a/app/routes/dashboard.py b/app/routes/dashboard.py
index f1e8b869d75491552fd6cb3f517bf24ab2bab9cc..bb8822f33fb62664968c3507992a05a9a9e1695e 100644
--- a/app/routes/dashboard.py
+++ b/app/routes/dashboard.py
@@ -1,13 +1,13 @@
 from flask import Blueprint, render_template, jsonify, redirect, url_for
 from flask_login import login_required, current_user
 from app import db
-from app.models.patient import Patient
+from app.models.patient import Patient, PatientStatus
 from app.models.encounter import Encounter
 from app.models.referral import Referral
 from app.models.procedure import Procedure
 from app.models.report import Report
 from app.models.measurement import PhysiologicalMeasurement
-from sqlalchemy import func, case, or_, and_
+from sqlalchemy import func, case, or_, and_, desc
 from datetime import datetime, timedelta
 import json
 
@@ -17,6 +17,10 @@ dashboard_bp = Blueprint('dashboard', __name__, url_prefix='/dashboard')
 @dashboard_bp.route('/index')
 @login_required
 def index():
+    # Kiểm tra vai trò người dùng, nếu là Dietitian thì chuyển hướng
+    if current_user.role == 'Dietitian':
+        return redirect(url_for('dietitian.dashboard'))
+        
     # Get statistics for dashboard
     stats = {
         'total_patients': Patient.query.count(),
@@ -24,11 +28,11 @@ def index():
         'procedures_today': Procedure.query.filter(
             func.date(Procedure.procedureDateTime) == func.date(datetime.now())
         ).count(),
-        'pending_reports': Report.query.filter_by(status='draft').count()
+        'pending_reports': Report.query.filter(Report.status == 'Pending').count()
     }
     
-    # Get recent patients for dashboard
-    recent_patients = Patient.query.limit(5).all()
+    # Get recent patients for dashboard, sắp xếp theo ngày nhập viện mới nhất
+    recent_patients = Patient.query.order_by(desc(Patient.admission_date)).limit(5).all()
     
     # Get recent referrals
     recent_referrals = (Referral.query
@@ -123,7 +127,8 @@ def index():
         recent_referrals=recent_referrals,
         bmi_stats=bmi_stats,
         referral_timeline=referral_timeline,
-        alerts=alerts
+        alerts=alerts,
+        PatientStatus=PatientStatus
     )
 
 @dashboard_bp.route('/api/stats')
diff --git a/app/routes/dietitian.py b/app/routes/dietitian.py
new file mode 100644
index 0000000000000000000000000000000000000000..0b5912dc3d9fd19f10361d941a149abb79d53885
--- /dev/null
+++ b/app/routes/dietitian.py
@@ -0,0 +1,200 @@
+from flask import Blueprint, render_template, current_app, abort, request, flash, redirect, url_for
+from flask_login import login_required, current_user
+from functools import wraps # Import wraps
+from app import db
+from app.models.patient import Patient, PatientStatus # Import PatientStatus
+from app.models.user import User
+from app.models.report import Report
+from app.models.referral import Referral
+from app.models.encounter import Encounter, EncounterStatus # Import EncounterStatus
+from app.models.activity_log import ActivityLog
+from app.models.procedure import Procedure # Import Procedure model
+from app.forms.procedure import ProcedureForm # Import ProcedureForm
+from sqlalchemy import func, case, desc
+from datetime import datetime, timedelta
+
+dietitian_bp = Blueprint('dietitian', __name__, url_prefix='/dietitian')
+
+# Decorator for role check
+def dietitian_required(f):
+    @wraps(f) # Now wraps is defined
+    @login_required
+    def decorated_function(*args, **kwargs):
+        if current_user.role != 'Dietitian':
+            abort(403) # Forbidden
+        return f(*args, **kwargs)
+    return decorated_function
+
+@dietitian_bp.route('/dashboard')
+@dietitian_required # Sử dụng decorator mới
+def dashboard():
+    dietitian_id = current_user.userID
+
+    # === Dữ liệu cho Cards ===
+    assigned_patients_query = Patient.query.filter_by(assigned_dietitian_user_id=dietitian_id)
+    total_assigned_patients = assigned_patients_query.count()
+
+    # Đếm bệnh nhân theo trạng thái liên quan đến dietitian
+    needs_assessment_count = assigned_patients_query.filter(Patient.status == PatientStatus.NEEDS_ASSESSMENT).count()
+    
+    # Các trạng thái được coi là "In Progress" đối với dietitian
+    in_progress_statuses = [
+        EncounterStatus.ON_GOING.value
+    ]
+    # Đếm bệnh nhân có status ASSESSMENT_IN_PROGRESS
+    in_progress_count = assigned_patients_query.filter(Patient.status == PatientStatus.ASSESSMENT_IN_PROGRESS).count() 
+
+    # Đếm báo cáo đang chờ review (ví dụ: status 'draft' hoặc 'pending_review' nếu có)
+    pending_reports_count = Report.query.filter(
+        Report.author_id == dietitian_id, # Chỉ báo cáo do dietitian này tạo
+        Report.status == 'draft' # Hoặc trạng thái chờ duyệt khác
+    ).count()
+
+    # === Dữ liệu cho Lists ===
+    recent_patients = assigned_patients_query.order_by(desc(Patient.assignment_date)).limit(5).all()
+    
+    # Hoạt động gần đây (ví dụ: được gán BN, cập nhật báo cáo)
+    # Sửa lại cách filter để tránh lỗi generator expression
+    patient_ids = [patient.id for patient in assigned_patients_query.all()]
+    patient_filters = []
+    for pid in patient_ids:
+        patient_filters.append(ActivityLog.details.like(f'%Patient ID: {pid}%'))
+    
+    recent_activities = ActivityLog.query.filter(
+        (ActivityLog.user_id == dietitian_id) | 
+        (db.or_(*patient_filters) if patient_filters else False)
+    ).order_by(desc(ActivityLog.timestamp)).limit(5).all()
+
+
+    # === Dữ liệu cho Charts ===
+    assigned_patient_list = assigned_patients_query.all()
+    
+    # 1. BMI Distribution
+    bmi_categories = {
+        'Underweight': 0,
+        'Normal': 0,
+        'Overweight': 0,
+        'Obese': 0,
+        'Unknown': 0
+    }
+    for p in assigned_patient_list:
+        category = p.get_bmi_category() # Sử dụng helper method từ model Patient
+        if category in bmi_categories:
+            bmi_categories[category] += 1
+        else:
+             bmi_categories['Unknown'] += 1
+    bmi_chart_data = {
+        'labels': list(bmi_categories.keys()),
+        'data': list(bmi_categories.values())
+    }
+
+    # 2. Gender Distribution
+    gender_distribution = db.session.query(
+        Patient.gender, func.count(Patient.id)
+    ).filter(
+        Patient.assigned_dietitian_user_id == dietitian_id
+    ).group_by(Patient.gender).all()
+    
+    gender_chart_data = {
+        'labels': [g[0] if g[0] else 'Unknown' for g in gender_distribution],
+        'data': [g[1] for g in gender_distribution]
+    }
+
+    # 3. Patient Status Distribution (Focus on Dietitian Workflow)
+    # Đếm trực tiếp các trạng thái từ patient.status
+    status_distribution = db.session.query(
+        Patient.status, func.count(Patient.id)
+    ).filter(
+        Patient.assigned_dietitian_user_id == dietitian_id
+    ).group_by(Patient.status).all()
+    
+    status_chart_data = {
+        'labels': [s[0].value.replace('_', ' ').title() if s[0] else 'Unknown' for s in status_distribution],
+        'data': [s[1] for s in status_distribution]
+    }
+
+
+    return render_template(
+        'dietitian_dashboard.html',
+        total_assigned_patients=total_assigned_patients,
+        needs_assessment_count=needs_assessment_count,
+        in_progress_count=in_progress_count,
+        pending_reports_count=pending_reports_count,
+        recent_patients=recent_patients,
+        recent_activities=recent_activities,
+        bmi_chart_data=bmi_chart_data,
+        gender_chart_data=gender_chart_data,
+        status_chart_data=status_chart_data
+    ) 
+
+
+# --- Procedure Routes for Dietitians ---
+
+@dietitian_bp.route('/procedures')
+@dietitian_required
+def list_procedures():
+    """Hiển thị danh sách các procedures, có thể lọc theo bệnh nhân."""
+    page = request.args.get('page', 1, type=int)
+    per_page = 15 # Số lượng procedure mỗi trang
+    patient_filter_id = request.args.get('patient_id', type=int)
+
+    query = Procedure.query.join(Patient, Procedure.patient_id == Patient.id)\
+                         .join(Encounter, Procedure.encounter_id == Encounter.encounterID)\
+                         .options(db.joinedload(Procedure.patient), db.joinedload(Procedure.encounter))
+    
+    # Lọc theo bệnh nhân nếu có ID
+    if patient_filter_id:
+        query = query.filter(Procedure.patient_id == patient_filter_id)
+
+    # Chỉ hiển thị các procedure liên quan đến bệnh nhân được gán cho dietitian này?
+    # Cân nhắc: Có thể dietitian cần xem procedure của BN khác? Hiện tại cho xem hết.
+    # query = query.filter(Patient.assigned_dietitian_user_id == current_user.userID)
+
+    query = query.order_by(Procedure.procedureDateTime.desc())
+    
+    pagination = query.paginate(page=page, per_page=per_page, error_out=False)
+    procedures = pagination.items
+
+    # Lấy danh sách bệnh nhân cho dropdown filter
+    patients_for_filter = Patient.query.order_by(Patient.lastName, Patient.firstName).all()
+
+    return render_template('dietitian_procedures.html', 
+                           procedures=procedures, 
+                           pagination=pagination, 
+                           patients_for_filter=patients_for_filter,
+                           selected_patient_id=patient_filter_id)
+
+@dietitian_bp.route('/procedure/new/for_patient/<string:patient_id>', methods=['GET', 'POST'])
+@dietitian_required
+def new_procedure(patient_id):
+    """Hiển thị form và xử lý tạo Procedure mới cho bệnh nhân cụ thể."""
+    patient = Patient.query.get_or_404(patient_id)
+    form = ProcedureForm(patient_id=patient.id) # Truyền patient_id vào form
+
+    if form.validate_on_submit():
+        try:
+            new_proc = Procedure(
+                patient_id=patient.id,
+                encounter_id=form.encounter_id.data,
+                procedureType=form.procedureType.data,
+                procedureName=form.procedureName.data,
+                procedureDateTime=form.procedureDateTime.data,
+                procedureEndDateTime=form.procedureEndDateTime.data,
+                description=form.description.data,
+                procedureResults=form.procedureResults.data
+                # created_at, updated_at tự động
+            )
+            db.session.add(new_proc)
+            db.session.commit()
+            flash(f'Procedure "{new_proc.procedureType}" created successfully for patient {patient.full_name}.', 'success')
+            # Redirect về danh sách procedure, lọc theo bệnh nhân vừa tạo
+            return redirect(url_for('.list_procedures', patient_id=patient.id))
+        except Exception as e:
+            db.session.rollback()
+            flash(f'Error creating procedure: {str(e)}', 'danger')
+            current_app.logger.error(f"Error creating procedure for patient {patient.id}: {str(e)}", exc_info=True)
+
+    # Nếu là GET hoặc POST không hợp lệ, render form
+    return render_template('procedure_form.html', form=form, patient=patient, edit_mode=False)
+
+# (TODO later: Routes for viewing, editing, deleting procedures) 
\ No newline at end of file
diff --git a/app/routes/main.py b/app/routes/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..015f76f5c16e19ab4d8c2cea4b159aba211a2fec
--- /dev/null
+++ b/app/routes/main.py
@@ -0,0 +1,25 @@
+from flask import Blueprint, render_template, redirect, url_for
+from flask_login import login_required, current_user
+
+main_bp = Blueprint('main', __name__)
+
+@main_bp.route('/')
+@login_required
+def handle_root():
+    """Handle the root URL based on user role."""
+    if current_user.is_authenticated:
+        if current_user.role == 'Admin':
+            # Giữ nguyên chuyển hướng đến dashboard admin cũ (hoặc route tương ứng)
+            # Đảm bảo 'dashboard.index' là route đúng của admin dashboard
+            return redirect(url_for('dashboard.index')) 
+        elif current_user.role == 'Dietitian':
+            # Chuyển hướng đến dietitian dashboard mới
+            return redirect(url_for('dietitian.dashboard'))
+        else:
+            # Vai trò khác (nếu có) hoặc mặc định
+            # Có thể chuyển đến trang profile hoặc trang lỗi
+            # Tạm thời chuyển đến trang logout hoặc một trang chung
+            return redirect(url_for('auth.logout')) # Hoặc trang khác phù hợp
+    else:
+        # Nếu chưa đăng nhập, chuyển đến trang login
+        return redirect(url_for('auth.login')) 
\ No newline at end of file
diff --git a/app/routes/patients.py b/app/routes/patients.py
index c9d17ae1757de36027815927f93c90775827e568..f10747678b844695cd7fb597a3cd39c1b4fa10dc 100644
--- a/app/routes/patients.py
+++ b/app/routes/patients.py
@@ -1,13 +1,14 @@
-from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify, current_app
+from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify, current_app, abort, send_file
 from flask_login import login_required, current_user
 from flask_wtf import FlaskForm
 from app import db
-from app.models.patient import Patient
-from app.models.encounter import Encounter
+from app.models.patient import Patient, PatientStatus
+from app.models.encounter import Encounter, EncounterStatus
 from app.models.measurement import PhysiologicalMeasurement
-from app.models.referral import Referral
+from app.models.referral import Referral, ReferralStatus
 from app.models.procedure import Procedure
 from app.models.report import Report
+from app.models.dietitian import Dietitian
 from sqlalchemy import desc, or_, func
 from sqlalchemy.orm import joinedload
 from datetime import datetime
@@ -17,6 +18,15 @@ import os
 import uuid
 # Thêm import cho hàm xử lý CSV mới
 from app.utils.csv_handler import process_encounter_measurements_csv
+import pickle
+import pandas as pd
+import numpy as np
+from sklearn.preprocessing import StandardScaler
+from sklearn.impute import SimpleImputer
+from sklearn.ensemble import RandomForestClassifier
+from app.models.user import User
+from app.models.activity_log import ActivityLog
+from app.models.notification import Notification
 
 patients_bp = Blueprint('patients', __name__, url_prefix='/patients')
 
@@ -24,6 +34,106 @@ patients_bp = Blueprint('patients', __name__, url_prefix='/patients')
 class EmptyForm(FlaskForm):
     pass
 
+# --- HÀM HELPER CHO DỰ ĐOÁN ML --- 
+def _run_ml_prediction(encounter):
+    """
+    Chạy dự đoán ML cho một encounter dựa trên phép đo mới nhất.
+
+    Args:
+        encounter: Đối tượng Encounter.
+
+    Returns:
+        tuple: (needs_intervention (bool), message (str))
+               Trả về (None, error_message) nếu có lỗi.
+    """
+    loaded_model = None
+    loaded_imputer = None
+    loaded_scaler = None
+    loaded_feature_columns = None
+    model_load_error = None
+    try:
+        MODEL_DIR = os.path.join(current_app.root_path, '..', 'model', 'train_model')
+        MODEL_PATH = os.path.join(MODEL_DIR, 'referral_model.pkl')
+        IMPUTER_PATH = os.path.join(MODEL_DIR, 'imputer.pkl')
+        SCALER_PATH = os.path.join(MODEL_DIR, 'scaler.pkl')
+        FEATURES_PATH = os.path.join(MODEL_DIR, 'feature_columns.pkl')
+
+        # Sử dụng context manager để đảm bảo file được đóng
+        with open(MODEL_PATH, 'rb') as f: loaded_model = pickle.load(f)
+        with open(IMPUTER_PATH, 'rb') as f: loaded_imputer = pickle.load(f)
+        with open(SCALER_PATH, 'rb') as f: loaded_scaler = pickle.load(f)
+        with open(FEATURES_PATH, 'rb') as f: loaded_feature_columns = pickle.load(f)
+        current_app.logger.info(f"ML components loaded successfully for prediction on encounter {encounter.encounterID}")
+
+    except FileNotFoundError as e:
+        model_load_error = f"Lỗi tải file model: {e}."
+        current_app.logger.error(model_load_error)
+        return None, model_load_error + " Dự đoán ML bị vô hiệu hóa."
+    except Exception as e:
+        model_load_error = f"Lỗi không xác định khi tải model: {e}."
+        current_app.logger.error(model_load_error, exc_info=True)
+        return None, model_load_error + " Dự đoán ML bị vô hiệu hóa."
+
+    # Nếu model tải thành công, tiếp tục dự đoán
+    try:
+        # Lấy phép đo MỚI NHẤT của encounter này
+        latest_measurement = PhysiologicalMeasurement.query.filter_by(
+            encounter_id=encounter.encounterID
+        ).order_by(
+            desc(PhysiologicalMeasurement.measurementDateTime)
+        ).first()
+
+        if not latest_measurement:
+            return None, "Không có dữ liệu đo lường nào để chạy dự đoán."
+
+        # Chuyển thành DataFrame (chỉ một dòng)
+        df_predict = pd.DataFrame([latest_measurement.to_dict()])
+
+        # Xử lý các cột bị thiếu và đảm bảo đúng thứ tự features
+        missing_cols = set(loaded_feature_columns) - set(df_predict.columns)
+        for c in missing_cols:
+            df_predict[c] = np.nan
+        df_predict = df_predict[loaded_feature_columns]
+
+        # Tiền xử lý: Impute và Scale
+        X_imputed = loaded_imputer.transform(df_predict)
+        X_scaled = loaded_scaler.transform(X_imputed)
+
+        # Dự đoán (chỉ có 1 dự đoán vì đầu vào là 1 dòng)
+        prediction = loaded_model.predict(X_scaled)[0] # Lấy phần tử đầu tiên
+        needs_intervention = bool(prediction == 1)
+
+        # Cập nhật encounter
+        if hasattr(encounter, 'needs_intervention'):
+            encounter.needs_intervention = needs_intervention
+            # Không commit ở đây, commit sẽ được thực hiện ở route gọi hàm này
+            # db.session.commit()
+            message = f"Model dự đoán: {'Cần' if needs_intervention else 'Chưa cần'} can thiệp dinh dưỡng."
+            current_app.logger.info(f"Encounter {encounter.encounterID} needs_intervention set to: {needs_intervention}")
+            return needs_intervention, message
+        else:
+            error_msg = "Lỗi: Cột 'needs_intervention' chưa có trong model Encounter."
+            current_app.logger.error(error_msg)
+            return None, error_msg
+
+    except Exception as e:
+        error_msg = f"Lỗi trong quá trình dự đoán ML cho encounter {encounter.encounterID}: {e}"
+        current_app.logger.error(error_msg, exc_info=True)
+        # Không nên rollback ở đây vì có thể ảnh hưởng đến commit của route
+        # db.session.rollback()
+        return None, error_msg
+# --- KẾT THÚC HÀM HELPER --- 
+
+def get_encounter_status_display(status: EncounterStatus):
+    """Trả về text và màu sắc Bootstrap/Tailwind cho một EncounterStatus."""
+    status_map = {
+        EncounterStatus.NOT_STARTED: ("Not Started", "gray"),
+        EncounterStatus.ON_GOING: ("On-going", "blue"),
+        EncounterStatus.FINISHED: ("Finished", "green"),
+    }
+    text, color = status_map.get(status, ("Unknown", "black")) # Màu mặc định là đen
+    return {'text': text, 'color': color}
+
 @patients_bp.route('/')
 @login_required
 def index():
@@ -38,6 +148,10 @@ def index():
     # Base query
     query = Patient.query
     
+    # Filter by assigned dietitian if the current user is a dietitian
+    if not current_user.is_admin and current_user.role == 'Dietitian':
+        query = query.filter(Patient.assigned_dietitian_user_id == current_user.userID)
+    
     # Apply filters
     if search:
         query = query.filter(
@@ -89,7 +203,8 @@ def index():
         sort_order=sort_order,
         current_page=page,
         per_page=per_page,
-        pagination=pagination
+        pagination=pagination,
+        EmptyForm=EmptyForm
     )
 
 @patients_bp.route('/<string:patient_id>')
@@ -102,68 +217,78 @@ def patient_detail(patient_id):
         PhysiologicalMeasurement.measurementDateTime.desc()
     ).first()
     
-    # Lấy referrals, procedures, reports (như cũ)
-    referrals = Referral.query.filter_by(patient_id=patient_id).order_by(
+    # Lấy referrals (sử dụng status mới), procedures, reports
+    # Cần cập nhật cách lấy/hiển thị referrals theo trạng thái mới
+    referrals = Referral.query.filter_by(patient_id=patient_id).options(
+        joinedload(Referral.assigned_dietitian) # Tải sẵn dietitian được gán cho referral
+    ).order_by(
         desc(Referral.referralRequestedDateTime)
     ).all()
     procedures = Procedure.query.filter_by(patient_id=patient_id).order_by(
         desc(Procedure.procedureDateTime)
     ).all()
-    reports = Report.query.filter_by(patient_id=patient_id).order_by(
+    reports = Report.query.filter_by(patient_id=patient_id).options(
+        joinedload(Report.author) # Tải sẵn thông tin người tạo
+    ).order_by(
         desc(Report.report_date)
     ).all()
     
     # Lấy tất cả encounters của bệnh nhân, sắp xếp mới nhất trước
     all_encounters = Encounter.query.filter_by(patient_id=patient_id).options(
-        joinedload(Encounter.assigned_dietitian) # Tải sẵn thông tin dietitian
+        joinedload(Encounter.assigned_dietitian) # Tải sẵn thông tin dietitian của encounter
     ).order_by(
-        desc(Encounter.start_time) # Hoặc admissionDateTime nếu dùng
+        desc(Encounter.start_time)
     ).all()
     
     latest_encounter = all_encounters[0] if all_encounters else None
 
-    # Chuẩn bị dữ liệu encounters để hiển thị, bao gồm status và unstable metrics
-    display_encounters = []
+    # Chuẩn bị dữ liệu encounters để hiển thị, bao gồm status display mới
+    encounters_data = []
     for enc in all_encounters:
-        # Xác định trạng thái hiển thị
-        if enc.status == 'Discharged':
-            status = {'text': 'Discharged', 'color': 'gray'}
-        elif enc.assigned_dietitian:
-            status = {'text': 'In Treatment', 'color': 'blue'}
-        else:
-            status = {'text': 'Active', 'color': 'green'}
-
+        # Sử dụng hàm helper đã cập nhật để lấy thông tin hiển thị status
+        status_display = get_encounter_status_display(enc.status)
         # TODO: Xác định các chỉ số bất ổn
         # Logic này cần định nghĩa ngưỡng cho từng chỉ số
-        # Ví dụ đơn giản (tạm thời trả về list rỗng):
-        unstable_metrics_list = [] 
-        # Ví dụ logic thực tế (cần hoàn thiện):
-        # latest_enc_measurement = PhysiologicalMeasurement.query.filter_by(encounter_id=enc.id).order_by(desc(PhysiologicalMeasurement.measurementDateTime)).first()
-        # if latest_enc_measurement:
-        #    if latest_enc_measurement.heart_rate and latest_enc_measurement.heart_rate > 100:
-        #        unstable_metrics_list.append("High HR")
-        #    if latest_enc_measurement.oxygen_saturation and latest_enc_measurement.oxygen_saturation < 92:
-        #        unstable_metrics_list.append("Low SpO2")
-        #    # ... thêm các kiểm tra khác ...
-        # unstable_metrics_list = unstable_metrics_list[:3] # Giới hạn 3
-
-        display_encounters.append({
+        unstable_metrics = [] # Placeholder
+        encounters_data.append({
             'encounter': enc,
-            'status': status,
-            'unstable_metrics': unstable_metrics_list
+            'status': status_display,
+            'unstable_metrics': unstable_metrics
         })
+
+    # Lấy danh sách dietitian cho modal (nếu cần)
+    dietitians = User.query.filter_by(role='Dietitian').options(
+        joinedload(User.dietitian) # Sửa lại tên relationship từ dietitian_profile thành dietitian
+    ).all()
+
+    # Tính toán số bệnh nhân đang được gán cho mỗi dietitian
+    dietitian_patient_counts = dict(db.session.query(
+        User.userID, 
+        func.count(Patient.assigned_dietitian_user_id)
+    ).outerjoin(Patient, User.userID == Patient.assigned_dietitian_user_id)\
+     .filter(User.role == 'Dietitian')\
+     .group_by(User.userID).all()) # Chuyển kết quả thành dict
+
+    # Gán số lượng bệnh nhân vào đối tượng user của dietitian
+    for dt_user in dietitians:
+        dt_user.assigned_patients_count = dietitian_patient_counts.get(dt_user.userID, 0)
+    
+    # Sắp xếp danh sách dietitian theo số lượng bệnh nhân tăng dần
+    dietitians.sort(key=lambda dt: dt.assigned_patients_count)
     
     return render_template(
         'patient_detail.html',
         patient=patient,
         latest_measurement=latest_measurement,
-        # measurements=measurements, # Không cần truyền list measurements cũ nữa
         referrals=referrals,
         procedures=procedures,
         reports=reports,
-        encounters_data=display_encounters, # Truyền dữ liệu đã xử lý
-        latest_encounter=latest_encounter, # Truyền encounter mới nhất
-        EmptyForm=EmptyForm # Thêm dòng này để truyền EmptyForm
+        encounters_data=encounters_data, # Đổi tên biến để rõ ràng hơn
+        latest_encounter=latest_encounter,
+        EmptyForm=EmptyForm,
+        dietitians=dietitians,
+        PatientStatus=PatientStatus, # Truyền Enum PatientStatus
+        ReferralStatus=ReferralStatus # Truyền Enum ReferralStatus
     )
 
 @patients_bp.route('/new', methods=['GET', 'POST'])
@@ -278,12 +403,9 @@ def new_referral(patient_id):
         referral = Referral(
             patient_id=patient.id,
             referralRequestedDateTime=datetime.now(),
-            referral_source=request.form.get('referral_source', 'Manual Entry'),
-            reason=request.form.get('reason'),
+            notes=request.form.get('reason'),
             referral_status='new',
-            priority=int(request.form.get('priority', 3)),
             is_ml_recommended=False,
-            notes=request.form.get('notes')
         )
         
         db.session.add(referral)
@@ -684,8 +806,8 @@ def encounter_measurements(patient_id, encounter_id):
     # TODO: Xác định chỉ số bất ổn (logic phức tạp, tạm bỏ qua)
     unstable_metrics = [] 
 
-    # TODO: Xác định status encounter (logic phức tạp, dùng status hiện có)
-    encounter_status = encounter.status # Tạm dùng status có sẵn
+    # Sử dụng helper function để lấy status display
+    encounter_status_display = get_encounter_status_display(encounter.status)
 
     return render_template(
         'encounter_measurements.html', # Template mới sẽ tạo ở Bước 3
@@ -695,7 +817,7 @@ def encounter_measurements(patient_id, encounter_id):
         latest_measurement=latest_measurement,
         latest_bp=latest_bp,
         unstable_metrics=unstable_metrics,
-        encounter_status=encounter_status,
+        encounter_status=encounter_status_display, # Truyền dict status display
         EmptyForm=EmptyForm # Truyền class EmptyForm vào context
     )
 
@@ -703,51 +825,46 @@ def encounter_measurements(patient_id, encounter_id):
 @login_required
 @csrf.exempt # Giữ lại nếu bạn xử lý CSRF ở client-side
 def quick_save_encounter_measurement(patient_id, encounter_id):
-    """API endpoint để lưu nhanh một giá trị đo lường cho encounter cụ thể"""
+    """API endpoint để lưu nhanh một giá trị đo lường cho encounter cụ thể và chạy dự đoán ML."""
     try:
-        # Xác thực patient và encounter
         patient = Patient.query.get_or_404(patient_id)
-        encounter = Encounter.query.filter_by(encounterID=encounter_id, patient_id=patient_id).first_or_404()
-        
+        encounter = Encounter.query.filter_by(encounterID=encounter_id, patient_id=patient.id).first_or_404()
+
         data = request.get_json()
         if not data or 'values' not in data:
-            # ... (xử lý lỗi như cũ) ...
             return jsonify({'success': False, 'message': 'Dữ liệu không hợp lệ'}), 400
-            
+
         values_dict = data['values']
         current_app.logger.info(f"Quick save - Nhận dữ liệu cho patient {patient_id}, encounter {encounter_id}: {values_dict}")
 
-        # Tạo một đo lường mới với thời gian hiện tại
         measurement_time = datetime.now()
         new_measurement = PhysiologicalMeasurement(
             patient_id=patient.id,
-            encounter_id=encounter.encounterID, # Sử dụng encounterID được cung cấp
+            encounter_id=encounter.encounterID,
             measurementDateTime=measurement_time
         )
-        
-        # ... (Gán giá trị vào các trường tương ứng như cũ) ...
+
         field_map = {
             'temperature': ('temperature', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-            # ... (thêm các field map khác tương tự như trong hàm quick_save cũ) ...
-             'heart_rate': ('heart_rate', lambda key: int(values_dict.get(key)) if values_dict.get(key) else None),
-             'blood_pressure_systolic': ('blood_pressure_systolic', lambda key: int(values_dict.get(key)) if values_dict.get(key) else None),
-             'blood_pressure_diastolic': ('blood_pressure_diastolic', lambda key: int(values_dict.get(key)) if values_dict.get(key) else None),
-             'oxygen_saturation': ('oxygen_saturation', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'resp_rate': ('resp_rate', lambda key: int(values_dict.get(key)) if values_dict.get(key) else None), # Đổi tên field model nếu cần
-             'fio2': ('fio2', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'fio2_ratio': ('fio2_ratio', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'peep': ('peep', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'pip': ('pip', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'sip': ('sip', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'insp_time': ('insp_time', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'oxygen_flow_rate': ('oxygen_flow_rate', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'end_tidal_co2': ('end_tidal_co2', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'tidal_vol': ('tidal_vol', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'tidal_vol_kg': ('tidal_vol_kg', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'tidal_vol_actual': ('tidal_vol_actual', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'tidal_vol_spon': ('tidal_vol_spon', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'feed_vol': ('feed_vol', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
-             'feed_vol_adm': ('feed_vol_adm', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None)
+            'heart_rate': ('heart_rate', lambda key: int(values_dict.get(key)) if values_dict.get(key) else None),
+            'blood_pressure_systolic': ('blood_pressure_systolic', lambda key: int(values_dict.get(key)) if values_dict.get(key) else None),
+            'blood_pressure_diastolic': ('blood_pressure_diastolic', lambda key: int(values_dict.get(key)) if values_dict.get(key) else None),
+            'oxygen_saturation': ('oxygen_saturation', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'resp_rate': ('resp_rate', lambda key: int(values_dict.get(key)) if values_dict.get(key) else None),
+            'fio2': ('fio2', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'fio2_ratio': ('fio2_ratio', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'peep': ('peep', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'pip': ('pip', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'sip': ('sip', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'insp_time': ('insp_time', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'oxygen_flow_rate': ('oxygen_flow_rate', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'end_tidal_co2': ('end_tidal_co2', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'tidal_vol': ('tidal_vol', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'tidal_vol_kg': ('tidal_vol_kg', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'tidal_vol_actual': ('tidal_vol_actual', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'tidal_vol_spon': ('tidal_vol_spon', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'feed_vol': ('feed_vol', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None),
+            'feed_vol_adm': ('feed_vol_adm', lambda key: float(values_dict.get(key)) if values_dict.get(key) else None)
         }
         for key in values_dict:
             if key in field_map:
@@ -755,9 +872,9 @@ def quick_save_encounter_measurement(patient_id, encounter_id):
                 setattr(new_measurement, field_name, conversion_func(key))
 
         db.session.add(new_measurement)
-        db.session.commit()
-        
-        # ... (Chuẩn bị và trả về dữ liệu như cũ) ...
+        db.session.commit() # Commit phép đo mới trước khi chạy ML
+
+        # Chuẩn bị dữ liệu trả về
         returned_data = {}
         for key in values_dict.keys():
             if key in field_map:
@@ -765,17 +882,16 @@ def quick_save_encounter_measurement(patient_id, encounter_id):
                 value = getattr(new_measurement, field_name)
                 returned_data[key] = value
         returned_data['measurementDateTime'] = measurement_time.isoformat()
-        
+
         current_app.logger.info(f"Quick save - Đã lưu thành công cho patient {patient_id}, encounter {encounter_id}: {returned_data}")
         return jsonify({
-            'success': True, 
-            'message': 'Đã lưu thành công',
+            'success': True,
+            'message': 'Đã lưu thành công.',
             'new_measurement_data': returned_data
         })
-        
+
     except Exception as e:
-        # ... (Xử lý lỗi như cũ) ...
-        current_app.logger.error(f"Lỗi khi lưu đo lường nhanh cho patient {patient_id}, encounter {encounter_id}. Data: {request.data}. Lỗi: {str(e)}", exc_info=True)
+        current_app.logger.error(f"Lỗi khi lưu đo lường nhanh cho patient {patient_id}, encounter {encounter_id}. Data: {request.data}. Lỗi: {str(e)}", exc_info=True) # Cập nhật log error
         db.session.rollback()
         return jsonify({'success': False, 'message': f'Lỗi máy chủ: {str(e)}'}), 500
 
@@ -849,11 +965,13 @@ def get_encounter_measurement_data(patient_id, encounter_id):
 
 @patients_bp.route('/<string:patient_id>/encounter/<int:encounter_id>/upload_measurements', methods=['POST'])
 @login_required
-@csrf.exempt # Tạm thời bỏ qua CSRF check cho route upload file này
+@csrf.exempt
 def upload_encounter_measurements_csv(patient_id, encounter_id):
-    patient = Patient.query.filter_by(id=patient_id).first_or_404()
+    patient = Patient.query.get_or_404(patient_id)
     encounter = Encounter.query.filter_by(encounterID=encounter_id, patient_id=patient.id).first_or_404()
 
+    # --- BỎ PHẦN LOAD MODEL Ở ĐÂY --- 
+
     if 'csv_file' not in request.files:
         flash('Không tìm thấy file CSV trong yêu cầu.', 'danger')
         return redirect(url_for('patients.encounter_measurements', patient_id=patient_id, encounter_id=encounter_id))
@@ -866,24 +984,30 @@ def upload_encounter_measurements_csv(patient_id, encounter_id):
 
     if file and file.filename.endswith('.csv'):
         try:
-            # Gọi hàm xử lý CSV từ utils - Sửa lại encounter.id thành encounter.encounterID
-            # Hàm giờ trả về (success, (message, category)) hoặc (False, error_message)
-            success, result_data = process_encounter_measurements_csv(file, patient.id, encounter.encounterID)
-            
+            # Gọi hàm xử lý CSV từ utils
+            # Lưu ý: file bây giờ là stream, không phải path
+            success, result_data = process_encounter_measurements_csv(file.stream, patient.id, encounter.encounterID)
+
             if success:
                 message, category = result_data # Unpack message và category
-                flash(message, category) # Flash với category tương ứng
+                # --- Bỏ phần GỌI HÀM DỰ ĐOÁN ML và logic liên quan --- 
+                # ml_prediction_message = ""
+                # ml_needs_intervention = None
+                # ml_needs_intervention, ml_message = _run_ml_prediction(encounter)
+                # ... (toàn bộ khối if ml_needs_intervention is not None ...)
+                # --- Kết thúc phần ML --- 
+
+                flash(f"{message}", category) # Chỉ flash message từ xử lý CSV
             else:
-                # result_data lúc này là error_message
+                # Xử lý lỗi từ process_encounter_measurements_csv
                 flash(result_data, 'danger') 
         except Exception as e:
-            current_app.logger.error(f"Lỗi khi xử lý file CSV cho encounter {encounter_id}: {e}", exc_info=True) # Thêm exc_info=True để log traceback
-            flash(f'Đã xảy ra lỗi không mong muốn khi xử lý file: {str(e)}', 'danger')
-            # db.session.rollback() # Rollback nên được xử lý trong hàm process_csv
+            db.session.rollback() # Đảm bảo rollback nếu có lỗi không mong muốn trong route
+            current_app.logger.error(f"Lỗi khi xử lý file CSV cho encounter {encounter_id}: {e}", exc_info=True) # Sửa log error
+            flash(f'Đã xảy ra lỗi không mong muốn: {str(e)}', 'danger')
     else:
         flash('Định dạng file không hợp lệ. Vui lòng tải lên file .csv.', 'warning')
 
-    # Chuyển hướng về trang chi tiết encounter sau khi xử lý
     return redirect(url_for('patients.encounter_measurements', patient_id=patient_id, encounter_id=encounter_id))
 
 @patients_bp.route('/<string:patient_id>/encounters/new', methods=['POST'])
@@ -913,7 +1037,7 @@ def new_encounter(patient_id):
         encounter = Encounter(
             patient_id=patient.id,
             start_time=datetime.utcnow(),
-            status='Active', # Initial status
+            status=EncounterStatus.NOT_STARTED, # Thay đổi từ ACTIVE (không tồn tại) thành NOT_STARTED
             custom_encounter_id=custom_id # Gán ID tùy chỉnh
         )
         db.session.add(encounter)
@@ -956,6 +1080,37 @@ def delete_encounter(patient_id, encounter_pk):
 
         # Xóa encounter (và measurements do cascade)
         db.session.delete(encounter)
+        
+        # Sau khi xóa encounter, cập nhật lại trạng thái bệnh nhân
+        # Kiểm tra có còn encounter nào cần assessment không
+        needs_assessment_encounter = Encounter.query.filter_by(
+            patient_id=patient.id,
+            needs_intervention=True
+        ).first()
+        
+        # Kiểm tra có referral nào đang chờ xử lý không
+        pending_referral = Referral.query.filter_by(
+            patient_id=patient.id,
+            referral_status=ReferralStatus.DIETITIAN_UNASSIGNED
+        ).first()
+        
+        if needs_assessment_encounter or pending_referral:
+            # Vẫn còn encounter cần assessment hoặc referral đang chờ
+            if patient.status != PatientStatus.NEEDS_ASSESSMENT:
+                patient.status = PatientStatus.NEEDS_ASSESSMENT
+                flash('Patient status updated to NEEDS_ASSESSMENT based on remaining encounters/referrals.', 'info')
+        else:
+            # Kiểm tra nếu có dietitian được gán
+            if patient.assigned_dietitian_user_id:
+                if patient.status != PatientStatus.ASSESSMENT_IN_PROGRESS:
+                    patient.status = PatientStatus.ASSESSMENT_IN_PROGRESS
+                    flash('Patient status updated to ASSESSMENT_IN_PROGRESS as dietitian is assigned.', 'info')
+            else:
+                # Không còn encounter nào cần assessment và không có dietitian
+                if patient.status != PatientStatus.NOT_ASSESSED:
+                    patient.status = PatientStatus.NOT_ASSESSED
+                    flash('Patient status updated to NOT_ASSESSED as no assessment needed.', 'info')
+        
         db.session.commit()
         flash(f'Encounter {custom_id_for_flash} deleted successfully.', 'success')
     except Exception as e:
@@ -964,3 +1119,298 @@ def delete_encounter(patient_id, encounter_pk):
         flash(f'Error deleting encounter: {str(e)}', 'error')
 
     return redirect(url_for('patients.patient_detail', patient_id=patient.id, _anchor='encounters'))
+
+# --- Route mới để chạy ML Prediction --- 
+@patients_bp.route('/<string:patient_id>/encounter/<int:encounter_id>/run_ml', methods=['POST'])
+@login_required
+def run_encounter_ml(patient_id, encounter_id):
+    """Chạy dự đoán ML cho encounter và cập nhật trạng thái theo quy trình mới."""
+    patient = Patient.query.get_or_404(patient_id)
+    encounter = Encounter.query.filter_by(encounterID=encounter_id, patient_id=patient.id).first_or_404()
+    form = EmptyForm() # Sử dụng form rỗng để validate CSRF
+
+    if not form.validate_on_submit():
+        flash('Invalid CSRF token. Please try again.', 'danger')
+        return redirect(url_for('patients.encounter_measurements', patient_id=patient_id, encounter_id=encounter_id))
+
+    try:
+        # Gọi hàm helper để chạy dự đoán
+        ml_needs_intervention, ml_message = _run_ml_prediction(encounter)
+
+        if ml_needs_intervention is not None:
+            # Cập nhật trạng thái ML của encounter
+            encounter.needs_intervention = ml_needs_intervention
+            flash(f"Kết quả dự đoán ML: {ml_message}", 'info') # Thông báo kết quả ML
+
+            if ml_needs_intervention:
+                # --- Xử lý khi ML dự đoán CẦN can thiệp ---
+                patient.status = PatientStatus.NEEDS_ASSESSMENT
+                encounter.status = EncounterStatus.NOT_STARTED
+                flash(f"Trạng thái bệnh nhân cập nhật: {PatientStatus.NEEDS_ASSESSMENT.value}", 'warning')
+                flash(f"Trạng thái lượt khám cập nhật: {EncounterStatus.NOT_STARTED.value}", 'warning')
+
+                # Tìm hoặc tạo Referral mới
+                existing_referral = Referral.query.filter(
+                    Referral.encounter_id == encounter.encounterID
+                    # Referral.referral_status != ReferralStatus.COMPLETED # Chỉ tìm referral chưa hoàn thành?
+                ).first()
+
+                if not existing_referral:
+                    try:
+                        if not current_user.is_authenticated:
+                            raise ValueError("User not authenticated, cannot create referral.")
+
+                        new_referral = Referral(
+                            patient_id=patient.id,
+                            encounter_id=encounter.encounterID,
+                            referralRequestedDateTime=datetime.utcnow(),
+                            notes='Automated referral based on ML prediction.',
+                            referral_status=ReferralStatus.DIETITIAN_UNASSIGNED,
+                            is_ml_recommended=True,
+                        )
+                        db.session.add(new_referral)
+                        # Không commit ở đây, commit chung ở cuối
+                        flash("Đã tự động tạo yêu cầu đánh giá mới (Referral).", 'success')
+                        current_app.logger.info(f"Created new ML-based referral (DIETITIAN_UNASSIGNED) for encounter {encounter_id}")
+                    except Exception as ref_e:
+                        db.session.rollback() # Rollback nếu tạo referral lỗi
+                        error_message = f"Lỗi khi tự động tạo Referral cho encounter {encounter_id}: {str(ref_e)}"
+                        current_app.logger.error(error_message, exc_info=True)
+                        flash(f"Lỗi khi tạo Referral: {str(ref_e)} ({type(ref_e).__name__})", 'danger') # Thêm type lỗi
+                        # Vẫn tiếp tục commit trạng thái patient/encounter nếu không tạo được referral?
+                        # Hoặc return redirect ở đây để tránh commit trạng thái sai?
+                        # Quyết định: return redirect để tránh trạng thái không nhất quán
+                        return redirect(url_for('patients.encounter_measurements', patient_id=patient_id, encounter_id=encounter_id))
+                elif existing_referral.referral_status != ReferralStatus.DIETITIAN_UNASSIGNED:
+                    # Nếu referral đã tồn tại nhưng không phải trạng thái chờ gán -> cập nhật
+                    existing_referral.referral_status = ReferralStatus.DIETITIAN_UNASSIGNED
+                    existing_referral.is_ml_recommended = True # Đánh dấu lại là ML rec
+                    existing_referral.notes = f"(ML Re-evaluation) {existing_referral.notes or ''}".strip()
+                    flash("Đã cập nhật trạng thái yêu cầu đánh giá hiện có thành 'Chờ gán chuyên gia'.", 'warning')
+                    current_app.logger.info(f"Updated existing referral for encounter {encounter_id} to DIETITIAN_UNASSIGNED due to ML re-evaluation.")
+                else:
+                    # Referral đã tồn tại và đang ở trạng thái chờ gán
+                    flash("Yêu cầu đánh giá (Referral) đang chờ gán chuyên gia.", 'info')
+
+            else:
+                # --- Xử lý khi ML dự đoán KHÔNG CẦN can thiệp ---
+                patient.status = PatientStatus.COMPLETED
+                encounter.status = EncounterStatus.FINISHED
+                flash(f"Trạng thái bệnh nhân cập nhật: {PatientStatus.COMPLETED.value}", 'info')
+                flash(f"Trạng thái lượt khám cập nhật: {EncounterStatus.FINISHED.value}", 'info')
+                
+                # Tùy chọn: Cập nhật/xóa Referral liên quan nếu có?
+                # Ví dụ: Tìm referral đang chờ và đánh dấu là không cần nữa
+                # existing_referral = Referral.query.filter(...).first()
+                # if existing_referral:
+                #     existing_referral.referral_status = None # Hoặc một trạng thái mới 'NOT_REQUIRED'
+                #     flash("Đã cập nhật yêu cầu đánh giá thành không cần thiết.", 'info')
+
+            # Commit tất cả thay đổi vào DB
+            db.session.commit()
+
+        else:
+            # Nếu _run_ml_prediction trả về lỗi
+            db.session.rollback() # Rollback nếu có lỗi trong quá trình dự đoán
+            flash(f"Lỗi khi chạy dự đoán ML: {ml_message}", 'danger')
+
+    except Exception as e:
+        db.session.rollback()
+        current_app.logger.error(f"Lỗi không xác định khi chạy ML cho encounter {encounter_id}: {e}", exc_info=True)
+        flash(f"Đã xảy ra lỗi không mong muốn khi chạy ML: {str(e)}", 'danger')
+
+    return redirect(url_for('patients.encounter_measurements', patient_id=patient_id, encounter_id=encounter_id))
+# --- Kết thúc Route mới --- 
+
+# Route mới để xóa bệnh nhân
+@patients_bp.route('/<string:patient_id>/delete', methods=['POST'])
+@login_required
+def delete_patient(patient_id):
+    patient = Patient.query.get_or_404(patient_id)
+    form = EmptyForm() # Dùng để validate CSRF
+
+    if form.validate_on_submit():
+        try:
+            # Cần xem xét kỹ việc xóa cascade hoặc xóa thủ công các bản ghi liên quan
+            # Ví dụ: Xóa encounters, measurements, referrals, etc.
+            # Hiện tại chỉ xóa patient, CẦN ĐIỀU CHỈNH logic xóa liên quan nếu cần
+            
+            # Lấy tên bệnh nhân để hiển thị thông báo
+            patient_name = patient.full_name
+            
+            # Xóa các bản ghi liên quan trước (VÍ DỤ - cần kiểm tra model relationships)
+            # Referral.query.filter_by(patient_id=patient.id).delete()
+            # Report.query.filter_by(patient_id=patient.id).delete()
+            # Procedure.query.filter_by(patient_id=patient.id).delete()
+            # PhysiologicalMeasurement.query.filter_by(patient_id=patient.id).delete()
+            # Encounter.query.filter_by(patient_id=patient.id).delete()
+            # # Lưu ý: Thứ tự xóa quan trọng nếu có foreign key constraints
+            
+            db.session.delete(patient)
+            db.session.commit()
+            flash(f'Patient {patient_name} (ID: {patient_id}) has been deleted successfully.', 'success')
+            return redirect(url_for('patients.index'))
+        except Exception as e:
+            db.session.rollback()
+            current_app.logger.error(f"Error deleting patient {patient_id}: {str(e)}", exc_info=True)
+            flash(f'Error deleting patient: {str(e)}', 'danger')
+            # Redirect về trang chi tiết nếu xóa lỗi
+            return redirect(url_for('patients.patient_detail', patient_id=patient_id))
+    else:
+        # Lỗi CSRF hoặc lỗi form khác
+        flash('Invalid request. Could not delete patient.', 'danger')
+        return redirect(url_for('patients.index'))
+
+# Route mới để gán Dietitian
+@patients_bp.route('/<string:patient_id>/assign_dietitian', methods=['POST'])
+@login_required
+def assign_dietitian(patient_id):
+    form = EmptyForm()
+    if form.validate_on_submit():
+        patient = Patient.query.filter_by(id=patient_id).first_or_404()
+
+        # Kiểm tra trạng thái bệnh nhân có phù hợp để gán không
+        if patient.status != PatientStatus.NEEDS_ASSESSMENT:
+            flash(f'Bệnh nhân không ở trạng thái "{PatientStatus.NEEDS_ASSESSMENT.value}" để gán chuyên gia.', 'warning')
+            return redirect(url_for('patients.patient_detail', patient_id=patient_id))
+
+        assignment_type = request.form.get("assignment_type", "manual")
+        dietitian = None
+
+        if assignment_type == "auto":
+            # Tự động gán cho dietitian có ít bệnh nhân nhất
+            # Query Users with Dietitian role and count their assigned patients
+            dietitians_with_counts = db.session.query(
+                User,
+                func.count(Patient.assigned_dietitian_user_id).label('patient_count')
+            ).outerjoin(Patient, User.userID == Patient.assigned_dietitian_user_id)\
+             .filter(User.role == 'Dietitian')\
+             .group_by(User.userID)\
+             .order_by(func.count(Patient.assigned_dietitian_user_id))\
+             .all()
+
+            if not dietitians_with_counts:
+                flash("Không tìm thấy chuyên gia dinh dưỡng nào trong hệ thống.", "error")
+                return redirect(url_for("patients.patient_detail", patient_id=patient_id))
+
+            # Chọn dietitian đầu tiên (có ít bệnh nhân nhất)
+            dietitian = dietitians_with_counts[0][0] # Lấy đối tượng User
+        else:
+            # Gán thủ công
+            dietitian_id = request.form.get("dietitian_id")
+            if not dietitian_id:
+                flash("Vui lòng chọn một chuyên gia dinh dưỡng.", "error")
+                return redirect(url_for("patients.patient_detail", patient_id=patient_id))
+
+            dietitian = User.query.get(dietitian_id)
+            if not dietitian or dietitian.role != 'Dietitian': # Kiểm tra cả role
+                flash("Chuyên gia dinh dưỡng không hợp lệ.", "error")
+                return redirect(url_for("patients.patient_detail", patient_id=patient_id))
+        
+        notes = request.form.get("notes", "")
+        
+        if patient.assigned_dietitian_user_id != dietitian.userID:
+            try:
+                # Tìm encounter gần nhất đang ở trạng thái NOT_STARTED
+                encounter_to_update = Encounter.query.filter_by(
+                    patient_id=patient.id,
+                    status=EncounterStatus.NOT_STARTED
+                ).order_by(desc(Encounter.start_time)).first()
+
+                if not encounter_to_update:
+                    flash(f'Không tìm thấy lượt khám (encounter) phù hợp ở trạng thái "{EncounterStatus.NOT_STARTED.value}".', 'error')
+                    return redirect(url_for('patients.patient_detail', patient_id=patient_id))
+
+                # Tìm referral gần nhất đang ở trạng thái DIETITIAN_UNASSIGNED (nên thuộc encounter trên)
+                referral_to_update = Referral.query.filter_by(
+                    patient_id=patient.id,
+                    encounter_id=encounter_to_update.encounterID, # Chỉ tìm referral của encounter này
+                    referral_status=ReferralStatus.DIETITIAN_UNASSIGNED
+                ).order_by(desc(Referral.referralRequestedDateTime)).first()
+
+                if not referral_to_update:
+                    # Nếu không tìm thấy referral chờ gán cho encounter này, có thể tạo mới?
+                    # Hoặc báo lỗi vì quy trình không đúng?
+                    # Hiện tại: Báo lỗi để đảm bảo quy trình ML -> Referral -> Assign
+                    flash(f'Không tìm thấy yêu cầu đánh giá (referral) đang chờ gán cho lượt khám {encounter_to_update.custom_encounter_id or encounter_to_update.encounterID}.', 'error')
+                    return redirect(url_for('patients.patient_detail', patient_id=patient_id))
+
+                # --- Bắt đầu cập nhật --- 
+                old_dietitian_id = patient.assigned_dietitian_user_id
+
+                # 1. Cập nhật Patient
+                patient.assigned_dietitian_user_id = dietitian.userID
+                patient.assignment_date = datetime.utcnow()
+                patient.status = PatientStatus.ASSESSMENT_IN_PROGRESS
+
+                # 2. Cập nhật Encounter
+                encounter_to_update.status = EncounterStatus.ON_GOING
+                # Gán dietitian cho encounter luôn? (Có thể cần thiết nếu report/logic khác dựa vào đây)
+                encounter_to_update.dietitian_id = dietitian.userID 
+
+                # 3. Cập nhật Referral
+                referral_to_update.referral_status = ReferralStatus.WAITING_FOR_REPORT
+                referral_to_update.assigned_dietitian_user_id = dietitian.userID # Gán dietitian cho referral
+
+                # 4. Tạo Report mới
+                new_report = Report(
+                    patient_id=patient.id,
+                    encounter_id=encounter_to_update.encounterID,
+                    dietitian_id=dietitian.userID, # Lưu ID của dietitian tạo report
+                    author_id=current_user.userID, # Người tạo report là người đang phân công
+                    report_date=datetime.utcnow(),
+                    report_type='initial_assessment', # Thêm loại báo cáo
+                    status='Pending' # Trạng thái ban đầu của report
+                    # Thêm các trường mặc định khác nếu cần
+                )
+                db.session.add(new_report)
+                current_app.logger.info(f"Created new Report (ID: will be assigned on commit) for encounter {encounter_to_update.encounterID}")
+
+                # 5. Log hoạt động
+                activity_details = f"Patient ID: {patient.id}, Encounter ID: {encounter_to_update.encounterID}"
+                if notes:
+                    activity_details += f"\nAssignment Notes: {notes}"
+                action_message = f"Assigned dietitian {dietitian.full_name} to patient {patient.full_name}"
+                if assignment_type == "auto":
+                    action_message = f"AUTO-Assigned dietitian {dietitian.full_name} to patient {patient.full_name}"
+                
+                activity = ActivityLog(
+                    user_id=current_user.userID,
+                    action=action_message,
+                    details=activity_details
+                )
+                db.session.add(activity)
+
+                # 6. Thông báo cho dietitian mới
+                notification = Notification(
+                    user_id=dietitian.userID,
+                    message=f"Bạn đã được gán cho bệnh nhân {patient.full_name} (ID: {patient.id}) cho lượt khám {encounter_to_update.custom_encounter_id or encounter_to_update.encounterID}. Vui lòng hoàn thành báo cáo đánh giá.",
+                    is_read=False,
+                    link=url_for("patients.patient_detail", patient_id=patient.id) # Link đến patient detail hoặc trang report?
+                )
+                db.session.add(notification)
+
+                # 7. Commit tất cả thay đổi
+                db.session.commit()
+
+                flash_message = f"Đã gán bệnh nhân cho chuyên gia {dietitian.full_name}. Trạng thái cập nhật thành '{PatientStatus.ASSESSMENT_IN_PROGRESS.value}'. Báo cáo mới đã được tạo."
+                if assignment_type == "auto":
+                     flash_message = f"Đã TỰ ĐỘNG gán bệnh nhân cho chuyên gia {dietitian.full_name}. Trạng thái cập nhật thành '{PatientStatus.ASSESSMENT_IN_PROGRESS.value}'. Báo cáo mới đã được tạo."
+                flash(flash_message, "success")
+
+            except Exception as e:
+                db.session.rollback()
+                current_app.logger.error(f"Lỗi khi gán dietitian và cập nhật trạng thái: {str(e)}", exc_info=True)
+                flash(f"Đã xảy ra lỗi khi gán chuyên gia dinh dưỡng: {str(e)}", "error")
+        else:
+            flash(f"Bệnh nhân đã được gán cho chuyên gia {dietitian.full_name} rồi.", "info")
+
+        return redirect(url_for("patients.patient_detail", patient_id=patient_id))
+
+    # Nếu form không validate (ví dụ CSRF lỗi) - Đảm bảo thụt lề đúng ở đây
+    flash('Yêu cầu không hợp lệ.', 'danger')
+    patient_id_from_url = request.view_args.get('patient_id') # Lấy patient_id từ URL
+    if patient_id_from_url:
+        return redirect(url_for("patients.patient_detail", patient_id=patient_id_from_url))
+    else:
+        return redirect(url_for("main.handle_root")) # Fallback về trang chủ nếu không lấy được patient_id
diff --git a/app/routes/report.py b/app/routes/report.py
index 3780bacc87b5576eb623ed9d5119b7459dcec38b..30c692e39dbb03500ddd60c110977a6ad9829bd6 100644
--- a/app/routes/report.py
+++ b/app/routes/report.py
@@ -1,4 +1,4 @@
-from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify, send_file
+from flask import Blueprint, render_template, request, redirect, url_for, flash, jsonify, send_file, current_app
 from flask_login import login_required, current_user
 from app import db
 from app.models.report import Report
@@ -7,17 +7,26 @@ from app.models.referral import Referral
 from app.models.procedure import Procedure
 from app.models.measurement import PhysiologicalMeasurement
 from app.models.user import User
+from app.models.dietitian import Dietitian
 from app.utils.report_generator import generate_report, generate_excel_report
 from sqlalchemy import func, desc, case
+from sqlalchemy.orm import joinedload, aliased
 from datetime import datetime, timedelta
 import tempfile
 import os
 import io
 from app.forms.report import ReportForm
-from sqlalchemy.orm import joinedload
+from app.models.patient import PatientStatus
+from app.models.encounter import Encounter, EncounterStatus
+from app.models.referral import ReferralStatus
+from flask_wtf import FlaskForm
 
 report_bp = Blueprint('report', __name__, url_prefix='/reports')
 
+# Thêm EmptyForm để xử lý CSRF
+class EmptyForm(FlaskForm):
+    pass
+
 @report_bp.route('/')
 @login_required
 def index():
@@ -25,79 +34,154 @@ def index():
     page = request.args.get('page', 1, type=int)
     per_page = request.args.get('per_page', 10, type=int)
     
+    # Lấy các tham số filter từ request
+    report_type_filter = request.args.get('report_type')
+    status_filter = request.args.get('status')
+    # Chỉ Admin mới có filter dietitian
+    dietitian_filter_id = request.args.get('dietitian_id', type=int) if current_user.is_admin else None
+
+    # Start base query
+    # Alias User model để join author và dietitian riêng biệt
+    Author = aliased(User)
+    AssignedDietitian = aliased(User)
     query = Report.query.join(Patient, Report.patient_id == Patient.id)\
-                        .join(User, Report.author_id == User.userID)
-    
-    # Apply filters if provided
-    report_type = request.args.get('type')
-    if report_type:
-        query = query.filter(Report.report_type == report_type)
-    
-    status = request.args.get('status')
-    if status:
-        query = query.filter(Report.status == status)
+                        .join(Author, Report.author_id == Author.userID)\
+                        .outerjoin(AssignedDietitian, Report.dietitian_id == AssignedDietitian.userID) # outerjoin vì dietitian_id có thể null
+    
+    # Lọc theo dietitian hiện tại nếu user là Dietitian
+    if current_user.role == 'Dietitian':
+        query = query.filter(Report.author_id == current_user.userID)
+    # Lọc theo dietitian được chọn nếu user là Admin và có filter
+    elif current_user.is_admin and dietitian_filter_id:
+        query = query.filter(Report.author_id == dietitian_filter_id)
+
+    # Apply other filters
+    if report_type_filter:
+        query = query.filter(Report.report_type == report_type_filter)
+    if status_filter:
+        query = query.filter(Report.status == status_filter)
     
     # Order by created_at descending
     query = query.order_by(Report.report_date.desc())
     
-    # Paginate the results
-    reports = query.options(joinedload(Report.patient), joinedload(Report.author))\
-                   .paginate(page=page, per_page=per_page)
+    # Paginate the results, load relationships
+    reports = query.options(joinedload(Report.patient), joinedload(Report.author), joinedload(Report.dietitian))\
+                   .paginate(page=page, per_page=per_page, error_out=False)
     
-    # Sử dụng danh sách cứng thay vì truy vấn
-    report_types = [('nutrition_assessment', 'Đánh giá dinh dưỡng')]
-    report_statuses = db.session.query(Report.status).distinct().all()
-    
-    # Create stats for charts
-    end_date = datetime.now()
-    start_date = end_date.replace(day=1, hour=0, minute=0, second=0, microsecond=0)  # First day of current month
+    # --- Dữ liệu cho Filters --- 
+    report_types_choices = [('initial_assessment', 'Initial Assessment'), ('follow_up', 'Follow-up'), ('discharge', 'Discharge'), ('consultation', 'Consultation')]
+    report_statuses_choices = [('Draft', 'Draft'), ('Pending', 'Pending'), ('Completed', 'Completed')] # Sử dụng giá trị thực tế
     
+    # Lấy danh sách dietitian cho Admin filter
+    dietitians_for_filter = []
+    if current_user.is_admin:
+        dietitians_for_filter = User.query.filter_by(role='Dietitian').order_by(User.lastName, User.firstName).all()
+
+    # --- Dữ liệu cho Stats và Charts --- 
+    # Tạo query cơ sở cho stats, áp dụng các filter tương tự query chính
+    base_stats_query = Report.query
+    if current_user.role == 'Dietitian':
+        base_stats_query = base_stats_query.filter(Report.author_id == current_user.userID)
+    elif current_user.is_admin and dietitian_filter_id:
+        base_stats_query = base_stats_query.filter(Report.author_id == dietitian_filter_id)
+        
+    if report_type_filter:
+        base_stats_query = base_stats_query.filter(Report.report_type == report_type_filter)
+    if status_filter:
+        base_stats_query = base_stats_query.filter(Report.status == status_filter)
+
+    # Clone query để tính các stats cụ thể
     stats = {
-        'total': Report.query.count(),
-        'this_month': Report.query.filter(Report.report_date >= start_date).count(),
-        'draft': Report.query.filter(Report.status == 'draft').count(),
-        'initial_assessment': Report.query.filter(Report.report_type == 'initial_assessment').count(),
-        'follow_up': Report.query.filter(Report.report_type == 'follow_up').count(),
-        'discharge': Report.query.filter(Report.report_type == 'discharge').count(),
-        'consultation': Report.query.filter(Report.report_type == 'consultation').count(),
-        'progress': Report.query.filter(Report.report_type == 'progress').count()
+        'total': base_stats_query.count(),
+        'draft': base_stats_query.filter(Report.status == 'Draft').count(),
+        'pending': base_stats_query.filter(Report.status == 'Pending').count(),
+        'completed': base_stats_query.filter(Report.status == 'Completed').count(),
+        # Thêm các loại report nếu cần hiển thị stats riêng
+        'initial_assessment': base_stats_query.filter(Report.report_type == 'initial_assessment').count(), 
+        'follow_up': base_stats_query.filter(Report.report_type == 'follow_up').count(), 
+        # ... thêm các loại khác
     }
     
+    # Dữ liệu biểu đồ phân phối loại report (áp dụng filter)
+    report_type_distribution = base_stats_query \
+        .with_entities(Report.report_type, func.count(Report.id)) \
+        .group_by(Report.report_type) \
+        .all()
+    report_type_chart_data = {
+        'labels': [r[0].replace('_', ' ').title() for r in report_type_distribution],
+        'data': [r[1] for r in report_type_distribution]
+    }
+
+    # Dữ liệu biểu đồ đóng góp của Dietitian (chỉ cho Admin)
+    dietitian_contribution_chart_data = None
+    if current_user.is_admin:
+        # Query này cần áp dụng filter type/status, nhưng KHÔNG filter dietitian
+        admin_base_stats_query = Report.query 
+        if report_type_filter:
+            admin_base_stats_query = admin_base_stats_query.filter(Report.report_type == report_type_filter)
+        if status_filter:
+            admin_base_stats_query = admin_base_stats_query.filter(Report.status == status_filter)
+
+        dietitian_contributions = admin_base_stats_query \
+            .join(Author, Report.author_id == Author.userID) \
+            .filter(Author.role == 'Dietitian') \
+            .with_entities(Author.userID, Author.lastName, Author.firstName, func.count(Report.id)) \
+            .group_by(Author.userID, Author.lastName, Author.firstName) \
+            .order_by(func.count(Report.id).desc()) \
+            .all()
+            
+        dietitian_contribution_chart_data = {
+            'labels': [f"{d.lastName}, {d.firstName}" for d in dietitian_contributions],
+            'data': [d[3] for d in dietitian_contributions]
+        }
+
     return render_template(
         'report.html',
         reports=reports,
-        current_page=page,
-        per_page=per_page,
-        report_types=report_types,
-        report_statuses=report_statuses,
-        stats=stats
+        report_types_choices=report_types_choices,
+        report_statuses_choices=report_statuses_choices,
+        dietitians_for_filter=dietitians_for_filter, # Cho Admin
+        selected_report_type=report_type_filter,
+        selected_status=status_filter,
+        selected_dietitian_id=dietitian_filter_id, # Cho Admin
+        stats=stats,
+        report_type_chart_data=report_type_chart_data,
+        dietitian_contribution_chart_data=dietitian_contribution_chart_data # Cho Admin
     )
 
 @report_bp.route('/new', methods=['GET', 'POST'])
 @login_required
 def new_report():
-    form = ReportForm()
-    # Lấy prefill_patient_id từ args cho GET, hoặc từ form data cho POST (nếu user chọn lại)
-    # Ưu tiên lấy từ args nếu là GET, hoặc khi POST thất bại và muốn giữ giá trị ban đầu
+    # Lấy prefill_patient_id từ args cho GET
     prefill_patient_id = request.args.get('patient_id') if request.method == 'GET' else None
-    patient_id_from_form = form.patient_id.data # Lấy giá trị từ form (có thể rỗng)
+    # Khởi tạo form, truyền patient_id nếu có để load procedure choices
+    form = ReportForm(patient_id=prefill_patient_id)
+    
+    patient_id_from_form = form.patient_id.data # Lấy giá trị từ form sau submit
 
+    # Populate patient choices (luôn làm điều này)
     form.patient_id.choices = [(p.id, f"{p.full_name} ({p.id})") for p in Patient.query.order_by(Patient.lastName, Patient.firstName).all()]
     form.patient_id.choices.insert(0, ('', '-- Select Patient --'))
+    # Nếu có prefill_patient_id, đặt nó làm giá trị mặc định cho dropdown
+    if prefill_patient_id:
+        form.patient_id.data = prefill_patient_id
+        # Cập nhật lại procedure choices nếu patient đã được chọn sẵn
+        form.__init__(patient_id=prefill_patient_id) # Gọi lại init để load procedure
 
     if form.validate_on_submit():
         print("--- Report form validation PASSED ---")
-        # patient_id_from_form đã được validate ở đây là hợp lệ
-        patient = Patient.query.get(patient_id_from_form) 
-        # Kiểm tra lại patient để chắc chắn (dù validate đã làm)
+        # Lấy patient_id từ form đã validate
+        validated_patient_id = form.patient_id.data
+        patient = Patient.query.get(validated_patient_id)
+        
         if not patient: 
              flash('Invalid Patient ID submitted.', 'error')
-             # Load lại choices
+             # Re-populate patient choices
              form.patient_id.choices = [(p.id, f"{p.full_name} ({p.id})") for p in Patient.query.order_by(Patient.lastName, Patient.firstName).all()]
              form.patient_id.choices.insert(0, ('', '-- Select Patient --'))
-             # Cố gắng giữ lại patient_id nếu có thể
-             current_patient_id = patient_id_from_form or prefill_patient_id
-             return render_template('report_form.html', form=form, report=None, edit_mode=False, prefill_patient_id=current_patient_id)
+             # Cần load lại procedure choices dựa trên patient_id đã chọn (nếu có)
+             form.__init__(patient_id=validated_patient_id) 
+             return render_template('report_form.html', form=form, report=None, edit_mode=False)
 
         print(f"--- Creating report for patient: {patient.id} ---")
         report = Report(
@@ -120,7 +204,8 @@ def new_report():
              follow_up_needed=form.follow_up_needed.data,
              follow_up_date=form.follow_up_date.data,
              status=form.status.data,
-             notes=form.notes.data
+             notes=form.notes.data,
+             related_procedure_id=form.related_procedure_id.data or None # Lưu procedure ID
         )
         
         if form.referral_id.data:
@@ -181,16 +266,37 @@ def view_report(report_id):
 @report_bp.route('/<int:report_id>/edit', methods=['GET', 'POST'])
 @login_required
 def edit_report(report_id):
-    report = Report.query.options(joinedload(Report.patient)).get_or_404(report_id)
-    form = ReportForm(obj=report) # Load dữ liệu từ report vào form
+    report = Report.query.options(joinedload(Report.patient), joinedload(Report.procedures)).get_or_404(report_id)
+    patient = report.patient # Load patient từ report
 
-    # ... (kiểm tra quyền edit giữ nguyên) ...
+    # --- Start Permission Check ---
+    can_edit = False
+    # 1. Admin can always edit
+    if current_user.is_admin:
+        can_edit = True
+    # 2. Author can always edit
+    elif report.author_id == current_user.userID:
+        can_edit = True
+    # 3. Assigned dietitian for the PATIENT can edit Draft or Pending reports
+    elif patient and patient.assigned_dietitian_user_id == current_user.userID and report.status in ['Draft', 'Pending']:
+        can_edit = True
 
-    # Lấy danh sách patients cho dropdown
+    if not can_edit:
+        flash('You do not have permission to edit this report.', 'error')
+        return redirect(url_for('report.view_report', report_id=report.id))
+    # --- End Permission Check ---
+
+    # Truyền patient_id vào form để load procedure choices
+    form = ReportForm(patient_id=report.patient_id, obj=report)
+
+    # Populate patient choices (dù bị disable, cần để hiển thị đúng tên)
     form.patient_id.choices = [(p.id, f"{p.full_name} ({p.id})") for p in Patient.query.order_by(Patient.lastName, Patient.firstName).all()]
     form.patient_id.choices.insert(0, ('', '-- Select Patient --'))
-    # Đặt lại giá trị đã chọn cho patient_id (vì obj có thể ghi đè)
+    # Đặt lại giá trị đã chọn cho patient_id (form init với obj có thể đã làm)
     form.patient_id.data = report.patient_id 
+    # Procedure choices đã được populate trong form.__init__
+    # Đặt lại giá trị procedure đã chọn nếu có
+    form.related_procedure_id.data = report.related_procedure_id 
 
     # Lấy danh sách referrals (nếu cần)
     # form.referral_id.choices = ...
@@ -199,7 +305,8 @@ def edit_report(report_id):
     if form.validate_on_submit():
         # Cập nhật report từ form data
         form.populate_obj(report) # Tự động cập nhật các trường khớp tên
-        # Cần xử lý riêng các trường không khớp hoặc cần logic đặc biệt (vd: attachments)
+        # Đảm bảo related_procedure_id được cập nhật
+        report.related_procedure_id = form.related_procedure_id.data or None
         
         db.session.commit()
         
@@ -614,4 +721,103 @@ def create_stats_report(report_type):
             as_attachment=True,
             download_name=f"{filename}.xlsx",
             mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
-        )
\ No newline at end of file
+        )
+
+# Route mới để hoàn thành Report và cập nhật trạng thái liên quan
+@report_bp.route('/<int:report_id>/complete', methods=['POST'])
+@login_required
+def complete_report(report_id):
+    """Hoàn thành report, cập nhật trạng thái Patient, Encounter, Referral."""
+    form = EmptyForm() # Sử dụng form rỗng để validate CSRF
+    report = Report.query.get_or_404(report_id)
+
+    # Xác thực CSRF
+    if not form.validate_on_submit():
+        flash('Invalid CSRF token. Please try again.', 'danger')
+        return redirect(url_for('report.view_report', report_id=report_id))
+
+    # Kiểm tra quyền: Chỉ dietitian được gán cho report hoặc admin
+    # Giả định report.dietitian_id lưu ID của dietitian chịu trách nhiệm
+    if not current_user.is_admin and current_user.userID != report.dietitian_id:
+        flash('Bạn không có quyền hoàn thành báo cáo này.', 'error')
+        return redirect(url_for('report.view_report', report_id=report_id))
+
+    # Kiểm tra trạng thái report có phải là 'Pending' hoặc trạng thái phù hợp khác không?
+    if report.status != 'Pending': # Giả sử trạng thái chờ hoàn thành là 'Pending'
+        flash(f'Báo cáo này không ở trạng thái "Pending" để hoàn thành (hiện tại: {report.status}).', 'warning')
+        return redirect(url_for('report.view_report', report_id=report_id))
+
+    try:
+        # Tìm các đối tượng liên quan
+        patient = Patient.query.get(report.patient_id)
+        encounter = Encounter.query.get(report.encounter_id)
+        # Tìm referral tương ứng (dựa trên encounter_id)
+        referral = Referral.query.filter_by(encounter_id=report.encounter_id).first()
+
+        if not patient or not encounter:
+            flash('Không tìm thấy Bệnh nhân hoặc Lượt khám liên quan.', 'error')
+            return redirect(url_for('report.view_report', report_id=report_id))
+
+        # --- Bắt đầu cập nhật trạng thái --- 
+        # 1. Cập nhật Report
+        report.status = 'Completed' # Hoặc 'Finalized' tùy theo Enum của bạn
+        report.completed_date = datetime.utcnow() # Thêm cột completed_date vào Report model?
+
+        # 2. Cập nhật Patient
+        patient.status = PatientStatus.COMPLETED
+
+        # 3. Cập nhật Encounter
+        encounter.status = EncounterStatus.FINISHED
+        encounter.end_time = datetime.utcnow() # Đặt thời gian kết thúc encounter
+
+        # 4. Cập nhật Referral (nếu tìm thấy)
+        if referral:
+            referral.referral_status = ReferralStatus.COMPLETED
+            referral.referralCompletedDateTime = datetime.utcnow()
+        else:
+            current_app.logger.warning(f"Không tìm thấy Referral tương ứng cho encounter {report.encounter_id} khi hoàn thành report {report.id}")
+
+        # 5. Commit thay đổi
+        db.session.commit()
+        flash('Báo cáo đã hoàn thành. Trạng thái Bệnh nhân, Lượt khám và Yêu cầu đánh giá đã được cập nhật.', 'success')
+        current_app.logger.info(f"Report {report.id} completed by User {current_user.userID}. Associated Patient/Encounter/Referral statuses updated.")
+
+        # Redirect về trang chi tiết bệnh nhân
+        return redirect(url_for('patients.patient_detail', patient_id=report.patient_id, _anchor='reports'))
+
+    except Exception as e:
+        db.session.rollback()
+        current_app.logger.error(f"Lỗi khi hoàn thành report {report_id}: {str(e)}", exc_info=True)
+        flash(f'Đã xảy ra lỗi khi hoàn thành báo cáo: {str(e)}', 'danger')
+        return redirect(url_for('report.view_report', report_id=report_id))
+
+@report_bp.route('/<int:report_id>/delete', methods=['POST'])
+@login_required
+def delete_report(report_id):
+    """Xóa một báo cáo."""
+    report = Report.query.get_or_404(report_id)
+    form = EmptyForm()  # Dùng để validate CSRF
+    
+    # Kiểm tra CSRF token
+    if not form.validate_on_submit():
+        flash('Invalid CSRF token. Please try again.', 'danger')
+        return redirect(url_for('report.view_report', report_id=report_id))
+    
+    # Chỉ Admin mới có quyền xóa báo cáo
+    if not current_user.is_admin:
+        flash('Bạn không có quyền xóa báo cáo này.', 'error')
+        return redirect(url_for('report.view_report', report_id=report_id))
+    
+    patient_id = report.patient_id  # Lưu patient_id để redirect sau khi xóa
+    
+    try:
+        db.session.delete(report)
+        db.session.commit()
+        flash('Báo cáo đã được xóa thành công.', 'success')
+        # Chuyển hướng về trang chi tiết bệnh nhân, tab reports
+        return redirect(url_for('patients.patient_detail', patient_id=patient_id, _anchor='reports'))
+    except Exception as e:
+        db.session.rollback()
+        current_app.logger.error(f"Lỗi khi xóa báo cáo {report_id}: {str(e)}", exc_info=True)
+        flash(f'Đã xảy ra lỗi khi xóa báo cáo: {str(e)}', 'danger')
+        return redirect(url_for('report.view_report', report_id=report_id))
\ No newline at end of file
diff --git a/app/static/css/custom.css b/app/static/css/custom.css
new file mode 100644
index 0000000000000000000000000000000000000000..dee3b0b5647798376673288ab2c1e0e8e17e6d69
--- /dev/null
+++ b/app/static/css/custom.css
@@ -0,0 +1,48 @@
+/* Định dạng nút với hiệu ứng */
+.btn-white-outline {
+    background-color: white !important;
+    color: #212529 !important;
+    border: 1px solid #212529 !important;
+    transition: transform 0.2s, box-shadow 0.2s !important;
+}
+
+.btn-white-outline:hover {
+    transform: translateY(-2px) !important;
+    box-shadow: 0 4px 8px rgba(0,0,0,0.1) !important;
+}
+
+.btn-orange {
+    background-color: #fd7e14 !important;
+    color: white !important;
+    border: none !important;
+    transition: transform 0.3s, box-shadow 0.3s !important;
+}
+
+.btn-orange:hover {
+    background-color: #e67211 !important;
+    transform: scale(1.05) !important;
+    box-shadow: 0 5px 15px rgba(253, 126, 20, 0.4) !important;
+}
+
+/* Hiệu ứng nảy nhẹ cho các nút */
+.button-bounce:hover {
+    transform: translateY(-3px);
+    box-shadow: 0 4px 8px rgba(0,0,0,0.1);
+}
+
+/* Hiệu ứng nhấp nhô cho nút quan trọng */
+@keyframes float {
+    0% {
+        transform: translateY(0px);
+    }
+    50% {
+        transform: translateY(-5px);
+    }
+    100% {
+        transform: translateY(0px);
+    }
+}
+
+.animate-float {
+    animation: float 3s ease-in-out infinite;
+} 
\ No newline at end of file
diff --git a/app/static/js/chart.js b/app/static/js/chart.js
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fe090a73b07e381ccd390bb73bebbda6a62283b0 100644
--- a/app/static/js/chart.js
+++ b/app/static/js/chart.js
@@ -0,0 +1,80 @@
+// Chart.js script
+document.addEventListener('DOMContentLoaded', function() {
+    // Hàm tiện ích để kiểm tra nếu đối tượng đó có tồn tại
+    function isElementExists(elementId) {
+        return document.getElementById(elementId) !== null;
+    }
+
+    // Tổng quan biểu đồ chung nếu trên trang dashboard
+    if (isElementExists('patientsOverviewChart')) {
+        const ctx = document.getElementById('patientsOverviewChart').getContext('2d');
+        new Chart(ctx, {
+            type: 'bar',
+            data: {
+                labels: ['Admitted', 'Active', 'Discharged', 'In Treatment'],
+                datasets: [{
+                    label: 'Patient Count',
+                    data: [12, 19, 3, 5],
+                    backgroundColor: [
+                        'rgba(255, 99, 132, 0.2)',
+                        'rgba(54, 162, 235, 0.2)',
+                        'rgba(255, 206, 86, 0.2)',
+                        'rgba(75, 192, 192, 0.2)'
+                    ],
+                    borderColor: [
+                        'rgba(255, 99, 132, 1)',
+                        'rgba(54, 162, 235, 1)',
+                        'rgba(255, 206, 86, 1)',
+                        'rgba(75, 192, 192, 1)'
+                    ],
+                    borderWidth: 1
+                }]
+            },
+            options: {
+                scales: {
+                    y: {
+                        beginAtZero: true
+                    }
+                },
+                responsive: true
+            }
+        });
+    }
+
+    // Buttons functionality 
+    const assignDietitianBtn = document.getElementById('assignDietitianBtn');
+    const assignDietitianModal = document.getElementById('assignDietitianModal');
+    const closeModalBtn = document.getElementById('closeModalBtn');
+
+    // Hiển thị modal khi nút được bấm
+    if (assignDietitianBtn && assignDietitianModal) {
+        assignDietitianBtn.addEventListener('click', function() {
+            assignDietitianModal.classList.remove('hidden');
+        });
+    }
+
+    // Đóng modal khi nút đóng được bấm
+    if (closeModalBtn && assignDietitianModal) {
+        closeModalBtn.addEventListener('click', function() {
+            assignDietitianModal.classList.add('hidden');
+        });
+
+        // Đóng khi click bên ngoài modal
+        window.addEventListener('click', function(event) {
+            if (event.target === assignDietitianModal) {
+                assignDietitianModal.classList.add('hidden');
+            }
+        });
+    }
+
+    // Xử lý nút confirm trên các modal xác nhận
+    const confirmBtns = document.querySelectorAll('.confirm-dialog-btn');
+    confirmBtns.forEach(function(btn) {
+        btn.addEventListener('click', function() {
+            const targetForm = document.getElementById(this.dataset.formTarget);
+            if (targetForm) {
+                targetForm.submit();
+            }
+        });
+    });
+});
diff --git a/app/static/js/jquery.easing.min.js b/app/static/js/jquery.easing.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..9470c77511060944d8f852eb079e2d3cb3bcfda1
--- /dev/null
+++ b/app/static/js/jquery.easing.min.js
@@ -0,0 +1,8 @@
+/*
+ * jQuery Easing v1.4.1 - https://gsgd.co.uk/sandbox/jquery/easing/
+ * Open source under the BSD License.
+ * Copyright © 2008 George McGinley Smith
+ * All rights reserved.
+ * https://raw.github.com/gdsmith/jquery.easing/master/LICENSE
+*/
+(function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],function($){return factory($)})}else if(typeof module==="object"&&typeof module.exports==="object"){exports=factory(require("jquery"))}else{factory(jQuery)}})(function($){$.easing.jswing=$.easing.swing;var pow=Math.pow,sqrt=Math.sqrt,sin=Math.sin,cos=Math.cos,PI=Math.PI,c1=1.70158,c2=c1*1.525,c3=c1+1,c4=2*PI/3,c5=2*PI/4.5;function bounceOut(x){var n1=7.5625,d1=2.75;if(x<1/d1){return n1*x*x}else if(x<2/d1){return n1*(x-=1.5/d1)*x+.75}else if(x<2.5/d1){return n1*(x-=2.25/d1)*x+.9375}else{return n1*(x-=2.625/d1)*x+.984375}}$.extend($.easing,{def:"easeOutQuad",swing:function(x){return $.easing[$.easing.def](x)},easeInQuad:function(x){return x*x},easeOutQuad:function(x){return 1-(1-x)*(1-x)},easeInOutQuad:function(x){return x<.5?2*x*x:1-pow(-2*x+2,2)/2},easeInCubic:function(x){return x*x*x},easeOutCubic:function(x){return 1-pow(1-x,3)},easeInOutCubic:function(x){return x<.5?4*x*x*x:1-pow(-2*x+2,3)/2},easeInQuart:function(x){return x*x*x*x},easeOutQuart:function(x){return 1-pow(1-x,4)},easeInOutQuart:function(x){return x<.5?8*x*x*x*x:1-pow(-2*x+2,4)/2},easeInQuint:function(x){return x*x*x*x*x},easeOutQuint:function(x){return 1-pow(1-x,5)},easeInOutQuint:function(x){return x<.5?16*x*x*x*x*x:1-pow(-2*x+2,5)/2},easeInSine:function(x){return 1-cos(x*PI/2)},easeOutSine:function(x){return sin(x*PI/2)},easeInOutSine:function(x){return-(cos(PI*x)-1)/2},easeInExpo:function(x){return x===0?0:pow(2,10*x-10)},easeOutExpo:function(x){return x===1?1:1-pow(2,-10*x)},easeInOutExpo:function(x){return x===0?0:x===1?1:x<.5?pow(2,20*x-10)/2:(2-pow(2,-20*x+10))/2},easeInCirc:function(x){return 1-sqrt(1-pow(x,2))},easeOutCirc:function(x){return sqrt(1-pow(x-1,2))},easeInOutCirc:function(x){return x<.5?(1-sqrt(1-pow(2*x,2)))/2:(sqrt(1-pow(-2*x+2,2))+1)/2},easeInElastic:function(x){return x===0?0:x===1?1:-pow(2,10*x-10)*sin((x*10-10.75)*c4)},easeOutElastic:function(x){return x===0?0:x===1?1:pow(2,-10*x)*sin((x*10-.75)*c4)+1},easeInOutElastic:function(x){return x===0?0:x===1?1:x<.5?-(pow(2,20*x-10)*sin((20*x-11.125)*c5))/2:pow(2,-20*x+10)*sin((20*x-11.125)*c5)/2+1},easeInBack:function(x){return c3*x*x*x-c1*x*x},easeOutBack:function(x){return 1+c3*pow(x-1,3)+c1*pow(x-1,2)},easeInOutBack:function(x){return x<.5?pow(2*x,2)*((c2+1)*2*x-c2)/2:(pow(2*x-2,2)*((c2+1)*(x*2-2)+c2)+2)/2},easeInBounce:function(x){return 1-bounceOut(1-x)},easeOutBounce:bounceOut,easeInOutBounce:function(x){return x<.5?(1-bounceOut(1-2*x))/2:(1+bounceOut(2*x-1))/2}})}); 
\ No newline at end of file
diff --git a/app/static/js/sb-admin-2.min.js b/app/static/js/sb-admin-2.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..8d1c8b69c3fce7bea45c73efd06983e3c419a92f
--- /dev/null
+++ b/app/static/js/sb-admin-2.min.js
@@ -0,0 +1 @@
+ 
diff --git a/app/static/vendor/chart.js/Chart.min.js b/app/static/vendor/chart.js/Chart.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..bfbf46d77488a8c6dc53471e61df9a1f3e40e23e
--- /dev/null
+++ b/app/static/vendor/chart.js/Chart.min.js
@@ -0,0 +1,2 @@
+  
+ 
\ No newline at end of file
diff --git a/app/static/vendor/jquery-easing/jquery.easing.min.js b/app/static/vendor/jquery-easing/jquery.easing.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..bfbf46d77488a8c6dc53471e61df9a1f3e40e23e
--- /dev/null
+++ b/app/static/vendor/jquery-easing/jquery.easing.min.js
@@ -0,0 +1,2 @@
+  
+ 
\ No newline at end of file
diff --git a/app/templates/admin/users.html b/app/templates/admin/users.html
new file mode 100644
index 0000000000000000000000000000000000000000..3ba3094828ff221d5fcee98780fb93d8d1fbeae4
--- /dev/null
+++ b/app/templates/admin/users.html
@@ -0,0 +1,145 @@
+{% extends "base.html" %}
+
+{% block title %}Quản lý người dùng - Admin{% endblock %}
+
+{% block content %}
+<div class="container mx-auto px-4 py-8 animate-fade-in">
+    <!-- Breadcrumb -->
+    <div class="mb-6">
+        <nav class="flex" aria-label="Breadcrumb">
+            <ol class="inline-flex items-center space-x-1 md:space-x-3">
+                <li class="inline-flex items-center">
+                    <a href="{{ url_for('dashboard.index') }}" class="inline-flex items-center text-sm font-medium text-gray-700 hover:text-blue-600 transition duration-200">
+                        <i class="fas fa-tachometer-alt mr-2"></i> Dashboard
+                    </a>
+                </li>
+                <li aria-current="page">
+                    <div class="flex items-center">
+                        <i class="fas fa-chevron-right text-gray-400 mx-2"></i>
+                        <span class="ml-1 text-sm font-medium text-gray-500 md:ml-2">Quản lý người dùng</span>
+                    </div>
+                </li>
+            </ol>
+        </nav>
+    </div>
+
+    <div class="flex justify-between items-center mb-6">
+        <h1 class="text-2xl font-semibold text-gray-800">Danh sách người dùng</h1>
+        {# Nút thêm người dùng mới có thể thêm sau #}
+        <!-- <a href="{{ url_for('auth.admin_create_user') }}" class="bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-md transition duration-300 flex items-center">
+            <i class="fas fa-plus mr-2"></i> Thêm người dùng
+        </a> -->
+    </div>
+
+    <div class="bg-white shadow-md rounded-lg overflow-hidden">
+        <div class="overflow-x-auto">
+            <table class="min-w-full divide-y divide-gray-200">
+                <thead class="bg-gray-50">
+                    <tr>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">ID</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Tên</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Email</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Vai trò</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Ngày tạo</th>
+                        <th scope="col" class="relative px-6 py-3">
+                            <span class="sr-only">Actions</span>
+                        </th>
+                    </tr>
+                </thead>
+                <tbody class="bg-white divide-y divide-gray-200">
+                    {% if users and users.items %}
+                        {% for user in users.items %}
+                        <tr class="hover:bg-gray-50 transition-colors duration-150">
+                            <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">{{ user.formattedID }}</td>
+                            <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">{{ user.full_name }}</td>
+                            <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ user.email }}</td>
+                            <td class="px-6 py-4 whitespace-nowrap">
+                                <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full 
+                                    {% if user.role == 'Admin' %} bg-red-100 text-red-800 {% else %} bg-blue-100 text-blue-800 {% endif %}">
+                                    {{ user.role }}
+                                </span>
+                            </td>
+                            <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ user.created_at.strftime('%d/%m/%Y %H:%M') if user.created_at else 'N/A' }}</td>
+                            <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium space-x-2">
+                                {# Nút Chỉnh sửa: Hiện tại đang link đến trang edit profile chung, cần sửa route nếu có trang edit riêng cho admin #}
+                                <a href="{{ url_for('auth.admin_edit_user', user_id=user.userID) }}" class="text-indigo-600 hover:text-indigo-900" title="Chỉnh sửa"><i class="fas fa-edit"></i></a>
+                                
+                                {# Nút Thay đổi vai trò (chỉ hiển thị nếu không phải là user hiện tại) #}
+                                {% if user.userID != current_user.userID %}
+                                <form action="{{ url_for('auth.admin_toggle_role', user_id=user.userID) }}" method="POST" class="inline-block" onsubmit="return confirm('Bạn có chắc muốn thay đổi vai trò của người dùng này không?');">
+                                    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> {# Assume CSRF is handled #}
+                                    <button type="submit" class="text-yellow-600 hover:text-yellow-900" title="Thay đổi vai trò"><i class="fas fa-sync-alt"></i></button>
+                                </form>
+                                {% endif %}
+
+                                {# Nút Xóa (chỉ hiển thị nếu không phải là user hiện tại) #}
+                                {% if user.userID != current_user.userID %}
+                                <form action="{{ url_for('auth.admin_delete_user', user_id=user.userID) }}" method="POST" class="inline-block" onsubmit="return confirm('Bạn có chắc chắn muốn xóa người dùng này không? Hành động này không thể hoàn tác.');">
+                                    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> {# Assume CSRF is handled #}
+                                    <button type="submit" class="text-red-600 hover:text-red-900" title="Xóa"><i class="fas fa-trash"></i></button>
+                                </form>
+                                {% endif %}
+                            </td>
+                        </tr>
+                        {% endfor %}
+                    {% else %}
+                        <tr>
+                            <td colspan="6" class="px-6 py-4 text-center text-sm text-gray-500">Không tìm thấy người dùng nào.</td>
+                        </tr>
+                    {% endif %}
+                </tbody>
+            </table>
+        </div>
+
+        <!-- Pagination -->
+        {% if users and users.pages > 1 %}
+        <div class="bg-white px-4 py-3 flex items-center justify-between border-t border-gray-200 sm:px-6">
+            <div class="flex-1 flex justify-between sm:hidden">
+                <a href="{{ url_for('auth.admin_users', page=users.prev_num) if users.has_prev else '#' }}" 
+                   class="relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 {{ 'disabled opacity-50 cursor-not-allowed' if not users.has_prev }}"> Previous </a>
+                <a href="{{ url_for('auth.admin_users', page=users.next_num) if users.has_next else '#' }}" 
+                   class="ml-3 relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 {{ 'disabled opacity-50 cursor-not-allowed' if not users.has_next }}"> Next </a>
+            </div>
+            <div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between">
+                <div>
+                    <p class="text-sm text-gray-700">
+                        Hiển thị từ
+                        <span class="font-medium">{{ (users.page - 1) * users.per_page + 1 }}</span>
+                        đến
+                        <span class="font-medium">{{ users.page * users.per_page if users.page * users.per_page <= users.total else users.total }}</span>
+                        của
+                        <span class="font-medium">{{ users.total }}</span>
+                        kết quả
+                    </p>
+                </div>
+                <div>
+                    <nav class="relative z-0 inline-flex rounded-md shadow-sm -space-x-px" aria-label="Pagination">
+                        <a href="{{ url_for('auth.admin_users', page=users.prev_num) if users.has_prev else '#' }}" 
+                           class="relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 {{ 'disabled opacity-50 cursor-not-allowed' if not users.has_prev }}">
+                            <span class="sr-only">Previous</span>
+                            <i class="fas fa-chevron-left h-5 w-5"></i>
+                        </a>
+                        {% for page_num in users.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %}
+                            {% if page_num %}
+                                <a href="{{ url_for('auth.admin_users', page=page_num) }}" 
+                                   class="relative inline-flex items-center px-4 py-2 border text-sm font-medium 
+                                          {% if page_num == users.page %} z-10 bg-blue-50 border-blue-500 text-blue-600 {% else %} bg-white border-gray-300 text-gray-500 hover:bg-gray-50 {% endif %}">
+                                    {{ page_num }}
+                                </a>
+                            {% else %}
+                                <span class="relative inline-flex items-center px-4 py-2 border border-gray-300 bg-white text-sm font-medium text-gray-700"> ... </span>
+                            {% endif %}
+                        {% endfor %}
+                        <a href="{{ url_for('auth.admin_users', page=users.next_num) if users.has_next else '#' }}" 
+                           class="relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 {{ 'disabled opacity-50 cursor-not-allowed' if not users.has_next }}">
+                            <span class="sr-only">Next</span>
+                            <i class="fas fa-chevron-right h-5 w-5"></i>
+                        </a>
+                    </nav>
+                </div>
+            </div>
+        </div>
+        {% endif %}
+    </div>
+</div>
+{% endblock %} 
\ No newline at end of file
diff --git a/app/templates/base.html b/app/templates/base.html
index d31bc6d55bb5d9b99464440c1074640bc626f5b1..97d88e8bebbadf17e3ef613fefdf41e264de1d6f 100644
--- a/app/templates/base.html
+++ b/app/templates/base.html
@@ -288,24 +288,39 @@
                             <i class="fas fa-user-injured mr-3 text-lg"></i> <span class="nav-text">Patient</span>
                         </a>
                     </li>
-                    <li>
-                        <a href="{{ url_for('report.index') }}" class="nav-item flex items-center py-3 px-4 {% if request.endpoint and request.endpoint.startswith('report.') %}active{% endif %}">
-                            <i class="fas fa-chart-bar mr-3 text-lg"></i> <span class="nav-text">Reports</span>
+                    {# Procedures (Dietitian Only) - Move before Reports #}
+                    {% if current_user.role == 'Dietitian' %}
+                    <li class="nav-item {% if request.endpoint.startswith('dietitian.list_procedures') %}active{% endif %}">
+                        <a href="{{ url_for('dietitian.list_procedures') }}" class="text-white hover:text-primary-light flex items-center w-full">
+                            <i class="fas fa-procedures"></i>
+                            <span class="nav-text">Procedures</span>
                         </a>
                     </li>
-                    <li>
-                        <a href="{{ url_for('dietitians.index') }}" class="nav-item flex items-center py-3 px-4 {% if request.endpoint and request.endpoint.startswith('dietitians.') %}active{% endif %}">
-                            <i class="fas fa-user-md mr-3 text-lg"></i> <span class="nav-text">Dietitians</span>
+                    {% endif %}
+                    <li class="nav-item {% if request.endpoint and request.endpoint.startswith('report.') %}active{% endif %}">
+                        <a href="{{ url_for('report.index') }}" class="text-white hover:text-primary-light flex items-center w-full">
+                            <i class="fas fa-chart-bar"></i>
+                            <span class="nav-text">Reports</span>
                         </a>
                     </li>
-                    <li>
-                        <a href="{{ url_for('upload.index') }}" class="nav-item flex items-center py-3 px-4 {% if request.endpoint and request.endpoint.startswith('upload.') %}active{% endif %}">
-                            <i class="fas fa-upload mr-3 text-lg"></i> <span class="nav-text">Upload CSV</span>
+                    <li class="nav-item {% if request.endpoint and request.endpoint.startswith('dietitians.') %}active{% endif %}">
+                        <a href="{{ url_for('dietitians.index') }}" class="text-white hover:text-primary-light flex items-center w-full">
+                            <i class="fas fa-user-md"></i>
+                            <span class="nav-text">Dietitians</span>
+                        </a>
+                    </li>
+                    {# Hide Upload CSV for Dietitians #}
+                    {% if current_user.role != 'Dietitian' %}
+                    <li class="nav-item {% if request.endpoint and request.endpoint.startswith('upload.') %}active{% endif %}">
+                        <a href="{{ url_for('upload.index') }}" class="text-white hover:text-primary-light flex items-center w-full">
+                            <i class="fas fa-upload"></i>
+                            <span class="nav-text">Upload CSV</span>
                         </a>
                     </li>
+                    {% endif %}
                     {% if current_user.is_admin %}
-                    <li>
-                        <a href="{{ url_for('auth.admin_users') }}" class="nav-item flex items-center py-3 px-4 {% if request.endpoint == 'auth.admin_users' %}active{% endif %}">
+                    <li class="nav-item {% if request.endpoint == 'auth.admin_users' %}active{% endif %}">
+                        <a href="{{ url_for('auth.admin_users') }}" class="text-white hover:text-primary-light flex items-center w-full">
                             <i class="fas fa-users-cog mr-3 text-lg"></i> <span class="nav-text">User Management</span>
                         </a>
                     </li>
@@ -472,6 +487,10 @@
     <!-- Page level plugins -->
     <script src="{{ url_for('static', filename='vendor/chart.js/Chart.min.js') }}"></script>
 
+    <!-- ADDED: Popper.js and Bootstrap JS from CDN -->
+    <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js" integrity="sha384-oBqDVmMz9ATKxIep9tiCxS/Z9fNfEXiDAYTujMAeBAsjFuCZSmKbSSUnQlmh/jp3" crossorigin="anonymous"></script>
+    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js" integrity="sha384-cuYeSxntonz0PPNlHhBs68uyIAVpIIOZZ5JqeqvYYIcEL727kskC66kF92t6Xl2V" crossorigin="anonymous"></script>
+
     <!-- Page level custom scripts -->
     <!-- <script src="{{ url_for('static', filename='js/demo/chart-area-demo.js') }}"></script>
     <script src="{{ url_for('static', filename='js/demo/chart-pie-demo.js') }}"></script> -->
@@ -688,5 +707,8 @@
     </script>
 
     {% block scripts %}{% endblock %}
+
+    <!-- Thêm Alpine.js -->
+    <script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
 </body>
 </html>
diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html
index 389af67cefe29a1f00100b640888fc8141498b38..bb387345e04a1ac88f6c59f8d6994fa365653f7e 100644
--- a/app/templates/dashboard.html
+++ b/app/templates/dashboard.html
@@ -202,15 +202,20 @@
                 <ul class="divide-y divide-gray-200">
                     {% for patient in recent_patients %}
                     <li class="transform hover:scale-[1.01] transition-transform duration-200">
-                        <a href="{{ url_for('patients.patient_detail', patient_id=patient.patient_id) }}" class="block hover:bg-gray-50">
+                        <a href="{{ url_for('patients.patient_detail', patient_id=patient.id) }}" class="block hover:bg-gray-50">
                             <div class="px-4 py-4 sm:px-6">
                                 <div class="flex items-center justify-between">
                                     <div class="text-sm font-medium text-blue-600 truncate">
                                         {{ patient.full_name }}
                                     </div>
                                     <div class="ml-2 flex-shrink-0 flex">
-                                        <span class="px-2 py-1 inline-flex text-xs leading-5 font-semibold rounded-full {% if patient.status == 'active' %}bg-green-100 text-green-800{% elif patient.status == 'discharged' %}bg-gray-100 text-gray-800{% else %}bg-yellow-100 text-yellow-800{% endif %}">
-                                            {{ patient.status }}
+                                        <span class="px-2 py-1 inline-flex text-xs leading-5 font-semibold rounded-full 
+                                            {% if patient.status == PatientStatus.NOT_ASSESSED %}bg-gray-100 text-gray-800
+                                            {% elif patient.status == PatientStatus.NEEDS_ASSESSMENT %}bg-amber-100 text-amber-800
+                                            {% elif patient.status == PatientStatus.ASSESSMENT_IN_PROGRESS %}bg-blue-100 text-blue-800
+                                            {% elif patient.status == PatientStatus.COMPLETED %}bg-green-100 text-green-800
+                                            {% else %}bg-gray-100 text-gray-800{% endif %}\">
+                                            {{ patient.status.value.replace('_', ' ').title() if patient.status else 'Unknown' }}
                                         </span>
                                     </div>
                                 </div>
@@ -218,12 +223,12 @@
                                     <div class="sm:flex">
                                         <div class="flex items-center text-sm text-gray-500">
                                             <i class="fas fa-id-card flex-shrink-0 mr-1.5 text-gray-400"></i>
-                                            <span>ID: {{ patient.patient_id }}</span>
+                                            <span>ID: {{ patient.id }}</span>
                                         </div>
                                     </div>
                                     <div class="flex items-center text-sm text-gray-500">
                                         <i class="fas fa-calendar flex-shrink-0 mr-1.5 text-gray-400"></i>
-                                        <span>{{ 'N/A' }}</span>
+                                        <span>{{ patient.admission_date.strftime('%d/%m/%y') if patient.admission_date else 'N/A' }}</span>
                                     </div>
                                 </div>
                             </div>
diff --git a/app/templates/dietitian_dashboard.html b/app/templates/dietitian_dashboard.html
new file mode 100644
index 0000000000000000000000000000000000000000..f0fb7664e1abf92a278e1cb41036fc3e30ad9935
--- /dev/null
+++ b/app/templates/dietitian_dashboard.html
@@ -0,0 +1,306 @@
+{% extends "base.html" %}
+
+{% block title %}Dietitian Dashboard - CCU_BVNM{% endblock %}
+
+{% block head %}
+{{ super() }}
+{# Link tới Chart.js nếu chưa có trong base.html #}
+<script src="https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js"></script> 
+{% endblock %}
+
+{% block content %}
+<div class="container mx-auto px-4 py-6 animate-slide-in">
+
+    <h1 class="text-3xl font-bold text-gray-800 mb-6">Dietitian Dashboard</h1>
+
+    <!-- Statistics Cards -->
+    <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
+        <!-- Total Assigned Patients -->
+        <div class="bg-gradient-to-br from-blue-100 to-blue-200 p-6 rounded-lg shadow-md hover:shadow-lg transition-shadow duration-300">
+            <div class="flex items-center">
+                <div class="p-3 rounded-full bg-blue-500 text-white mr-4">
+                    <i class="fas fa-users fa-lg"></i>
+                </div>
+                <div>
+                    <p class="text-sm font-medium text-blue-800 uppercase tracking-wider">Total Patients</p>
+                    <p class="text-3xl font-semibold text-blue-900">{{ total_assigned_patients }}</p>
+                </div>
+            </div>
+        </div>
+
+        <!-- Needs Assessment -->
+        <div class="bg-gradient-to-br from-amber-100 to-amber-200 p-6 rounded-lg shadow-md hover:shadow-lg transition-shadow duration-300">
+            <div class="flex items-center">
+                <div class="p-3 rounded-full bg-amber-500 text-white mr-4">
+                    <i class="fas fa-clipboard-list fa-lg"></i>
+                </div>
+                <div>
+                    <p class="text-sm font-medium text-amber-800 uppercase tracking-wider">Needs Assessment</p>
+                    <p class="text-3xl font-semibold text-amber-900">{{ needs_assessment_count }}</p>
+                </div>
+            </div>
+        </div>
+
+        <!-- In Progress -->
+        <div class="bg-gradient-to-br from-teal-100 to-teal-200 p-6 rounded-lg shadow-md hover:shadow-lg transition-shadow duration-300">
+            <div class="flex items-center">
+                <div class="p-3 rounded-full bg-teal-500 text-white mr-4">
+                    <i class="fas fa-tasks fa-lg"></i>
+                </div>
+                <div>
+                    <p class="text-sm font-medium text-teal-800 uppercase tracking-wider">In Progress</p>
+                    <p class="text-3xl font-semibold text-teal-900">{{ in_progress_count }}</p> {# Cần xác nhận logic này #}
+                </div>
+            </div>
+        </div>
+
+        <!-- Pending Reports -->
+        <div class="bg-gradient-to-br from-purple-100 to-purple-200 p-6 rounded-lg shadow-md hover:shadow-lg transition-shadow duration-300">
+            <div class="flex items-center">
+                <div class="p-3 rounded-full bg-purple-500 text-white mr-4">
+                    <i class="fas fa-file-alt fa-lg"></i>
+                </div>
+                <div>
+                    <p class="text-sm font-medium text-purple-800 uppercase tracking-wider">Pending Reports</p>
+                    <p class="text-3xl font-semibold text-purple-900">{{ pending_reports_count }}</p>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <!-- Main Content Area (Charts and Lists) -->
+    <div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
+        <!-- Left Column (Charts) -->
+        <div class="lg:col-span-2 space-y-8">
+            <!-- Patient Status Distribution Chart -->
+            <div class="bg-white p-6 rounded-lg shadow-md">
+                <h2 class="text-xl font-semibold text-gray-700 mb-4">Patient Status Distribution</h2>
+                <div class="h-64 md:h-80">
+                    <canvas id="patientStatusChart"></canvas>
+                </div>
+            </div>
+
+            <!-- BMI & Gender Charts (Side-by-side) -->
+            <div class="grid grid-cols-1 md:grid-cols-2 gap-8">
+                <div class="bg-white p-6 rounded-lg shadow-md">
+                    <h2 class="text-xl font-semibold text-gray-700 mb-4">BMI Distribution</h2>
+                     <div class="h-64">
+                        <canvas id="bmiChart"></canvas>
+                    </div>
+                </div>
+                <div class="bg-white p-6 rounded-lg shadow-md">
+                    <h2 class="text-xl font-semibold text-gray-700 mb-4">Gender Distribution</h2>
+                    <div class="h-64">
+                        <canvas id="genderChart"></canvas>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <!-- Right Column (Lists) -->
+        <div class="lg:col-span-1 space-y-8">
+            <!-- My Recent Patients -->
+            <div class="bg-white p-6 rounded-lg shadow-md">
+                <div class="flex justify-between items-center mb-4">
+                    <h2 class="text-xl font-semibold text-gray-700">My Recent Patients</h2>
+                    <a href="{{ url_for('patients.index') }}" class="text-sm text-blue-600 hover:underline">View All</a>
+                </div>
+                <ul class="divide-y divide-gray-200">
+                    {% for patient in recent_patients %}
+                    <li class="py-3 flex items-center justify-between">
+                        <div>
+                            <a href="{{ url_for('patients.patient_detail', patient_id=patient.id) }}" class="text-sm font-medium text-gray-900 hover:text-blue-600">{{ patient.full_name }}</a>
+                            <p class="text-xs text-gray-500">ID: {{ patient.id }}</p>
+                        </div>
+                        <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full 
+                            {% if patient.status %}
+                                {% if patient.status.value == 'ACTIVE' %}bg-green-100 text-green-800
+                                {% elif patient.status.value == 'NEEDS_ASSESSMENT' %}bg-amber-100 text-amber-800
+                                {% elif patient.status.value == 'ASSESSMENT_IN_PROGRESS' %}bg-blue-100 text-blue-800
+                                {% elif patient.status.value == 'COMPLETED' %}bg-gray-100 text-gray-800
+                                {% else %}bg-gray-100 text-gray-800{% endif %}
+                            {% else %}bg-gray-100 text-gray-800{% endif %}">
+                            {% if patient.status %}
+                                {{ patient.status.value.replace('_', ' ')|title }}
+                            {% else %}
+                                Unknown
+                            {% endif %}
+                        </span>
+                    </li>
+                    {% else %}
+                    <li class="py-3 text-sm text-gray-500 text-center">No patients assigned yet.</li>
+                    {% endfor %}
+                </ul>
+            </div>
+
+            <!-- Recent Activities (Placeholder) -->
+            <div class="bg-white p-6 rounded-lg shadow-md">
+                <h2 class="text-xl font-semibold text-gray-700 mb-4">Recent Activities</h2>
+                <ul class="divide-y divide-gray-200">
+                     {% for activity in recent_activities %}
+                        <li class="py-3">
+                            <p class="text-sm text-gray-800">{{ activity.action }}</p>
+                            {% if activity.details %}
+                            <p class="text-xs text-gray-500 mt-1">{{ activity.details|truncate(100) }}</p> {# Truncate for brevity #}
+                            {% endif %}
+                            <p class="text-xs text-gray-400 text-right">{{ activity.timestamp.strftime('%d/%m/%Y %H:%M') }}</p>
+                        </li>
+                    {% else %}
+                        <li class="py-3 text-sm text-gray-500 text-center">No recent activities found.</li>
+                    {% endfor %}
+                </ul>
+            </div>
+        </div>
+    </div>
+</div>
+{% endblock %}
+
+{% block scripts %}
+{{ super() }}
+<script>
+    document.addEventListener('DOMContentLoaded', function() {
+        // Chart Colors (Tailwind Defaults)
+        const twColors = {
+            blue: '#3b82f6',
+            amber: '#f59e0b',
+            teal: '#14b8a6',
+            purple: '#8b5cf6',
+            green: '#10b981',
+            red: '#ef4444',
+            gray: '#6b7280',
+            pink: '#ec4899', // Added pink
+            cyan: '#06b6d4'  // Added cyan
+        };
+
+        // Helper to get chart colors based on labels
+        function getChartColors(labels, colorMap) {
+            const defaultColors = [twColors.blue, twColors.teal, twColors.amber, twColors.purple, twColors.red, twColors.green, twColors.gray, twColors.pink, twColors.cyan];
+            // Ensure labels is an array before calling map
+            labels = Array.isArray(labels) ? labels : []; 
+            return labels.map((label, index) => colorMap[String(label).toLowerCase()] || defaultColors[index % defaultColors.length]);
+        }
+
+        // 1. Patient Status Chart (Doughnut)
+        const statusCtx = document.getElementById('patientStatusChart')?.getContext('2d');
+        if (statusCtx) {
+            const statusLabels = {{ status_chart_data.labels|tojson|safe }};
+            const statusData = {{ status_chart_data.data|tojson|safe }};
+            const statusColorMap = {
+                'needs assessment': twColors.amber,
+                'in treatment': twColors.teal,
+                'completed': twColors.gray,
+                'active': twColors.green,
+                'assessment in progress': twColors.blue
+            };
+            new Chart(statusCtx, {
+                type: 'doughnut',
+                data: {
+                    labels: statusLabels,
+                    datasets: [{
+                        label: 'Patient Status',
+                        data: statusData,
+                        backgroundColor: getChartColors(statusLabels, statusColorMap),
+                        borderColor: '#ffffff',
+                        borderWidth: 2
+                    }]
+                },
+                options: {
+                    responsive: true,
+                    maintainAspectRatio: false,
+                    plugins: {
+                        legend: {
+                            position: 'bottom',
+                        },
+                        tooltip: {
+                            callbacks: {
+                                label: function(context) {
+                                    let label = context.label || '';
+                                    if (label) {
+                                        label += ': ';
+                                    }
+                                    if (context.parsed !== null) {
+                                        // Ensure context.parsed is treated as a number
+                                        label += Number(context.parsed);
+                                    }
+                                    return label;
+                                }
+                            }
+                        }
+                    }
+                }
+            });
+        }
+
+        // 2. BMI Chart (Pie)
+        const bmiCtx = document.getElementById('bmiChart')?.getContext('2d');
+        if (bmiCtx) {
+            const bmiLabels = {{ bmi_chart_data.labels|tojson|safe }};
+            const bmiData = {{ bmi_chart_data.data|tojson|safe }};
+            const bmiColorMap = {
+                'underweight': twColors.cyan,
+                'normal': twColors.green,
+                'overweight': twColors.amber,
+                'obese': twColors.red,
+                'unknown': twColors.gray
+            };
+            new Chart(bmiCtx, {
+                type: 'pie',
+                data: {
+                    labels: bmiLabels,
+                    datasets: [{
+                        label: 'BMI Distribution',
+                        data: bmiData,
+                        backgroundColor: getChartColors(bmiLabels, bmiColorMap),
+                        borderColor: '#ffffff', 
+                        borderWidth: 2
+                    }]
+                },
+                 options: {
+                    responsive: true,
+                    maintainAspectRatio: false,
+                     plugins: {
+                        legend: {
+                             position: 'bottom',
+                        }
+                    }
+                }
+            });
+        }
+
+        // 3. Gender Chart (Pie)
+        const genderCtx = document.getElementById('genderChart')?.getContext('2d');
+        if (genderCtx) {
+             const genderLabels = {{ gender_chart_data.labels|tojson|safe }};
+            const genderData = {{ gender_chart_data.data|tojson|safe }};
+             const genderColorMap = {
+                'male': twColors.blue,
+                'female': twColors.pink,
+                'other': twColors.purple,
+                'unknown': twColors.gray
+            };
+            new Chart(genderCtx, {
+                type: 'pie',
+                data: {
+                    labels: genderLabels,
+                    datasets: [{
+                        label: 'Gender Distribution',
+                        data: genderData,
+                        backgroundColor: getChartColors(genderLabels, genderColorMap),
+                         borderColor: '#ffffff',
+                        borderWidth: 2
+                    }]
+                },
+                 options: {
+                    responsive: true,
+                     maintainAspectRatio: false,
+                     plugins: {
+                        legend: {
+                             position: 'bottom',
+                        }
+                    }
+                }
+            });
+        }
+    });
+</script>
+{% endblock %} 
\ No newline at end of file
diff --git a/app/templates/dietitian_procedures.html b/app/templates/dietitian_procedures.html
new file mode 100644
index 0000000000000000000000000000000000000000..f950ebeba90c89db17be9b00a9ddc3717ded8976
--- /dev/null
+++ b/app/templates/dietitian_procedures.html
@@ -0,0 +1,141 @@
+{% extends 'base.html' %}
+
+{% block title %}Procedures - Dietitian Area{% endblock %}
+
+{% block content %}
+<div class="container mx-auto px-4 py-6 animate-slide-in">
+
+    <h1 class="text-3xl font-bold text-gray-800 mb-6">Nutritional Procedures</h1>
+
+    <!-- Filters -->
+    <div class="mb-6 p-4 bg-white rounded-lg shadow">
+        <form method="GET" action="{{ url_for('.list_procedures') }}" class="grid grid-cols-1 md:grid-cols-3 gap-4 items-end">
+            <div>
+                <label for="patient_id" class="block text-sm font-medium text-gray-700">Filter by Patient</label>
+                <select id="patient_id" name="patient_id" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500">
+                    <option value="">All Patients</option>
+                    {% for p in patients_for_filter %}
+                    <option value="{{ p.id }}" {% if p.id == selected_patient_id %}selected{% endif %}>{{ p.full_name }} ({{ p.id }})</option>
+                    {% endfor %}
+                </select>
+            </div>
+            <div class="md:col-span-1">
+                <button type="submit" class="w-full px-4 py-2 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500">
+                    <i class="fas fa-filter mr-2"></i>Filter
+                </button>
+            </div>
+            {# Nút Add Procedure chỉ hiển thị khi đã chọn bệnh nhân #}
+            <div class="md:col-span-1 text-right">
+                {% if selected_patient_id %}
+                    <a href="{{ url_for('.new_procedure', patient_id=selected_patient_id) }}" class="inline-flex items-center px-4 py-2 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-green-600 hover:bg-green-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500">
+                        <i class="fas fa-plus mr-2"></i>Add Procedure
+                    </a>
+                {% else %}
+                    <button type="button" class="inline-flex items-center px-4 py-2 border border-gray-300 shadow-sm text-sm font-medium rounded-md text-gray-400 bg-gray-100 cursor-not-allowed" title="Select a patient to add a procedure">
+                        <i class="fas fa-plus mr-2"></i>Add Procedure
+                    </button>
+                {% endif %}
+            </div>
+        </form>
+    </div>
+
+    <!-- Procedures List Table -->
+    <div class="bg-white shadow overflow-hidden sm:rounded-lg">
+        <div class="overflow-x-auto">
+            <table class="min-w-full divide-y divide-gray-200">
+                <thead class="bg-gray-50">
+                    <tr>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Date/Time</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Patient</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Encounter</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Procedure Type</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Details/Name</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Related Report</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Actions</th>
+                    </tr>
+                </thead>
+                <tbody class="bg-white divide-y divide-gray-200">
+                    {% for proc in procedures %}
+                    <tr class="hover:bg-gray-50">
+                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ proc.procedureDateTime.strftime('%d/%m/%Y %H:%M') if proc.procedureDateTime else 'N/A' }}</td>
+                        <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
+                            <a href="{{ url_for('patients.patient_detail', patient_id=proc.patient.id) }}" class="text-blue-600 hover:underline">{{ proc.patient.full_name }}</a>
+                        </td>
+                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
+                            <a href="{{ url_for('patients.encounter_measurements', patient_id=proc.patient.id, encounter_id=proc.encounter.encounterID) }}" class="text-blue-600 hover:underline">
+                                {{ proc.encounter.custom_encounter_id or proc.encounter.encounterID }}
+                            </a>
+                        </td>
+                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">{{ proc.procedureType }}</td>
+                        <td class="px-6 py-4 text-sm text-gray-500 max-w-xs truncate" title="{{ proc.procedureName or proc.description or '' }}">
+                            {{ proc.procedureName or proc.description or 'N/A' }}
+                        </td>
+                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
+                            {% set related_report = proc.related_reports.first() %}
+                            {% if related_report %}
+                                <a href="{{ url_for('report.view_report', report_id=related_report.id) }}" class="text-blue-600 hover:underline" title="View Report #{{ related_report.id }}">
+                                    <i class="fas fa-file-alt mr-1"></i> Report #{{ related_report.id }}
+                                </a>
+                            {% else %}
+                                -
+                            {% endif %}
+                        </td>
+                        <td class="px-6 py-4 whitespace-nowrap text-sm font-medium space-x-2">
+                            <a href="#" class="text-indigo-600 hover:text-indigo-900" title="Edit Procedure (Future)"><i class="fas fa-edit"></i></a>
+                            <a href="#" class="text-red-600 hover:text-red-900" title="Delete Procedure (Future)"><i class="fas fa-trash-alt"></i></a>
+                        </td>
+                    </tr>
+                    {% else %}
+                    <tr>
+                        <td colspan="7" class="px-6 py-10 text-center text-gray-500 text-sm">
+                            No procedures found matching the criteria.
+                            {% if not selected_patient_id %}<br>Select a patient to add a new procedure.{% endif %}
+                        </td>
+                    </tr>
+                    {% endfor %}
+                </tbody>
+            </table>
+        </div>
+
+        <!-- Pagination -->
+        {% if pagination and pagination.total > pagination.per_page %}
+        <div class="bg-white px-4 py-3 flex items-center justify-between border-t border-gray-200 sm:px-6">
+            <div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between">
+                <div>
+                    <p class="text-sm text-gray-700">
+                        Showing <span class="font-medium">{{ (pagination.page - 1) * pagination.per_page + 1 }}</span>
+                        to <span class="font-medium">{{ pagination.page * pagination.per_page if pagination.page * pagination.per_page <= pagination.total else pagination.total }}</span>
+                        of <span class="font-medium">{{ pagination.total }}</span> results
+                    </p>
+                </div>
+                <div>
+                    <nav class="relative z-0 inline-flex rounded-md shadow-sm -space-x-px" aria-label="Pagination">
+                        <a href="{{ url_for('.list_procedures', page=pagination.prev_num, patient_id=selected_patient_id) if pagination.has_prev else '#' }}"
+                           class="relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 {{ 'opacity-50 cursor-not-allowed' if not pagination.has_prev else '' }}">
+                            <span class="sr-only">Previous</span>
+                            <i class="fas fa-chevron-left h-5 w-5"></i>
+                        </a>
+                        {% for page_num in pagination.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %}
+                            {% if page_num %}
+                                <a href="{{ url_for('.list_procedures', page=page_num, patient_id=selected_patient_id) }}"
+                                   class="relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium 
+                                   {% if page_num == pagination.page %}bg-blue-50 border-blue-500 text-blue-600 z-10{% else %}bg-white text-gray-500 hover:bg-gray-50{% endif %}">
+                                    {{ page_num }}
+                                </a>
+                            {% else %}
+                                <span class="relative inline-flex items-center px-4 py-2 border border-gray-300 bg-white text-sm font-medium text-gray-700">...</span>
+                            {% endif %}
+                        {% endfor %}
+                        <a href="{{ url_for('.list_procedures', page=pagination.next_num, patient_id=selected_patient_id) if pagination.has_next else '#' }}"
+                           class="relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 {{ 'opacity-50 cursor-not-allowed' if not pagination.has_next else '' }}">
+                            <span class="sr-only">Next</span>
+                            <i class="fas fa-chevron-right h-5 w-5"></i>
+                        </a>
+                    </nav>
+                </div>
+            </div>
+        </div>
+        {% endif %}
+    </div>
+</div>
+{% endblock %} 
\ No newline at end of file
diff --git a/app/templates/dietitians/edit_admin.html b/app/templates/dietitians/edit_admin.html
new file mode 100644
index 0000000000000000000000000000000000000000..c57cd1a9b607040d0845b58c6862c35e59cefaa1
--- /dev/null
+++ b/app/templates/dietitians/edit_admin.html
@@ -0,0 +1,101 @@
+{% extends "base.html" %}
+
+{% block title %}Chỉnh sửa chuyên gia dinh dưỡng - Admin{% endblock %}
+
+{% block content %}
+<div class="container mx-auto px-4 py-8 animate-fade-in">
+    <!-- Breadcrumb -->
+    <div class="mb-6">
+        <nav class="flex" aria-label="Breadcrumb">
+            <ol class="inline-flex items-center space-x-1 md:space-x-3">
+                <li class="inline-flex items-center">
+                    <a href="{{ url_for('dashboard.index') }}" class="inline-flex items-center text-sm font-medium text-gray-700 hover:text-blue-600 transition duration-200">
+                        <i class="fas fa-tachometer-alt mr-2"></i> Dashboard
+                    </a>
+                </li>
+                <li>
+                    <div class="flex items-center">
+                        <i class="fas fa-chevron-right text-gray-400 mx-2"></i>
+                        <a href="{{ url_for('dietitians.index') }}" class="ml-1 text-sm font-medium text-gray-700 hover:text-blue-600 md:ml-2 transition duration-200">Chuyên gia dinh dưỡng</a>
+                    </div>
+                </li>
+                <li aria-current="page">
+                    <div class="flex items-center">
+                        <i class="fas fa-chevron-right text-gray-400 mx-2"></i>
+                        <span class="ml-1 text-sm font-medium text-gray-500 md:ml-2">Chỉnh sửa: {{ dietitian.full_name }}</span>
+                    </div>
+                </li>
+            </ol>
+        </nav>
+    </div>
+
+    <h1 class="text-2xl font-semibold text-gray-800 mb-6">Chỉnh sửa thông tin: {{ dietitian.full_name }} ({{ dietitian.formattedID }})</h1>
+
+    <form method="POST" action="{{ url_for('dietitians.edit', id=dietitian.dietitianID) }}" class="bg-white shadow-md rounded-lg px-8 pt-6 pb-8 mb-4">
+        {# Assume CSRF token is handled by Flask-WTF or you add it manually #}
+        {# <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> #}
+        
+        <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
+            <!-- First Name -->
+            <div>
+                <label for="firstName" class="block text-sm font-medium text-gray-700 mb-1">Họ <span class="text-red-500">*</span></label>
+                <input type="text" id="firstName" name="firstName" value="{{ dietitian.firstName or '' }}" required 
+                       class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+            </div>
+
+            <!-- Last Name -->
+            <div>
+                <label for="lastName" class="block text-sm font-medium text-gray-700 mb-1">Tên <span class="text-red-500">*</span></label>
+                <input type="text" id="lastName" name="lastName" value="{{ dietitian.lastName or '' }}" required 
+                       class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+            </div>
+
+            <!-- Email -->
+            <div>
+                <label for="email" class="block text-sm font-medium text-gray-700 mb-1">Email <span class="text-red-500">*</span></label>
+                <input type="email" id="email" name="email" value="{{ dietitian.email or '' }}" required 
+                       class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+            </div>
+
+            <!-- Phone -->
+            <div>
+                <label for="phone" class="block text-sm font-medium text-gray-700 mb-1">Số điện thoại</label>
+                <input type="tel" id="phone" name="phone" value="{{ dietitian.phone or '' }}" 
+                       class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+            </div>
+
+            <!-- Specialization -->
+            <div class="md:col-span-2">
+                <label for="specialization" class="block text-sm font-medium text-gray-700 mb-1">Chuyên môn</label>
+                <input type="text" id="specialization" name="specialization" value="{{ dietitian.specialization or '' }}" 
+                       class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+            </div>
+            
+             <!-- Status (Read-only for Admin in this form - maybe changed via separate action) -->
+            <div>
+                <label class="block text-sm font-medium text-gray-700 mb-1">Trạng thái</label>
+                <span class="inline-flex items-center px-3 py-1.5 rounded-full text-sm font-medium bg-{{ dietitian.get_status_badge_class() }}-100 text-{{ dietitian.get_status_badge_class() }}-800">
+                    {{ dietitian.status.value if dietitian.status else 'Không xác định' }}
+                </span>
+                <p class="text-xs text-gray-500 mt-1">Trạng thái hiện không thể thay đổi trực tiếp tại đây.</p>
+            </div>
+
+            <!-- Notes -->
+            <div class="md:col-span-2">
+                <label for="notes" class="block text-sm font-medium text-gray-700 mb-1">Ghi chú</label>
+                <textarea id="notes" name="notes" rows="4" 
+                          class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border border-gray-300 rounded-md">{{ dietitian.notes or '' }}</textarea>
+            </div>
+        </div>
+
+        <div class="flex items-center justify-end space-x-4">
+            <a href="{{ url_for('dietitians.index') }}" class="bg-gray-200 hover:bg-gray-300 text-gray-800 font-medium py-2 px-4 rounded-md transition duration-300">
+                Hủy bỏ
+            </a>
+            <button type="submit" class="bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-md transition duration-300">
+                <i class="fas fa-save mr-2"></i> Lưu thay đổi
+            </button>
+        </div>
+    </form>
+</div>
+{% endblock %} 
\ No newline at end of file
diff --git a/app/templates/dietitians/index.html b/app/templates/dietitians/index.html
index 3857a0700f1590e668dc729c0946f97b9478c5c5..c32b98148ddad5ac46dc2d1283475755c50ff1fc 100644
--- a/app/templates/dietitians/index.html
+++ b/app/templates/dietitians/index.html
@@ -11,7 +11,7 @@
     <nav class="mb-6" aria-label="Breadcrumb">
         <ol class="inline-flex items-center space-x-1 md:space-x-3">
             <li class="inline-flex items-center">
-                <a href="{{ url_for('handle_root') }}" class="inline-flex items-center text-sm font-medium text-gray-700 hover:text-primary-600 transition duration-200">
+                <a href="{{ url_for('main.handle_root') }}" class="inline-flex items-center text-sm font-medium text-gray-700 hover:text-primary-600 transition duration-200">
                     <svg class="w-4 h-4 mr-2" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z"></path></svg>
                     Trang chủ
                 </a>
@@ -28,7 +28,7 @@
     <div class="flex justify-between items-center mb-6">
         <h1 class="text-2xl font-semibold text-gray-900">Danh sách Chuyên gia dinh dưỡng</h1>
         {% if current_user.is_admin %}
-        <a href="{{ url_for('dietitians.new') }}" class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-primary-600 hover:bg-primary-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 transition duration-200">
+        <a href="{{ url_for('dietitians.new') }}" class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition duration-200">
             <svg class="-ml-1 mr-2 h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
                 <path fill-rule="evenodd" d="M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z" clip-rule="evenodd" />
             </svg>
diff --git a/app/templates/dietitians/new.html b/app/templates/dietitians/new.html
new file mode 100644
index 0000000000000000000000000000000000000000..dea99df4f03e6655b09390a17a75e52052115d98
--- /dev/null
+++ b/app/templates/dietitians/new.html
@@ -0,0 +1,114 @@
+{% extends "base.html" %}
+
+{% block title %}Thêm chuyên gia dinh dưỡng mới - Admin{% endblock %}
+
+{% block content %}
+<div class="container mx-auto px-4 py-8 animate-fade-in">
+    <!-- Breadcrumb -->
+    <div class="mb-6">
+        <nav class="flex" aria-label="Breadcrumb">
+            <ol class="inline-flex items-center space-x-1 md:space-x-3">
+                <li class="inline-flex items-center">
+                    <a href="{{ url_for('dashboard.index') }}" class="inline-flex items-center text-sm font-medium text-gray-700 hover:text-blue-600 transition duration-200">
+                        <i class="fas fa-tachometer-alt mr-2"></i> Dashboard
+                    </a>
+                </li>
+                <li>
+                    <div class="flex items-center">
+                        <i class="fas fa-chevron-right text-gray-400 mx-2"></i>
+                        <a href="{{ url_for('dietitians.index') }}" class="ml-1 text-sm font-medium text-gray-700 hover:text-blue-600 md:ml-2 transition duration-200">Chuyên gia dinh dưỡng</a>
+                    </div>
+                </li>
+                <li aria-current="page">
+                    <div class="flex items-center">
+                        <i class="fas fa-chevron-right text-gray-400 mx-2"></i>
+                        <span class="ml-1 text-sm font-medium text-gray-500 md:ml-2">Thêm mới</span>
+                    </div>
+                </li>
+            </ol>
+        </nav>
+    </div>
+
+    <h1 class="text-2xl font-semibold text-gray-800 mb-6">Tạo tài khoản chuyên gia dinh dưỡng mới</h1>
+
+    {# Lưu ý: Route dietitians.new hiện tại có thể chưa xử lý hết các field này, cần cập nhật route #}
+    <form method="POST" action="{{ url_for('dietitians.new') }}" class="bg-white shadow-md rounded-lg px-8 pt-6 pb-8 mb-4">
+        {# Assume CSRF token is handled #}
+
+        <h3 class="text-lg font-medium text-gray-900 mb-4 border-b pb-2">Thông tin tài khoản (User)</h3>
+        <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
+            <!-- First Name -->
+            <div>
+                <label for="firstName" class="block text-sm font-medium text-gray-700 mb-1">Họ <span class="text-red-500">*</span></label>
+                <input type="text" id="firstName" name="firstName" required 
+                       class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+            </div>
+
+            <!-- Last Name -->
+            <div>
+                <label for="lastName" class="block text-sm font-medium text-gray-700 mb-1">Tên <span class="text-red-500">*</span></label>
+                <input type="text" id="lastName" name="lastName" required 
+                       class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+            </div>
+
+            <!-- Email -->
+            <div>
+                <label for="email" class="block text-sm font-medium text-gray-700 mb-1">Email <span class="text-red-500">*</span></label>
+                <input type="email" id="email" name="email" required 
+                       class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+            </div>
+            
+            <!-- Password -->
+            <div>
+                <label for="password" class="block text-sm font-medium text-gray-700 mb-1">Mật khẩu <span class="text-red-500">*</span></label>
+                <input type="password" id="password" name="password" required 
+                       class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+                 <p class="text-xs text-gray-500 mt-1">Mật khẩu tạm thời cho người dùng mới.</p>
+            </div>
+        </div>
+
+        <h3 class="text-lg font-medium text-gray-900 mb-4 border-b pb-2">Thông tin hồ sơ (Dietitian Profile)</h3>
+        <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
+             <!-- Phone -->
+            <div>
+                <label for="phone" class="block text-sm font-medium text-gray-700 mb-1">Số điện thoại</label>
+                <input type="tel" id="phone" name="phone" 
+                       class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+            </div>
+
+            <!-- Specialization -->
+            <div>
+                <label for="specialization" class="block text-sm font-medium text-gray-700 mb-1">Chuyên môn</label>
+                <input type="text" id="specialization" name="specialization" 
+                       class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+            </div>
+            
+            <!-- Status -->
+             <div>
+                <label for="status" class="block text-sm font-medium text-gray-700 mb-1">Trạng thái <span class="text-red-500">*</span></label>
+                <select id="status" name="status" required class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border-gray-300 rounded-md">
+                    {% for status_item in status_options %}
+                        <option value="{{ status_item.name }}" {% if status_item.name == 'AVAILABLE' %}selected{% endif %}>{{ status_item.value.replace('_', ' ').title() }}</option>
+                    {% endfor %}
+                </select>
+            </div>
+
+             <!-- Notes -->
+            <div class="md:col-span-2">
+                <label for="notes" class="block text-sm font-medium text-gray-700 mb-1">Ghi chú</label>
+                <textarea id="notes" name="notes" rows="3" 
+                          class="shadow-sm focus:ring-blue-500 focus:border-blue-500 block w-full sm:text-sm border border-gray-300 rounded-md"></textarea>
+            </div>
+        </div>
+
+        <div class="flex items-center justify-end space-x-4">
+            <a href="{{ url_for('dietitians.index') }}" class="bg-gray-200 hover:bg-gray-300 text-gray-800 font-medium py-2 px-4 rounded-md transition duration-300">
+                Hủy bỏ
+            </a>
+            <button type="submit" class="bg-blue-600 hover:bg-blue-700 text-white font-medium py-2 px-4 rounded-md transition duration-300">
+                <i class="fas fa-user-plus mr-2"></i> Tạo tài khoản
+            </button>
+        </div>
+    </form>
+</div>
+{% endblock %} 
\ No newline at end of file
diff --git a/app/templates/edit_patient.html b/app/templates/edit_patient.html
index 33d258efffa43c5733e7d14dc356c5ea84c046bd..726a30602c22b569ea0bf6cfc297cef2ef36735f 100644
--- a/app/templates/edit_patient.html
+++ b/app/templates/edit_patient.html
@@ -54,6 +54,9 @@
     <div class="bg-white rounded-lg shadow-md overflow-hidden">
         <div class="p-6">
             <form method="POST" action="{{ url_for('patients.edit_patient', patient_id=patient.patient_id) }}">
+                <!-- CSRF Token -->
+                <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
+                
                 <!-- Patient ID (read-only) -->
                 <div class="mb-4">
                     <label for="patient_id" class="block text-sm font-medium text-gray-700 mb-1">Patient ID</label>
diff --git a/app/templates/encounter_measurements.html b/app/templates/encounter_measurements.html
index 3a36dcd8467da1fa6d0c12dcb3bd7bd2a0da8200..de0d872f1ddcf2a55e61347c01a9d1e28f5385a1 100644
--- a/app/templates/encounter_measurements.html
+++ b/app/templates/encounter_measurements.html
@@ -14,7 +14,7 @@
         <nav class="flex" aria-label="Breadcrumb">
             <ol class="inline-flex items-center space-x-1 md:space-x-3">
                 <li class="inline-flex items-center">
-                    <a href="{{ url_for('handle_root') }}" class="inline-flex items-center text-sm font-medium text-gray-700 hover:text-blue-600 transition duration-200">
+                    <a href="{{ url_for('main.handle_root') }}" class="inline-flex items-center text-sm font-medium text-gray-700 hover:text-blue-600 transition duration-200">
                         <i class="fas fa-home mr-2"></i> Home
                     </a>
                 </li>
@@ -46,9 +46,38 @@
         {# Hiển thị custom_encounter_id trong tiêu đề section #}
         <h3 class="text-lg font-semibold mb-2">Encounter Details (ID: {{ display_encounter_id }})</h3>
         <div class="grid grid-cols-1 md:grid-cols-3 gap-4 text-sm">
-            <p><strong>Start Time:</strong> {{ encounter.start_time.strftime('%d/%m/%Y %H:%M') if encounter.start_time else 'N/A' }}</p>
-            <p><strong>Status:</strong> {{ encounter_status }}</p> <!-- Sử dụng biến encounter_status -->
-            <p><strong>Dietitian:</strong> {{ encounter.assigned_dietitian.full_name if encounter.assigned_dietitian else 'None' }}</p>
+            <div><strong>Start Time:</strong> {{ encounter.start_time.strftime('%d/%m/%Y %H:%M') if encounter.start_time else 'N/A' }}</div>
+            {# Sửa cách hiển thị status #}
+            <div><strong>Status:</strong> <span class="px-2 py-0.5 text-xs font-semibold rounded-full bg-{{ status.color if status and status.color else 'gray' }}-100 text-{{ status.color if status and status.color else 'gray' }}-800">{{ status.text if status and status.text else 'Unknown' }}</span></div>
+            <div><strong>Dietitian:</strong> {{ encounter.assigned_dietitian.full_name if encounter.assigned_dietitian else 'None' }}</div>
+            {# Thêm hiển thị ML Intervention Status #}
+            <div class="md:col-span-3">
+                 <strong>ML Intervention Status:</strong>
+                 {% if encounter.needs_intervention is none %}
+                     {# Trường hợp chưa đánh giá #}
+                     <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-gray-100 text-gray-800">
+                         <i class="fas fa-question-circle mr-1"></i> Not Evaluated
+                     </span>
+                 {% elif encounter.needs_intervention %}
+                     {# Trường hợp cần can thiệp #}
+                     <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-red-100 text-red-800">
+                         <i class="fas fa-exclamation-triangle mr-1"></i> Needs Intervention
+                     </span>
+                 {% else %}
+                     {# Trường hợp không cần can thiệp #}
+                     <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800">
+                         <i class="fas fa-check-circle mr-1"></i> No Intervention Needed
+                     </span>
+                 {% endif %}
+                 {# Thêm nút Run ML Prediction ở đây #}
+                 <form action="{{ url_for('patients.run_encounter_ml', patient_id=patient.id, encounter_id=encounter.encounterID) }}" method="POST" class="inline-block ml-4">
+                    {# Sử dụng EmptyForm để tạo CSRF token nếu cần #}
+                    {{ EmptyForm().csrf_token }}
+                    <button type="submit" class="inline-flex items-center px-2.5 py-1 border border-transparent text-xs font-medium rounded shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-all duration-150 ease-in-out transform hover:scale-105" title="Run ML prediction based on latest measurement">
+                        <i class="fas fa-brain mr-1"></i> Run ML
+                    </button>
+                 </form>
+             </div>
         </div>
     </div>
 
@@ -88,14 +117,15 @@
         </div>
         <div class="mt-3 text-center">
             <p class="text-sm text-gray-600">Giá trị gần nhất</p>
-            <p class="text-xl font-bold latest-value" data-metric-name="{{ metric_name }}">{{ latest_value if latest_value is not none else 'N/A' }} {{ unit }}</p>
+            {# Định dạng lại giá trị nếu là số #}
+            <p class="text-xl font-bold latest-value" data-metric-name="{{ metric_name }}">{% if latest_value is number %}{{ "%.1f"|format(latest_value) }}{% else %}{{ latest_value if latest_value is not none else 'N/A' }}{% endif %} {{ unit }}</p>
         </div>
         <div class="mt-3 pt-3 border-t border-gray-200">
             <div class="quick-input-container flex items-stretch gap-2" data-metric="{{ metric_name }}">
-                <input type="number" step="any" placeholder="Giá trị mới..." 
+                <input type="number" step="any" placeholder="Giá trị mới..."
                        class="quick-measurement-input flex-grow p-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all duration-300 ease-in-out"
                        data-metric="{{ metric_name }}">
-                <button type="button" 
+                <button type="button"
                         class="quick-save-btn flex-shrink-0 bg-blue-500 hover:bg-blue-600 text-white px-3 py-2 rounded-lg shadow-md flex items-center justify-center transform transition-all duration-300 ease-in-out will-change-transform"
                         style="transform: scale(0); opacity: 0; pointer-events: none;"
                         data-metric="{{ metric_name }}">
@@ -126,14 +156,14 @@
         <div class="mt-3 pt-3 border-t border-gray-200">
             <div class="quick-input-container bp-container flex flex-col gap-2" data-metric="bloodPressure">
                 <div class="flex gap-2 w-full">
-                    <input type="number" step="1" placeholder="Tâm thu..." 
+                    <input type="number" step="1" placeholder="Tâm thu..."
                            class="quick-measurement-input w-1/2 p-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all duration-300 ease-in-out"
                            data-metric="systolicBP">
-                    <input type="number" step="1" placeholder="Tâm trương..." 
+                    <input type="number" step="1" placeholder="Tâm trương..."
                            class="quick-measurement-input w-1/2 p-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all duration-300 ease-in-out"
                            data-metric="diastolicBP">
                 </div>
-                <button type="button" 
+                <button type="button"
                         class="quick-save-btn w-full opacity-0 transform scale-95 pointer-events-none bg-blue-500 hover:bg-blue-600 text-white px-3 py-2 rounded-lg transition-all duration-300 ease-in-out shadow-md flex items-center justify-center"
                         data-metric="bloodPressure">
                     <i class="fas fa-save mr-2"></i> Lưu huyết áp
@@ -143,7 +173,6 @@
     </div>
     {% endmacro %}
 
-    {% if measurements %}
     <!-- Grid layout for charts -->
     <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mb-6">
         {{ chart_card('temperatureChart', 'Nhiệt độ', latest_measurement.temperature, '°C', 'temperature') }}
@@ -166,34 +195,60 @@
         {{ chart_card('inspTimeChart', 'Thời gian hít vào (Insp Time)', latest_measurement.insp_time, 's', 'insp_time') }}
         {# {{ chart_card('oxygenFlowRateChart', 'Oxygen Flow Rate', latest_measurement.oxygen_flow_rate, 'L/min', 'oxygen_flow_rate') }} #} {# Thêm nếu cần #}
     </div>
-    {% else %}
-    <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 mb-6">
-        {{ chart_card('temperatureChart', 'Nhiệt độ', 'N/A', '°C', 'temperature') }}
-        {{ chart_card('heartRateChart', 'Nhịp tim', 'N/A', 'bpm', 'heart_rate') }}
-        {{ bp_chart_card() }}
-        {{ chart_card('oxygenSaturationChart', 'SpO₂', 'N/A', '%', 'oxygen_saturation') }}
-        {{ chart_card('respRateChart', 'Nhịp thở', 'N/A', 'bpm', 'resp_rate') }} {# Đổi tên chart_id và metric #}
-        {{ chart_card('fio2Chart', 'FiO₂', 'N/A', '%', 'fio2') }}
-        {{ chart_card('fio2RatioChart', 'Tỷ lệ FiO₂', 'N/A', '', 'fio2_ratio') }}
-        {{ chart_card('tidalVolChart', 'Thể tích khí lưu thông (Tidal Vol)', 'N/A', 'mL', 'tidal_vol') }}
-        {{ chart_card('tidalVolKgChart', 'Tidal Vol/kg', 'N/A', 'mL/kg', 'tidal_vol_kg') }}
-        {{ chart_card('tidalVolActualChart', 'Tidal Vol thực tế (Actual)', 'N/A', 'mL', 'tidal_vol_actual') }}
-        {{ chart_card('tidalVolSponChart', 'Tidal Vol tự phát (Spon)', 'N/A', 'mL', 'tidal_vol_spon') }}
-        {{ chart_card('endTidalCO2Chart', 'End Tidal CO₂', 'N/A', 'mmHg', 'end_tidal_co2') }}
-        {{ chart_card('feedVolChart', 'Thể tích thức ăn (Feed Vol)', 'N/A', 'mL', 'feed_vol') }}
-        {{ chart_card('feedVolAdmChart', 'Feed Vol Adm', 'N/A', 'mL', 'feed_vol_adm') }}
-        {{ chart_card('peepChart', 'PEEP', 'N/A', 'cmH₂O', 'peep') }}
-        {{ chart_card('pipChart', 'PIP', 'N/A', 'cmH₂O', 'pip') }}
-        {{ chart_card('sipChart', 'SIP', 'N/A', 'cmH₂O', 'sip') }}
-        {{ chart_card('inspTimeChart', 'Thời gian hít vào (Insp Time)', 'N/A', 's', 'insp_time') }}
-    </div>
-    <div class="text-center p-6 bg-gray-50 rounded-lg border border-gray-200">
-        <p class="text-gray-600 mb-4">Chưa có dữ liệu đo lường nào cho lượt khám này.</p>
-        <!-- Nút thêm đo lường thủ công có thể đặt ở đây -->
-    </div>
+
+    {% if not measurements %}
+     <!-- Quick Save Section when no measurements yet -->
+     <div class="bg-white p-4 rounded-lg shadow-md mb-6">
+         <h3 class="font-semibold text-gray-800 mb-3">Add First Measurement Values</h3> {# Sửa tiêu đề #}
+         {# Giảm padding và gap để gọn hơn #}
+         <div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3"> {# Thay đổi grid và gap #}
+              <!-- Temperature -->
+              <div class="quick-input-container flex flex-col gap-1" data-metric="temperature">
+                 <label for="q-temp" class="text-xs font-medium text-gray-500">Nhiệt độ (°C)</label> {# Giảm cỡ chữ label #}
+                 <div class="flex items-stretch">
+                    <input id="q-temp" type="number" step="0.1" placeholder="--" class="quick-measurement-input flex-grow p-1.5 border rounded-l-md focus:outline-none focus:ring-1 focus:ring-blue-500 text-sm" data-metric="temperature"> {# Giảm padding, cỡ chữ #}
+                    <button type="button" class="quick-save-btn flex-shrink-0 bg-blue-500 hover:bg-blue-600 text-white px-2 rounded-r-lg transition-opacity duration-200 opacity-0 pointer-events-none" data-metric="temperature"><i class="fas fa-save text-xs"></i></button> {# Giảm cỡ chữ icon #}
+                 </div>
+              </div>
+             <!-- Heart Rate -->
+             <div class="quick-input-container flex flex-col gap-1" data-metric="heart_rate">
+                 <label for="q-hr" class="text-xs font-medium text-gray-500">Nhịp tim (bpm)</label> {# Giảm cỡ chữ label #}
+                 <div class="flex items-stretch">
+                    <input id="q-hr" type="number" step="1" placeholder="--" class="quick-measurement-input flex-grow p-1.5 border rounded-l-md focus:outline-none focus:ring-1 focus:ring-blue-500 text-sm" data-metric="heart_rate"> {# Giảm padding, cỡ chữ #}
+                    <button type="button" class="quick-save-btn flex-shrink-0 bg-blue-500 hover:bg-blue-600 text-white px-2 rounded-r-lg transition-opacity duration-200 opacity-0 pointer-events-none" data-metric="heart_rate"><i class="fas fa-save text-xs"></i></button> {# Giảm cỡ chữ icon #}
+                 </div>
+             </div>
+              <!-- Blood Pressure -->
+             <div class="quick-input-container bp-container flex flex-col gap-1 col-span-2 md:col-span-2 lg:col-span-2" data-metric="bloodPressure">
+                 <label class="text-xs font-medium text-gray-500">Huyết áp (mmHg)</label>
+                 <div class="flex items-stretch gap-2">
+                     <input type="number" step="1" placeholder="Tâm thu" class="quick-measurement-input w-1/2 p-1.5 border rounded-lg focus:outline-none focus:ring-1 focus:ring-blue-500 text-sm" data-metric="systolicBP"> {# Giảm padding, cỡ chữ #}
+                     <input type="number" step="1" placeholder="Tâm trương" class="quick-measurement-input w-1/2 p-1.5 border rounded-lg focus:outline-none focus:ring-1 focus:ring-blue-500 text-sm" data-metric="diastolicBP"> {# Giảm padding, cỡ chữ #}
+                 </div>
+                  <button type="button" class="quick-save-btn mt-1 w-full opacity-0 pointer-events-none bg-blue-500 hover:bg-blue-600 text-white px-3 py-1 rounded-lg transition-opacity duration-200 flex items-center justify-center text-sm" data-metric="bloodPressure"><i class="fas fa-save mr-1 text-xs"></i> Lưu HA</button> {# Giảm cỡ chữ icon #}
+             </div>
+            <!-- SpO2 -->
+             <div class="quick-input-container flex flex-col gap-1" data-metric="oxygen_saturation">
+                 <label for="q-spo2" class="text-xs font-medium text-gray-500">SpO₂ (%)</label> {# Giảm cỡ chữ label #}
+                 <div class="flex items-stretch">
+                     <input id="q-spo2" type="number" step="0.1" placeholder="--" class="quick-measurement-input flex-grow p-1.5 border rounded-l-md focus:outline-none focus:ring-1 focus:ring-blue-500 text-sm" data-metric="oxygen_saturation"> {# Giảm padding, cỡ chữ #}
+                     <button type="button" class="quick-save-btn flex-shrink-0 bg-blue-500 hover:bg-blue-600 text-white px-2 rounded-r-lg transition-opacity duration-200 opacity-0 pointer-events-none" data-metric="oxygen_saturation"><i class="fas fa-save text-xs"></i></button> {# Giảm cỡ chữ icon #}
+                 </div>
+             </div>
+             <!-- Resp Rate -->
+             <div class="quick-input-container flex flex-col gap-1" data-metric="resp_rate">
+                 <label for="q-rr" class="text-xs font-medium text-gray-500">Nhịp thở (bpm)</label> {# Giảm cỡ chữ label #}
+                 <div class="flex items-stretch">
+                     <input id="q-rr" type="number" step="1" placeholder="--" class="quick-measurement-input flex-grow p-1.5 border rounded-l-md focus:outline-none focus:ring-1 focus:ring-blue-500 text-sm" data-metric="resp_rate"> {# Giảm padding, cỡ chữ #}
+                     <button type="button" class="quick-save-btn flex-shrink-0 bg-blue-500 hover:bg-blue-600 text-white px-2 rounded-r-lg transition-opacity duration-200 opacity-0 pointer-events-none" data-metric="resp_rate"><i class="fas fa-save text-xs"></i></button> {# Giảm cỡ chữ icon #}
+                 </div>
+             </div>
+             <!-- Add more quick input fields here if needed -->
+         </div>
+     </div>
     {% endif %}
 
-     <!-- Bảng dữ liệu đo lường (Optional) -->
+     <!-- Bảng dữ liệu đo lường -->
      <div class="mt-8">
          <h3 class="text-xl font-semibold text-gray-800 mb-4">Measurement History for this Encounter</h3>
          <div class="bg-white shadow overflow-hidden sm:rounded-lg">
@@ -311,6 +366,9 @@ function createChart(canvasId, label, data, unit, chartType = 'line', color = 'r
                             return `${label}: ${context.parsed.y} ${unit}`;
                         }
                     }
+                },
+                 legend: {
+                    display: false // Tắt legend mặc định cho các biểu đồ đơn
                 }
             }
         }
@@ -362,20 +420,38 @@ function createBPChart(canvasId, data) {
                     callbacks: {
                         label: function(context) { return `${context.dataset.label}: ${context.parsed.y} mmHg`; }
                     }
-                }
+                },
+                 legend: {
+                     display: true // Bật legend cho biểu đồ BP
+                 }
             }
         }
     });
 }
 
 // Hàm hiện toast thông báo (giống physical_measurements.html)
-function showToast(message, type = 'success') {
+function showToast(message, type = 'success', duration = 3000) {
     const toastContainer = document.getElementById('toast-container');
+    if (!toastContainer) return;
+    const toastId = `toast-${Date.now()}`;
     const toast = document.createElement('div');
-    toast.className = `flex items-center px-4 py-3 rounded shadow-md max-w-sm transition-all duration-300 ease-out ${ type === 'success' ? 'bg-green-50 text-green-800 border-l-4 border-green-500' : type === 'error' ? 'bg-red-50 text-red-800 border-l-4 border-red-500' : 'bg-blue-50 text-blue-800 border-l-4 border-blue-500' }`;
-    toast.innerHTML = `<i class="fas fa-${type === 'success' ? 'check-circle' : type === 'error' ? 'exclamation-circle' : 'info-circle'} mr-2"></i><span class="text-sm">${message}</span>`;
+    toast.id = toastId;
+    toast.className = `flex items-center px-4 py-3 rounded shadow-md max-w-xs transition-all duration-500 ease-out transform translate-x-full opacity-0 ${ type === 'success' ? 'bg-green-50 text-green-800 border-l-4 border-green-500' : type === 'error' ? 'bg-red-50 text-red-800 border-l-4 border-red-500' : 'bg-blue-50 text-blue-800 border-l-4 border-blue-500' }`;
+    toast.innerHTML = `<i class="fas fa-${type === 'success' ? 'check-circle' : type === 'error' ? 'exclamation-circle' : 'info-circle'} mr-2 flex-shrink-0"></i><span class="text-sm flex-grow">${message}</span>`;
     toastContainer.appendChild(toast);
-    setTimeout(() => { toast.classList.add('opacity-0'); setTimeout(() => { toast.remove(); }, 300); }, 3000);
+
+    // Trigger animation
+    requestAnimationFrame(() => {
+         toast.classList.remove('translate-x-full', 'opacity-0');
+         toast.classList.add('translate-x-0', 'opacity-100');
+     });
+
+    // Auto-dismiss
+    setTimeout(() => {
+         toast.classList.remove('opacity-100', 'translate-x-0');
+         toast.classList.add('opacity-0', 'translate-x-full');
+         setTimeout(() => { toast.remove(); }, 500); // Remove after animation
+     }, duration);
 }
 
 // Hàm cập nhật biểu đồ đơn lẻ (thêm 1 điểm) (giống physical_measurements.html)
@@ -384,7 +460,9 @@ function addDataPointToChart(chart, newDataPoint) {
         console.error(`Invalid data or chart config for adding point:`, chart, newDataPoint);
         return;
     }
+    // Thêm điểm mới và sắp xếp lại dữ liệu theo thời gian
     chart.data.datasets[0].data.push({ x: newDataPoint.measurementDateTime, y: newDataPoint[chart.metricKey] });
+    chart.data.datasets[0].data.sort((a, b) => new Date(a.x) - new Date(b.x));
     chart.update();
 }
 
@@ -392,8 +470,12 @@ function addDataPointToChart(chart, newDataPoint) {
 function addDataPointToBPChart(chart, newDataPoint) {
     if (!chart || !newDataPoint || !newDataPoint.measurementDateTime || newDataPoint.blood_pressure_systolic === undefined || newDataPoint.blood_pressure_diastolic === undefined) return;
     const time = newDataPoint.measurementDateTime;
+    // Thêm điểm mới vào cả 2 dataset
     chart.data.datasets[0].data.push({ x: time, y: newDataPoint.blood_pressure_systolic });
     chart.data.datasets[1].data.push({ x: time, y: newDataPoint.blood_pressure_diastolic });
+    // Sắp xếp lại cả 2 dataset
+    chart.data.datasets[0].data.sort((a, b) => new Date(a.x) - new Date(b.x));
+    chart.data.datasets[1].data.sort((a, b) => new Date(a.x) - new Date(b.x));
     chart.update();
 }
 
@@ -406,80 +488,115 @@ function updateLatestValues(newData) {
             let metricKey = key;
             let unit = '';
             const unitMap = {'temperature': ' °C', 'heart_rate': ' bpm', 'oxygen_saturation': ' %', 'resp_rate': ' bpm', 'fio2': ' %', 'fio2_ratio': '', 'tidal_vol': ' mL', 'tidal_vol_kg': ' mL/kg', 'tidal_vol_actual': ' mL', 'tidal_vol_spon': ' mL', 'end_tidal_co2': ' mmHg', 'feed_vol': ' mL', 'feed_vol_adm': ' mL', 'peep': ' cmH₂O', 'pip': ' cmH₂O', 'sip': ' cmH₂O', 'insp_time': ' s'};
+            let formatPrecision = (key === 'temperature' || key === 'oxygen_saturation' || key === 'fio2' || key === 'fio2_ratio' || key === 'insp_time') ? 1 : 0; // Precision for float values
+
             if (key === 'blood_pressure_systolic') {
-                if (newData['blood_pressure_diastolic'] !== undefined) {
+                if (newData['blood_pressure_diastolic'] !== undefined && newData['blood_pressure_diastolic'] !== null) {
                      valueToDisplay = `${newData.blood_pressure_systolic}/${newData.blood_pressure_diastolic}`;
                      metricKey = 'blood_pressure'; unit = ' mmHg';
-                } else return;
-            } else if (key === 'blood_pressure_diastolic') return;
+                     formatPrecision = -1; // Indicate special formatting
+                } else return; // Don't update if diastolic is missing
+            } else if (key === 'blood_pressure_diastolic') return; // Skip diastolic, handled by systolic
             else unit = unitMap[key] || '';
+
             const valueDisplay = document.querySelector(`.latest-value[data-metric-name="${metricKey}"]`);
-            if (valueDisplay) valueDisplay.textContent = valueToDisplay !== null ? `${valueToDisplay}${unit}` : 'N/A';
+            if (valueDisplay) {
+                 if (valueToDisplay !== null && valueToDisplay !== undefined) {
+                     if (formatPrecision >= 0 && typeof valueToDisplay === 'number') {
+                         valueDisplay.textContent = `${valueToDisplay.toFixed(formatPrecision)}${unit}`;
+                     } else if (formatPrecision === -1) { // BP case
+                         valueDisplay.textContent = `${valueToDisplay}${unit}`;
+                     } else {
+                         valueDisplay.textContent = `${valueToDisplay}${unit}`;
+                     }
+                 } else {
+                     valueDisplay.textContent = 'N/A';
+                 }
+             }
         } catch (e) { console.error('Lỗi khi cập nhật giá trị hiển thị:', key, e); }
     });
 }
 
-// Hàm xóa giá trị trong ô input (giống physical_measurements.html)
-function clearInputs() {
-    document.querySelectorAll('.quick-measurement-input').forEach(input => {
-        input.value = '';
-        const container = input.closest('.quick-input-container');
-        const saveBtn = container.querySelector('.quick-save-btn');
-        const isBP = container.classList.contains('bp-container');
-        if (saveBtn) {
-            if (!isBP) {
-                saveBtn.style.transform = 'scale(0)'; saveBtn.style.opacity = '0'; saveBtn.style.pointerEvents = 'none';
-            } else {
-                saveBtn.classList.add('opacity-0', 'scale-95', 'pointer-events-none');
-                saveBtn.classList.remove('opacity-100', 'scale-100', 'pointer-events-auto');
-            }
+// Hàm xóa giá trị trong ô input và ẩn nút lưu
+function clearInput(inputElement) {
+    if (!inputElement) return;
+    inputElement.value = '';
+    const container = inputElement.closest('.quick-input-container');
+    if (!container) return;
+    const saveBtn = container.querySelector('.quick-save-btn');
+    if (!saveBtn) return;
+
+    const isBP = container.classList.contains('bp-container');
+    if (!isBP) {
+        saveBtn.style.transform = 'scale(0)';
+        saveBtn.style.opacity = '0';
+        saveBtn.style.pointerEvents = 'none';
+    } else {
+        // For BP, check if both inputs are empty before hiding
+        const systolicInput = container.querySelector('input[data-metric="systolicBP"]');
+        const diastolicInput = container.querySelector('input[data-metric="diastolicBP"]');
+        if (!systolicInput.value && !diastolicInput.value) {
+            saveBtn.classList.add('opacity-0', 'pointer-events-none');
+            // Optionally add scale-95 for transition effect if desired
         }
-    });
+    }
 }
 
+// Hàm xóa tất cả input (gọi sau khi lưu thành công)
+function clearAllQuickInputs() {
+     document.querySelectorAll('.quick-measurement-input').forEach(clearInput);
+ }
+
 document.addEventListener('DOMContentLoaded', function() {
     // Lấy CSRF token (giống physical_measurements.html)
-    let csrfToken;
-    try { csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); } catch (e) { csrfToken = ""; }
-    
+    const csrfMeta = document.querySelector('meta[name="csrf-token"]');
+    const csrfToken = csrfMeta ? csrfMeta.getAttribute('content') : "{{ csrf_token() }}"; // Lấy từ meta tag hoặc fallback về Jinja
+
     // Store chart instances (giống physical_measurements.html)
-    const chartObjects = {}; 
-    
+    const chartObjects = {};
+
     var measurementsData = [];
     try {
         // Dữ liệu measurements được truyền từ route vào biến 'measurements'
         measurementsData = JSON.parse('{{ measurements|tojson|safe }}');
     } catch (e) {
         console.error('Lỗi khi phân tích dữ liệu đo lường:', e);
+        showToast('Không thể tải dữ liệu biểu đồ ban đầu.', 'error');
+    }
+
+    // Khởi tạo biểu đồ nếu có dữ liệu hoặc canvas tồn tại
+    if ((measurementsData && measurementsData.length > 0) || document.querySelector('canvas')) {
+        initializeCharts(measurementsData || []); // Truyền mảng rỗng nếu không có dữ liệu
     }
-    
-    initializeCharts(measurementsData);
-    
+
     // Hàm khởi tạo biểu đồ từ dữ liệu (giống physical_measurements.html, nhưng dùng dữ liệu 'measurements')
     function initializeCharts(data) {
-        const heartRateData = data.map(m => m.heart_rate !== null && m.heart_rate !== undefined ? {x: m.measurementDateTime, y: m.heart_rate} : null).filter(Boolean);
-        const temperatureData = data.map(m => m.temperature !== null && m.temperature !== undefined ? {x: m.measurementDateTime, y: m.temperature} : null).filter(Boolean);
-        const bloodPressureData = data.map(m => (m.blood_pressure_systolic !== null && m.blood_pressure_systolic !== undefined && m.blood_pressure_diastolic !== null && m.blood_pressure_diastolic !== undefined) ? {x: m.measurementDateTime, systolic: m.blood_pressure_systolic, diastolic: m.blood_pressure_diastolic} : null).filter(Boolean);
-        const oxygenSaturationData = data.map(m => m.oxygen_saturation !== null && m.oxygen_saturation !== undefined ? {x: m.measurementDateTime, y: m.oxygen_saturation} : null).filter(Boolean);
-        const respRateData = data.map(m => m.resp_rate !== null && m.resp_rate !== undefined ? {x: m.measurementDateTime, y: m.resp_rate} : null).filter(Boolean);
-        const fio2Data = data.map(m => m.fio2 !== null && m.fio2 !== undefined ? {x: m.measurementDateTime, y: m.fio2} : null).filter(Boolean);
-        const fio2RatioData = data.map(m => m.fio2_ratio !== null && m.fio2_ratio !== undefined ? {x: m.measurementDateTime, y: m.fio2_ratio} : null).filter(Boolean);
-        const tidalVolData = data.map(m => m.tidal_vol !== null && m.tidal_vol !== undefined ? {x: m.measurementDateTime, y: m.tidal_vol} : null).filter(Boolean);
-        const tidalVolKgData = data.map(m => m.tidal_vol_kg !== null && m.tidal_vol_kg !== undefined ? {x: m.measurementDateTime, y: m.tidal_vol_kg} : null).filter(Boolean);
-        const tidalVolActualData = data.map(m => m.tidal_vol_actual !== null && m.tidal_vol_actual !== undefined ? {x: m.measurementDateTime, y: m.tidal_vol_actual} : null).filter(Boolean);
-        const tidalVolSponData = data.map(m => m.tidal_vol_spon !== null && m.tidal_vol_spon !== undefined ? {x: m.measurementDateTime, y: m.tidal_vol_spon} : null).filter(Boolean);
-        const endTidalCO2Data = data.map(m => m.end_tidal_co2 !== null && m.end_tidal_co2 !== undefined ? {x: m.measurementDateTime, y: m.end_tidal_co2} : null).filter(Boolean);
-        const feedVolData = data.map(m => m.feed_vol !== null && m.feed_vol !== undefined ? {x: m.measurementDateTime, y: m.feed_vol} : null).filter(Boolean);
-        const feedVolAdmData = data.map(m => m.feed_vol_adm !== null && m.feed_vol_adm !== undefined ? {x: m.measurementDateTime, y: m.feed_vol_adm} : null).filter(Boolean);
-        const peepData = data.map(m => m.peep !== null && m.peep !== undefined ? {x: m.measurementDateTime, y: m.peep} : null).filter(Boolean);
-        const pipData = data.map(m => m.pip !== null && m.pip !== undefined ? {x: m.measurementDateTime, y: m.pip} : null).filter(Boolean);
-        const sipData = data.map(m => m.sip !== null && m.sip !== undefined ? {x: m.measurementDateTime, y: m.sip} : null).filter(Boolean);
-        const inspTimeData = data.map(m => m.insp_time !== null && m.insp_time !== undefined ? {x: m.measurementDateTime, y: m.insp_time} : null).filter(Boolean);
-        
+        // Filter out null/undefined before mapping
+        const validData = data.filter(m => m && m.measurementDateTime);
+
+        const heartRateData = validData.map(m => m.heart_rate !== null && m.heart_rate !== undefined ? {x: m.measurementDateTime, y: m.heart_rate} : null).filter(Boolean);
+        const temperatureData = validData.map(m => m.temperature !== null && m.temperature !== undefined ? {x: m.measurementDateTime, y: m.temperature} : null).filter(Boolean);
+        const bloodPressureData = validData.map(m => (m.blood_pressure_systolic !== null && m.blood_pressure_systolic !== undefined && m.blood_pressure_diastolic !== null && m.blood_pressure_diastolic !== undefined) ? {x: m.measurementDateTime, systolic: m.blood_pressure_systolic, diastolic: m.blood_pressure_diastolic} : null).filter(Boolean);
+        const oxygenSaturationData = validData.map(m => m.oxygen_saturation !== null && m.oxygen_saturation !== undefined ? {x: m.measurementDateTime, y: m.oxygen_saturation} : null).filter(Boolean);
+        const respRateData = validData.map(m => m.resp_rate !== null && m.resp_rate !== undefined ? {x: m.measurementDateTime, y: m.resp_rate} : null).filter(Boolean);
+        const fio2Data = validData.map(m => m.fio2 !== null && m.fio2 !== undefined ? {x: m.measurementDateTime, y: m.fio2} : null).filter(Boolean);
+        const fio2RatioData = validData.map(m => m.fio2_ratio !== null && m.fio2_ratio !== undefined ? {x: m.measurementDateTime, y: m.fio2_ratio} : null).filter(Boolean);
+        const tidalVolData = validData.map(m => m.tidal_vol !== null && m.tidal_vol !== undefined ? {x: m.measurementDateTime, y: m.tidal_vol} : null).filter(Boolean);
+        const tidalVolKgData = validData.map(m => m.tidal_vol_kg !== null && m.tidal_vol_kg !== undefined ? {x: m.measurementDateTime, y: m.tidal_vol_kg} : null).filter(Boolean);
+        const tidalVolActualData = validData.map(m => m.tidal_vol_actual !== null && m.tidal_vol_actual !== undefined ? {x: m.measurementDateTime, y: m.tidal_vol_actual} : null).filter(Boolean);
+        const tidalVolSponData = validData.map(m => m.tidal_vol_spon !== null && m.tidal_vol_spon !== undefined ? {x: m.measurementDateTime, y: m.tidal_vol_spon} : null).filter(Boolean);
+        const endTidalCO2Data = validData.map(m => m.end_tidal_co2 !== null && m.end_tidal_co2 !== undefined ? {x: m.measurementDateTime, y: m.end_tidal_co2} : null).filter(Boolean);
+        const feedVolData = validData.map(m => m.feed_vol !== null && m.feed_vol !== undefined ? {x: m.measurementDateTime, y: m.feed_vol} : null).filter(Boolean);
+        const feedVolAdmData = validData.map(m => m.feed_vol_adm !== null && m.feed_vol_adm !== undefined ? {x: m.measurementDateTime, y: m.feed_vol_adm} : null).filter(Boolean);
+        const peepData = validData.map(m => m.peep !== null && m.peep !== undefined ? {x: m.measurementDateTime, y: m.peep} : null).filter(Boolean);
+        const pipData = validData.map(m => m.pip !== null && m.pip !== undefined ? {x: m.measurementDateTime, y: m.pip} : null).filter(Boolean);
+        const sipData = validData.map(m => m.sip !== null && m.sip !== undefined ? {x: m.measurementDateTime, y: m.sip} : null).filter(Boolean);
+        const inspTimeData = validData.map(m => m.insp_time !== null && m.insp_time !== undefined ? {x: m.measurementDateTime, y: m.insp_time} : null).filter(Boolean);
+
         const colors = ['rgba(54, 162, 235, 1)', 'rgba(255, 99, 132, 1)', 'rgba(75, 192, 192, 1)', 'rgba(255, 206, 86, 1)', 'rgba(153, 102, 255, 1)', 'rgba(255, 159, 64, 1)', 'rgba(100, 181, 246, 1)', 'rgba(240, 98, 146, 1)', 'rgba(129, 199, 132, 1)', 'rgba(255, 241, 118, 1)', 'rgba(179, 157, 219, 1)', 'rgba(255, 183, 77, 1)', 'rgba(34, 150, 243, 1)', 'rgba(233, 30, 99, 1)', 'rgba(0, 150, 136, 1)', 'rgba(255, 193, 7, 1)', 'rgba(103, 58, 183, 1)', 'rgba(255, 87, 34, 1)'];
         let colorIndex = 0;
         const nextColor = () => colors[colorIndex++ % colors.length];
-        
+
         const chartConfig = [
              { id: 'heartRateChart', label: 'Nhịp tim', data: heartRateData, unit: 'bpm', type: 'line', metric: 'heart_rate' },
              { id: 'temperatureChart', label: 'Nhiệt độ', data: temperatureData, unit: '°C', type: 'line', metric: 'temperature' },
@@ -512,40 +629,61 @@ document.addEventListener('DOMContentLoaded', function() {
             if (bpChart) { bpChart.metricKey = 'blood_pressure'; chartObjects['blood_pressure'] = bpChart; colorIndex += 2; }
         }
     }
-    
-    // Xử lý ô nhập liệu nhanh (giống physical_measurements.html)
+
+    // Xử lý ô nhập liệu nhanh
     const quickInputs = document.querySelectorAll('.quick-measurement-input');
     quickInputs.forEach(input => {
         const container = input.closest('.quick-input-container');
+        if (!container) return;
         const saveBtn = container.querySelector('.quick-save-btn');
+        if (!saveBtn) return;
         const isBP = container.classList.contains('bp-container');
         let otherInput = isBP ? container.querySelector(`.quick-measurement-input:not([data-metric="${input.dataset.metric}"])`) : null;
 
         const showSaveButton = () => {
-             if (!isBP) { saveBtn.style.transform = 'scale(1)'; saveBtn.style.opacity = '1'; saveBtn.style.pointerEvents = 'auto'; }
-             else { saveBtn.classList.remove('opacity-0', 'scale-95', 'pointer-events-none'); saveBtn.classList.add('opacity-100', 'scale-100', 'pointer-events-auto'); }
+            if (!isBP) {
+                saveBtn.style.transform = 'scale(1)';
+                saveBtn.style.opacity = '1';
+                saveBtn.style.pointerEvents = 'auto';
+            } else {
+                const systolicInput = container.querySelector('input[data-metric="systolicBP"]');
+                const diastolicInput = container.querySelector('input[data-metric="diastolicBP"]');
+                // Show BP save button only if BOTH inputs have values
+                if (systolicInput && diastolicInput && systolicInput.value && diastolicInput.value) {
+                    saveBtn.classList.remove('opacity-0', 'pointer-events-none');
+                    // Optionally add scale-100 if using scale for BP button animation
+                } else {
+                     saveBtn.classList.add('opacity-0', 'pointer-events-none');
+                }
+            }
         };
+
         const hideSaveButton = () => {
-            if (!isBP) { saveBtn.style.transform = 'scale(0)'; saveBtn.style.opacity = '0'; saveBtn.style.pointerEvents = 'none'; }
-            else { saveBtn.classList.add('opacity-0', 'scale-95', 'pointer-events-none'); saveBtn.classList.remove('opacity-100', 'scale-100', 'pointer-events-auto'); }
+            if (!isBP) {
+                saveBtn.style.transform = 'scale(0)';
+                saveBtn.style.opacity = '0';
+                saveBtn.style.pointerEvents = 'none';
+            }
+             // Hiding logic for BP button happens implicitly via showSaveButton logic
         };
 
-        if (input.value.trim() !== '' || (isBP && otherInput && otherInput.value.trim() !== '')) { showSaveButton(); }
-
-        input.addEventListener('focus', showSaveButton);
         input.addEventListener('input', showSaveButton);
-        input.addEventListener('blur', function(e) {
+        input.addEventListener('blur', (e) => {
+            // Delay slightly to allow click on save button
             setTimeout(() => {
-                const relatedTargetIsSaveButton = document.activeElement === saveBtn;
-                const thisInputHasValue = this.value.trim() !== '';
-                let otherInputHasFocus = isBP && document.activeElement === otherInput;
-                let otherInputHasValue = isBP && otherInput.value.trim() !== '';
-                if (!relatedTargetIsSaveButton && !thisInputHasValue && (!isBP || (!otherInputHasFocus && !otherInputHasValue))) { hideSaveButton(); }
-            }, 150);
+                if (document.activeElement !== saveBtn && !input.value && (!isBP || (otherInput && !otherInput.value))) {
+                     hideSaveButton();
+                 }
+             }, 150);
         });
+
+        // Initial check in case inputs have pre-filled values (less likely here)
+         if (input.value) {
+             showSaveButton();
+         }
     });
-    
-    // Xử lý sự kiện click vào nút lưu (giống, nhưng dùng endpoint mới)
+
+    // Xử lý sự kiện click vào nút lưu
     const quickSaveButtons = document.querySelectorAll('.quick-save-btn');
     quickSaveButtons.forEach(btn => {
         btn.addEventListener('click', function() {
@@ -555,71 +693,91 @@ document.addEventListener('DOMContentLoaded', function() {
             let chartToUpdate = null;
             let updateFunction = null;
             let targetMetric = metric;
-            
+            let inputsToClear = [];
+
             if (metric === 'bloodPressure') {
                 targetMetric = 'blood_pressure';
                 const systolicInput = container.querySelector('input[data-metric="systolicBP"]');
                 const diastolicInput = container.querySelector('input[data-metric="diastolicBP"]');
-                if (!systolicInput.value || !diastolicInput.value) { showToast('Vui lòng nhập cả giá trị tâm thu và tâm trương', 'error'); return; }
+                if (!systolicInput || !diastolicInput || !systolicInput.value || !diastolicInput.value) {
+                    showToast('Vui lòng nhập cả giá trị tâm thu và tâm trương', 'error'); return;
+                }
                 values = { 'blood_pressure_systolic': parseInt(systolicInput.value), 'blood_pressure_diastolic': parseInt(diastolicInput.value) };
                 chartToUpdate = chartObjects[targetMetric]; updateFunction = addDataPointToBPChart;
+                inputsToClear = [systolicInput, diastolicInput];
             } else {
                 const input = container.querySelector(`.quick-measurement-input[data-metric="${metric}"]`);
-                if (!input.value) { showToast('Vui lòng nhập giá trị', 'error'); return; }
-                // Xử lý giá trị nhập vào, dùng parseFloat cho các số thập phân
+                if (!input || !input.value) { showToast('Vui lòng nhập giá trị', 'error'); return; }
                 const numberValue = parseFloat(input.value);
                 if (isNaN(numberValue)) { showToast('Giá trị không hợp lệ', 'error'); return; }
                 values[metric] = numberValue;
                 chartToUpdate = chartObjects[targetMetric]; updateFunction = addDataPointToChart;
+                inputsToClear = [input];
             }
-            
+
             showToast('Đang lưu dữ liệu...', 'info');
-            const originalText = this.innerHTML; this.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i>Đang lưu...'; this.disabled = true;
-            
-            let currentCsrfToken; try { currentCsrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); } catch(e) { currentCsrfToken = ""; }
+            const originalIconHTML = this.innerHTML; // Store original icon + text
+            this.innerHTML = '<i class="fas fa-spinner fa-spin mr-1"></i>Lưu...'; this.disabled = true;
+
+            // Ensure CSRF token is available
+            if (!csrfToken) { console.error("CSRF Token not found!"); showToast("Lỗi bảo mật, vui lòng tải lại trang.", "error"); this.innerHTML = originalIconHTML; this.disabled = false; return; }
 
             // *** Sử dụng endpoint mới cho encounter cụ thể ***
             fetch(`/patients/{{ patient.id }}/encounter/{{ encounter.encounterID }}/measurements/quick_save`, {
                 method: 'POST',
-                headers: { 'Content-Type': 'application/json', 'X-CSRFToken': currentCsrfToken },
+                headers: { 'Content-Type': 'application/json', 'X-CSRFToken': csrfToken },
                 credentials: 'same-origin',
                 body: JSON.stringify({ values: values })
              })
             .then(response => {
-                 if (!response.ok) { return response.text().then(text => { throw new Error(text || `Lỗi Server: ${response.status}`); }); }
+                 if (!response.ok) { return response.text().then(text => { throw new Error(text || "Lỗi máy chủ: " + response.status); }); } // Nâng cao báo lỗi
                  return response.json();
-            })
+             })
             .then(data => {
-                this.innerHTML = originalText; this.disabled = false;
-                if (data.success) {
-                    showToast('Đã lưu dữ liệu thành công', 'success');
-                    if (data.new_measurement_data) {
-                        updateLatestValues(data.new_measurement_data);
-                        if (chartToUpdate && updateFunction) { updateFunction(chartToUpdate, data.new_measurement_data); }
-                        else { console.warn('Không tìm thấy biểu đồ/hàm cập nhật:', targetMetric); }
-                    }
-                    clearInputs();
-                } else { showToast(`Lỗi: ${data.message || 'Lỗi không xác định'}`, 'error'); }
-            })
+                 if (data.success && data.measurement) {
+                     showToast('Lưu thành công!', 'success');
+                     // Cập nhật biểu đồ
+                     if (chartToUpdate && updateFunction) {
+                         updateFunction(chartToUpdate, data.measurement);
+                     }
+                     // Cập nhật giá trị hiển thị mới nhất
+                     updateLatestValues(data.measurement);
+
+                     // Xóa giá trị trong ô input vừa lưu
+                     inputsToClear.forEach(clearInput);
+
+                     // Tùy chọn: Reload bảng dữ liệu hoặc thêm dòng mới vào bảng (nếu cần)
+                     // Hiện tại, chúng ta chỉ cập nhật biểu đồ và giá trị hiển thị
+
+                 } else {
+                     throw new Error(data.message || 'Lưu thất bại.');
+                 }
+             })
             .catch(error => {
-                console.error('Quick Save Error:', error); this.innerHTML = originalText; this.disabled = false;
-                showToast(error.message || 'Đã xảy ra lỗi khi lưu dữ liệu', 'error');
-            });
+                 console.error('Lỗi khi lưu đo lường:', error);
+                 showToast(`Lỗi: ${error.message || 'Không thể kết nối máy chủ.'}`, 'error');
+             })
+            .finally(() => {
+                 this.innerHTML = originalIconHTML; // Restore original button content
+                 this.disabled = false;
+             });
         });
     });
-    
-    // Xử lý sự kiện tải file CSV (giống upload.html, nhưng submit đến route mới)
+
+    // Xử lý Upload CSV
     const csvFileInput = document.getElementById('csvFile');
-    if (csvFileInput) {
+    const uploadCsvForm = document.getElementById('uploadCsvForm');
+
+    if (csvFileInput && uploadCsvForm) {
         csvFileInput.addEventListener('change', function() {
             if (this.files.length > 0) {
-                 // Hiển thị loader nếu có
-                 const loader = document.getElementById('pageLoader');
-                 if (loader) { loader.style.display = 'flex'; loader.style.opacity = '1'; }
-                 document.getElementById('uploadCsvForm').submit();
+                const fileName = this.files[0].name;
+                showToast(`Đang tải lên ${fileName}...`, 'info');
+                uploadCsvForm.submit(); // Gửi form ngay khi chọn file
             }
         });
     }
-});
+
+}); // Kết thúc DOMContentLoaded
 </script>
-{% endblock %} 
\ No newline at end of file
+{% endblock %}
diff --git a/app/templates/macros/modals.html b/app/templates/macros/modals.html
new file mode 100644
index 0000000000000000000000000000000000000000..382766d7159f2d6c17b9a1c7eacb546c4525144d
--- /dev/null
+++ b/app/templates/macros/modals.html
@@ -0,0 +1,66 @@
+{% macro confirmation_modal(modal_id, title='Confirm Action') %}
+<div class="fixed z-50 inset-0 overflow-y-auto hidden" id="{{ modal_id }}" aria-labelledby="modal-title-{{ modal_id }}" role="dialog" aria-modal="true">
+    <div class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
+        <!-- Background overlay -->
+        <div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity" aria-hidden="true"></div>
+
+        <!-- Modal panel -->
+        <span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>
+        <div class="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full">
+            <div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
+                <div class="sm:flex sm:items-start">
+                    <div class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10">
+                        <!-- Heroicon name: outline/exclamation -->
+                        <svg class="h-6 w-6 text-red-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
+                            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
+                        </svg>
+                    </div>
+                    <div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
+                        <h3 class="text-lg leading-6 font-medium text-gray-900" id="modal-title-{{ modal_id }}">
+                            {{ title }}
+                        </h3>
+                        <div class="mt-2">
+                            <p class="text-sm text-gray-500" id="confirmationMessage">
+                                Are you sure you want to proceed? This action cannot be undone.
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
+                <button type="button" id="confirmDeleteBtn" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">
+                    Confirm
+                </button>
+                <button type="button" class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:ml-3 sm:w-auto sm:text-sm modal-cancel-btn">
+                    Cancel
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script>
+document.addEventListener('DOMContentLoaded', function() {
+    // Thêm event listener cho nút Cancel trong modal
+    const cancelBtns = document.querySelectorAll('#{{ modal_id }} .modal-cancel-btn');
+    cancelBtns.forEach(btn => {
+        btn.addEventListener('click', function() {
+            const modal = document.getElementById('{{ modal_id }}');
+            if (modal) {
+                modal.classList.add('hidden');
+            }
+        });
+    });
+    
+    // Đóng modal khi click ngoài vùng modal
+    const modal = document.getElementById('{{ modal_id }}');
+    if (modal) {
+        modal.addEventListener('click', function(event) {
+            if (event.target === modal) {
+                modal.classList.add('hidden');
+            }
+        });
+    }
+});
+</script>
+{% endmacro %} 
\ No newline at end of file
diff --git a/app/templates/patient_detail.html b/app/templates/patient_detail.html
index ca7b6bcd62a6a41a4d4d51529385bdda70604a3c..4563fa97bb408b781a18959e51d77d8009175b6f 100644
--- a/app/templates/patient_detail.html
+++ b/app/templates/patient_detail.html
@@ -13,7 +13,7 @@
             <nav class="flex" aria-label="Breadcrumb">
             <ol class="inline-flex items-center space-x-1 md:space-x-3">
                 <li class="inline-flex items-center">
-                    <a href="{{ url_for('handle_root') }}" class="inline-flex items-center text-sm font-medium text-gray-700 hover:text-blue-600 transition duration-200">
+                    <a href="{{ url_for('main.handle_root') }}" class="inline-flex items-center text-sm font-medium text-gray-700 hover:text-blue-600 transition duration-200">
                         <i class="fas fa-home mr-2"></i> Trang chủ
                     </a>
                     </li>
@@ -40,21 +40,41 @@
                 {{ patient.full_name }}
             </h2>
         </div>
-        <div class="mt-4 flex md:mt-0 md:ml-4 space-x-3">
-            <a href="{{ url_for('patients.edit_patient', patient_id=patient.id) }}" class="inline-flex items-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 transition-all duration-200 transform hover:-translate-y-1">
-                <i class="fas fa-edit -ml-1 mr-2 text-gray-500"></i>
-                Edit Patient
+        <div class="mt-4 flex md:mt-0 md:ml-4 space-x-3 justify-end">
+            {# Nút Edit Patient - Nền trắng, viền đen, hiệu ứng nảy nhẹ #}
+            <a href="{{ url_for('patients.edit_patient', patient_id=patient.id) }}"
+               style="background-color: white !important; color: #374151 !important; border: 1px solid #9ca3af !important;"
+               class="inline-flex items-center px-4 py-2 rounded-md shadow-sm text-sm font-medium transform transition duration-200 hover:-translate-y-1 hover:shadow-md">
+                <i class="fas fa-edit -ml-1 mr-2"></i>Edit Patient
             </a>
-            <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=latest_encounter.encounterID) if latest_encounter else '#' }}" 
-               class="inline-flex items-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-blue-700 bg-white hover:bg-blue-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 transition-all duration-200 transform hover:-translate-y-1 {{ 'opacity-50 cursor-not-allowed' if not latest_encounter }}">
-                <i class="fas fa-chart-line -ml-1 mr-2 text-blue-500"></i>
-                Latest Statistics
+
+            {# Nút Latest Statistics - Nền trắng, viền đen, hiệu ứng nảy nhẹ #}
+            <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=latest_encounter.encounterID) if latest_encounter else '#' }}"
+               style="background-color: white !important; color: #374151 !important; border: 1px solid #9ca3af !important;"
+               class="inline-flex items-center px-4 py-2 rounded-md shadow-sm text-sm font-medium transform transition duration-200 hover:-translate-y-1 hover:shadow-md"
+               {{ 'aria-disabled="true"' if not latest_encounter else '' }}>
+                <i class="fas fa-chart-line -ml-1 mr-2"></i>Latest Statistics
             </a>
-            <!-- Nút cập nhật trạng thái có thể thêm chức năng sau -->
-            <!-- <button type="button" class="inline-flex items-center px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-all duration-200 transform hover:-translate-y-1">
-                <i class="fas fa-check -ml-1 mr-2"></i>
-                Cập nhật trạng thái
-            </button> -->
+            
+            {# Nút Assign Dietitian - Logic hiển thị mới dựa trên PatientStatus Enum #}
+            {# Chỉ admin mới thấy nút này #}
+            {% if current_user.is_admin %}
+                {# Kiểm tra trạng thái bệnh nhân là NEEDS_ASSESSMENT #}
+                {% if patient.status == PatientStatus.NEEDS_ASSESSMENT %}
+            <button type="button" 
+                    id="assignDietitianBtn" 
+                            style="background-color: #f97316 !important; color: white !important;"
+                            class="inline-flex items-center px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium animate-float">
+                <i class="fas fa-user-md -ml-1 mr-2"></i>Assign Dietitian
+            </button>
+                {# Hiển thị thông tin dietitian đã gán nếu trạng thái là ASSESSMENT_IN_PROGRESS #}
+                {% elif patient.status == PatientStatus.ASSESSMENT_IN_PROGRESS and patient.assigned_dietitian %}
+                    <span class="inline-flex items-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-500 bg-gray-100 cursor-not-allowed">
+                        <i class="fas fa-user-check -ml-1 mr-2"></i>
+                        Dietitian: {{ patient.assigned_dietitian.full_name }}
+                    </span>
+                {% endif %}
+            {% endif %}
         </div>
     </div>
 
@@ -73,18 +93,35 @@
                 <div class="flex flex-col">
                     <div class="text-sm font-medium text-gray-500">Trạng thái BN</div>
                     <div class="mt-1">
-                        <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800">
-                            <span class="w-2 h-2 mr-1 rounded-full bg-green-500"></span>
-                            {{ patient.status|default('Active')|capitalize }}
+                        {# Cập nhật hiển thị và màu sắc dựa trên PatientStatus Enum #}
+                        {% set p_status = patient.status %}
+                        {% set p_color_map = {
+                            PatientStatus.NOT_ASSESSED: 'gray',
+                            PatientStatus.NEEDS_ASSESSMENT: 'amber',
+                            PatientStatus.ASSESSMENT_IN_PROGRESS: 'blue',
+                            PatientStatus.COMPLETED: 'green'
+                        } %}
+                        {% set p_color = p_color_map.get(p_status, 'gray') %}
+                        <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-{{ p_color }}-100 text-{{ p_color }}-800">
+                            <span class="w-2 h-2 mr-1 rounded-full bg-{{ p_color }}-500"></span>
+                            {{ p_status.value if p_status else 'Unknown' }} {# Hiển thị giá trị của Enum #}
                         </span>
                     </div>
                 </div>
                 <div class="flex flex-col">
-                    <div class="text-sm font-medium text-gray-500">Trạng thái giới thiệu</div>
+                    <div class="text-sm font-medium text-gray-500">Trạng thái Giới thiệu/Đánh giá</div>
                     <div class="mt-1">
-                        <!-- Logic hiển thị trạng thái giới thiệu cần cập nhật -->
-                        <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800">
-                            {{ patient.referral_status|default('Pending') }}
+                        {# Hiển thị trạng thái Referral mới nhất #}
+                        {% set latest_ref = referrals|sort(attribute='referralRequestedDateTime', reverse=True)|first %}
+                        {% set r_status = latest_ref.referral_status if latest_ref else None %}
+                        {% set r_color_map = {
+                            ReferralStatus.DIETITIAN_UNASSIGNED: 'yellow',
+                            ReferralStatus.WAITING_FOR_REPORT: 'orange',
+                            ReferralStatus.COMPLETED: 'emerald'
+                        } %}
+                        {% set r_color = r_color_map.get(r_status, 'gray') %}
+                        <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-{{ r_color }}-100 text-{{ r_color }}-800">
+                            {{ r_status.value if r_status else 'Không có' }} {# Hiển thị giá trị Enum hoặc 'Không có' #}
                         </span>
                     </div>
                 </div>
@@ -98,6 +135,9 @@
             <nav class="-mb-px flex space-x-8 overflow-x-auto" aria-label="Tabs">
                 <a href="#overview" class="border-primary-500 text-primary-600 whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm tab-link" data-target="overview">
                     Tổng quan
+                </a>
+                 <a href="#encounters" class="border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm tab-link" data-target="encounters">
+                    Lượt khám (Encounters)
                 </a>
                 <a href="#referrals" class="border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm tab-link" data-target="referrals">
                     Giới thiệu & Đánh giá
@@ -108,9 +148,6 @@
                 <a href="#reports" class="border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm tab-link" data-target="reports">
                     Báo cáo
                 </a>
-                 <a href="#encounters" class="border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm tab-link" data-target="encounters">
-                    Lượt khám (Encounters)
-                </a>
             </nav>
         </div>
     </div>
@@ -147,15 +184,22 @@
                             </div>
                             <div class="flex justify-between">
                                 <dt class="text-sm font-medium text-gray-500">Chiều cao</dt>
-                                <dd class="text-sm text-gray-900">{{ patient.height }} cm</dd>
+                                {# Định dạng lại chiều cao #}
+                                <dd class="text-sm text-gray-900">{{ "%.1f cm"|format(patient.height) if patient.height else 'N/A' }}</dd>
                             </div>
                             <div class="flex justify-between">
                                 <dt class="text-sm font-medium text-gray-500">Cân nặng</dt>
-                                <dd class="text-sm text-gray-900">{{ patient.weight }} kg</dd>
+                                {# Định dạng lại cân nặng #}
+                                <dd class="text-sm text-gray-900">{{ "%.1f kg"|format(patient.weight) if patient.weight else 'N/A' }}</dd>
                             </div>
                              <div class="flex justify-between">
                                 <dt class="text-sm font-medium text-gray-500">Nhóm máu</dt>
-                                <dd class="text-sm text-gray-900">{{ patient.blood_type }}</dd>
+                                <dd class="text-sm text-gray-900">{{ patient.blood_type or 'N/A' }}</dd> {# Sửa lại cách hiển thị N/A #}
+                            </div>
+                            <div class="flex justify-between">
+                                <dt class="text-sm font-medium text-gray-500">Chuyên gia DD</dt>
+                                {# Cập nhật để dùng assigned_dietitian từ Patient #}
+                                <dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">{{ patient.assigned_dietitian.full_name if patient.assigned_dietitian else 'Chưa gán' }}</dd>
                             </div>
                         </dl>
                     </div>
@@ -163,195 +207,135 @@
 
                 <!-- Các chỉ số quan trọng (Liên kết đến trang biểu đồ) -->
                 <div class="col-span-1 lg:col-span-2">
-                    <div class="px-4 py-5 sm:px-6">
-                         <h3 class="text-lg leading-6 font-medium text-gray-900 mb-2">
-                            Các chỉ số quan trọng gần đây
-                        </h3>
-                        <p class="text-xs text-gray-500">
-                            Cập nhật: {{ latest_measurement.measurementDateTime.strftime('%H:%M %d/%m/%Y') if latest_measurement and latest_measurement.measurementDateTime else 'N/A' }}
-                             <a href="{{ url_for('patients.physical_measurements', patient_id=patient.id) }}" class="ml-2 text-blue-600 hover:underline">(Xem biểu đồ chi tiết)</a>
-                        </p>
-                    </div>
-                    <div class="grid grid-cols-1 sm:grid-cols-2 gap-6">
-                        <!-- BMI Card -->
-                        <a href="{{ url_for('patients.physical_measurements', patient_id=patient.id) }}" class="block bg-white shadow-md rounded-lg overflow-hidden transition-all duration-300 hover:shadow-lg transform hover:-translate-y-1">
-                            <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
-                                <span class="text-sm font-semibold text-gray-700">BMI</span>
-                                <span class="px-2 py-1 text-xs font-semibold rounded-full {% set bmi_class = patient.get_bmi_color_class() %}{% if bmi_class %}bg-{{ bmi_class }}-100 text-{{ bmi_class }}-800{% else %}bg-gray-100 text-gray-800{% endif %}">
-                                    {{ patient.get_bmi_category() }}
-                                </span>
-                            </div>
-                            <div class="px-4 py-4 flex flex-col items-center">
-                                <div class="text-3xl font-bold text-gray-900">{{ patient.bmi if patient.bmi else '--' }}</div>
-                                <div class="mt-1 w-full bg-gray-200 rounded-full h-2">
-                                    {% set bmi_percentage = patient.get_bmi_percentage() %}
-                                    {% set bmi_color_hex = {'blue': '#3b82f6', 'green': '#10b981', 'yellow': '#facc15', 'red': '#ef4444'}.get(patient.get_bmi_color_class(), '#d1d5db') %}
-                                    <div class="h-2 rounded-full" style="width: {{ bmi_percentage }}%; background-color: {{ bmi_color_hex }};"></div>
+                    <div class="bg-white shadow-md rounded-lg overflow-hidden transition-all duration-300 hover:shadow-lg transform hover:-translate-y-1">
+                        <div class="px-4 py-5 sm:px-6">
+                             <h3 class="text-lg leading-6 font-medium text-gray-900 mb-2">
+                                Các chỉ số quan trọng gần đây
+                            </h3>
+                            <p class="text-xs text-gray-500">
+                                Cập nhật: {{ latest_measurement.measurementDateTime.strftime('%H:%M %d/%m/%Y') if latest_measurement and latest_measurement.measurementDateTime else 'N/A' }}
+                                 {# Sửa url_for để trỏ đến encounter mới nhất #}
+                                 <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=latest_encounter.encounterID) if latest_encounter else '#' }}" class="ml-2 text-blue-600 hover:underline">(Xem biểu đồ chi tiết)</a>
+                            </p>
+                        </div>
+                        <div class="grid grid-cols-1 sm:grid-cols-2 gap-6 p-6">
+                            <!-- BMI Card -->
+                            {# Sửa url_for để trỏ đến encounter mới nhất #}
+                            <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=latest_encounter.encounterID) if latest_encounter else '#' }}" class="block bg-gray-50 shadow-inner rounded-lg overflow-hidden transition-all duration-300 hover:shadow-md transform hover:scale-105">
+                                <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
+                                    <span class="text-sm font-semibold text-gray-700">BMI</span>
+                                    <span class="px-2 py-1 text-xs font-semibold rounded-full {% set bmi_class = patient.get_bmi_color_class() %}{% if bmi_class %}bg-{{ bmi_class }}-100 text-{{ bmi_class }}-800{% else %}bg-gray-100 text-gray-800{% endif %}">
+                                        {{ patient.get_bmi_category() }}
+                                    </span>
                                 </div>
-                                <div class="mt-2 flex justify-between w-full text-xs text-gray-500">
-                                    <span>0</span>
-                                    <span>18.5</span>
-                                    <span>25</span>
-                                    <span>30</span>
-                                    <span>40+</span>
+                                <div class="px-4 py-4 flex flex-col items-center">
+                                    {# Định dạng lại BMI #}
+                                    <div class="text-3xl font-bold text-gray-900">{{ "%.1f"|format(patient.bmi) if patient.bmi else '--' }}</div>
+                                    <div class="mt-1 w-full bg-gray-200 rounded-full h-2">
+                                        {% set bmi_percentage = patient.get_bmi_percentage() %}
+                                        {% set bmi_color_hex = {'blue': '#3b82f6', 'green': '#10b981', 'yellow': '#facc15', 'red': '#ef4444'}.get(patient.get_bmi_color_class(), '#d1d5db') %}
+                                        <div class="h-2 rounded-full" style="width: {{ bmi_percentage }}%; background-color: {{ bmi_color_hex }};"></div>
+                                    </div>
+                                    <div class="mt-2 flex justify-between w-full text-xs text-gray-500">
+                                        <span>0</span>
+                                        <span>18.5</span>
+                                        <span>25</span>
+                                        <span>30</span>
+                                        <span>40+</span>
+                                    </div>
                                 </div>
-                            </div>
-                        </a>
+                            </a>
 
-                        <!-- Heart Rate Card -->
-                         <a href="{{ url_for('patients.physical_measurements', patient_id=patient.id) }}#heartRateChart" class="block bg-white shadow-md rounded-lg overflow-hidden transition-all duration-300 hover:shadow-lg transform hover:-translate-y-1">
-                            <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
-                                <span class="text-sm font-semibold text-gray-700">Nhịp tim</span>
-                                <!-- Logic trạng thái nhịp tim cần thêm -->
-                            </div>
-                            <div class="px-4 py-4 flex items-center justify-center">
-                                <i class="fas fa-heartbeat text-4xl text-red-500 mr-4"></i>
-                                <div>
-                                    <div class="text-3xl font-bold text-gray-900">{{ latest_measurement.heart_rate if latest_measurement else '--' }}</div>
-                                    <div class="text-sm text-gray-500">bpm</div>
+                            <!-- Heart Rate Card -->
+                             {# Sửa url_for để trỏ đến encounter mới nhất #}
+                             <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=latest_encounter.encounterID) if latest_encounter else '#' }}#heartRateChart" class="block bg-gray-50 shadow-inner rounded-lg overflow-hidden transition-all duration-300 hover:shadow-md transform hover:scale-105">
+                                <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
+                                    <span class="text-sm font-semibold text-gray-700">Nhịp tim</span>
+                                    <!-- Logic trạng thái nhịp tim cần thêm -->
                                 </div>
-                            </div>
-                        </a>
+                                <div class="px-4 py-4 flex items-center justify-center">
+                                    <i class="fas fa-heartbeat text-4xl text-red-500 mr-4"></i>
+                                    <div>
+                                        {# Hiển thị giá trị hoặc '--' #}
+                                        <div class="text-3xl font-bold text-gray-900">{{ latest_measurement.heart_rate if latest_measurement and latest_measurement.heart_rate is not none else '--' }}</div>
+                                        <div class="text-sm text-gray-500">bpm</div>
+                                    </div>
+                                </div>
+                            </a>
 
-                        <!-- Blood Pressure Card -->
-                         <a href="{{ url_for('patients.physical_measurements', patient_id=patient.id) }}#bloodPressureChart" class="block bg-white shadow-md rounded-lg overflow-hidden transition-all duration-300 hover:shadow-lg transform hover:-translate-y-1">
-                            <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
-                                <span class="text-sm font-semibold text-gray-700">Huyết áp</span>
-                                <!-- Logic trạng thái huyết áp cần thêm -->
-                            </div>
-                            <div class="px-4 py-4 flex items-center justify-center">
-                               <i class="fas fa-stethoscope text-4xl text-blue-500 mr-4"></i>
-                                <div>
-                                    <div class="text-3xl font-bold text-gray-900">{{ (latest_measurement.blood_pressure_systolic|string + '/' + latest_measurement.blood_pressure_diastolic|string) if latest_measurement and latest_measurement.blood_pressure_systolic and latest_measurement.blood_pressure_diastolic else '--/--' }}</div>
-                                    <div class="text-sm text-gray-500">mmHg</div>
+                            <!-- Blood Pressure Card -->
+                             {# Sửa url_for để trỏ đến encounter mới nhất #}
+                             <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=latest_encounter.encounterID) if latest_encounter else '#' }}#bloodPressureChart" class="block bg-gray-50 shadow-inner rounded-lg overflow-hidden transition-all duration-300 hover:shadow-md transform hover:scale-105">
+                                <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
+                                    <span class="text-sm font-semibold text-gray-700">Huyết áp</span>
+                                    <!-- Logic trạng thái huyết áp cần thêm -->
                                 </div>
-                            </div>
-                        </a>
+                                <div class="px-4 py-4 flex items-center justify-center">
+                                   <i class="fas fa-stethoscope text-4xl text-blue-500 mr-4"></i>
+                                    <div>
+                                        {# Hiển thị giá trị hoặc '--/--' #}
+                                        <div class="text-3xl font-bold text-gray-900">{{ (latest_measurement.blood_pressure_systolic|string + '/' + latest_measurement.blood_pressure_diastolic|string) if latest_measurement and latest_measurement.blood_pressure_systolic is not none and latest_measurement.blood_pressure_diastolic is not none else '--/--' }}</div>
+                                        <div class="text-sm text-gray-500">mmHg</div>
+                                    </div>
+                                </div>
+                            </a>
 
-                         <!-- Oxygen Saturation Card -->
-                         <a href="{{ url_for('patients.physical_measurements', patient_id=patient.id) }}#oxygenSaturationChart" class="block bg-white shadow-md rounded-lg overflow-hidden transition-all duration-300 hover:shadow-lg transform hover:-translate-y-1">
-                            <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
-                                <span class="text-sm font-semibold text-gray-700">SpO₂</span>
-                                <!-- Logic trạng thái SpO2 cần thêm -->
-                            </div>
-                            <div class="px-4 py-4 flex items-center justify-center">
-                               <i class="fas fa-lungs text-4xl text-purple-500 mr-4"></i>
-                                <div>
-                                    <div class="text-3xl font-bold text-gray-900">{{ latest_measurement.oxygen_saturation if latest_measurement else '--' }}</div>
-                                    <div class="text-sm text-gray-500">%</div>
+                             <!-- Oxygen Saturation Card -->
+                             {# Sửa url_for để trỏ đến encounter mới nhất #}
+                             <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=latest_encounter.encounterID) if latest_encounter else '#' }}#oxygenSaturationChart" class="block bg-gray-50 shadow-inner rounded-lg overflow-hidden transition-all duration-300 hover:shadow-md transform hover:scale-105">
+                                <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
+                                    <span class="text-sm font-semibold text-gray-700">SpO₂</span>
+                                    <!-- Logic trạng thái SpO2 cần thêm -->
                                 </div>
-                            </div>
-                        </a>
+                                <div class="px-4 py-4 flex items-center justify-center">
+                                   <i class="fas fa-lungs text-4xl text-purple-500 mr-4"></i>
+                                    <div>
+                                        {# Định dạng và hiển thị giá trị hoặc '--' #}
+                                        <div class="text-3xl font-bold text-gray-900">{{ "%.1f"|format(latest_measurement.oxygen_saturation) if latest_measurement and latest_measurement.oxygen_saturation is not none else '--' }}</div>
+                                        <div class="text-sm text-gray-500">%</div>
+                                    </div>
+                                </div>
+                            </a>
 
-                        <!-- Temperature Card -->
-                         <a href="{{ url_for('patients.physical_measurements', patient_id=patient.id) }}#temperatureChart" class="block bg-white shadow-md rounded-lg overflow-hidden transition-all duration-300 hover:shadow-lg transform hover:-translate-y-1">
-                            <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
-                                <span class="text-sm font-semibold text-gray-700">Nhiệt độ</span>
-                                <!-- Logic trạng thái nhiệt độ cần thêm -->
-                            </div>
-                            <div class="px-4 py-4 flex items-center justify-center">
-                                <i class="fas fa-thermometer-half text-4xl text-orange-500 mr-4"></i>
-                                <div>
-                                    <div class="text-3xl font-bold text-gray-900">{{ latest_measurement.temperature if latest_measurement else '--' }}</div>
-                                    <div class="text-sm text-gray-500">°C</div>
+                            <!-- Temperature Card -->
+                             {# Sửa url_for để trỏ đến encounter mới nhất #}
+                             <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=latest_encounter.encounterID) if latest_encounter else '#' }}#temperatureChart" class="block bg-gray-50 shadow-inner rounded-lg overflow-hidden transition-all duration-300 hover:shadow-md transform hover:scale-105">
+                                <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
+                                    <span class="text-sm font-semibold text-gray-700">Nhiệt độ</span>
+                                    <!-- Logic trạng thái nhiệt độ cần thêm -->
                                 </div>
-                            </div>
-                        </a>
+                                <div class="px-4 py-4 flex items-center justify-center">
+                                    <i class="fas fa-thermometer-half text-4xl text-orange-500 mr-4"></i>
+                                    <div>
+                                        {# Định dạng và hiển thị giá trị hoặc '--' #}
+                                        <div class="text-3xl font-bold text-gray-900">{{ "%.1f"|format(latest_measurement.temperature) if latest_measurement and latest_measurement.temperature is not none else '--' }}</div>
+                                        <div class="text-sm text-gray-500">°C</div>
+                                    </div>
+                                </div>
+                            </a>
 
-                         <!-- FiO2 Card -->
-                         <a href="{{ url_for('patients.physical_measurements', patient_id=patient.id) }}#fio2Chart" class="block bg-white shadow-md rounded-lg overflow-hidden transition-all duration-300 hover:shadow-lg transform hover:-translate-y-1">
-                            <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
-                                <span class="text-sm font-semibold text-gray-700">FiO₂</span>
-                                <!-- Logic trạng thái FiO2 cần thêm -->
-                            </div>
-                            <div class="px-4 py-4 flex items-center justify-center">
-                                <i class="fas fa-wind text-4xl text-teal-500 mr-4"></i>
-                                <div>
-                                    <div class="text-3xl font-bold text-gray-900">{{ latest_measurement.fio2 if latest_measurement else '--' }}</div>
-                                    <div class="text-sm text-gray-500">%</div>
+                             <!-- FiO2 Card -->
+                             {# Sửa url_for để trỏ đến encounter mới nhất #}
+                             <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=latest_encounter.encounterID) if latest_encounter else '#' }}#fio2Chart" class="block bg-gray-50 shadow-inner rounded-lg overflow-hidden transition-all duration-300 hover:shadow-md transform hover:scale-105">
+                                <div class="px-4 py-3 flex justify-between items-center border-b border-gray-200">
+                                    <span class="text-sm font-semibold text-gray-700">FiO₂</span>
+                                    <!-- Logic trạng thái FiO2 cần thêm -->
                                 </div>
-                            </div>
-                        </a>
+                                <div class="px-4 py-4 flex items-center justify-center">
+                                    <i class="fas fa-wind text-4xl text-teal-500 mr-4"></i>
+                                    <div>
+                                        {# Định dạng và hiển thị giá trị hoặc '--' #}
+                                        <div class="text-3xl font-bold text-gray-900">{{ "%.1f"|format(latest_measurement.fio2) if latest_measurement and latest_measurement.fio2 is not none else '--' }}</div>
+                                        <div class="text-sm text-gray-500">%</div>
+                                    </div>
+                                </div>
+                            </a>
+                        </div>
                     </div>
                 </div>
             </div>
         </div>
 
-        <!-- Tab giới thiệu & đánh giá -->
-        <div id="referrals" class="tab-pane hidden">
-            <!-- Nội dung tab Giới thiệu & Đánh giá -->
-            {% include 'patients/_referrals_tab.html' %}
-        </div>
-
-        <!-- Tab Thủ thuật -->
-        <div id="procedures" class="tab-pane hidden">
-            <!-- Nội dung tab Thủ thuật -->
-            <h3 class="text-lg font-medium text-gray-900 mb-4">Thông tin Thủ thuật (Chưa có dữ liệu)</h3>
-            <p class="text-sm text-gray-500">Chức năng này đang được phát triển.</p>
-        </div>
-
-        <!-- Tab Báo cáo (Đã thêm) -->
-        <div id="reports" class="tab-pane hidden">
-            <div class="bg-white shadow-md rounded-lg overflow-hidden">
-                <div class="px-4 py-5 sm:px-6 border-b border-gray-200 flex justify-between items-center">
-                    <h3 class="text-lg leading-6 font-medium text-gray-900">
-                        Danh sách Báo cáo Dinh dưỡng
-                    </h3>
-                    <a href="{{ url_for('report.new_report', patient_id=patient.id) }}" class="inline-flex items-center px-3 py-1.5 border border-transparent text-xs font-medium rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors duration-200">
-                        <i class="fas fa-plus mr-1"></i> Tạo báo cáo mới
-                    </a>
-                </div>
-                <div class="px-4 py-5 sm:p-6">
-                    {% if patient.reports|length > 0 %}
-                        <table class="min-w-full divide-y divide-gray-200">
-                            <thead class="bg-gray-50">
-                                <tr>
-                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">ID Báo cáo</th>
-                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Ngày tạo</th>
-                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Người tạo</th>
-                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Trạng thái</th>
-                                    <th scope="col" class="relative px-6 py-3">
-                                        <span class="sr-only">Actions</span>
-                                    </th>
-                                </tr>
-                            </thead>
-                            <tbody class="bg-white divide-y divide-gray-200">
-                                {% for report in patient.reports|sort(attribute='report_date', reverse=True) %}
-                                    <tr class="hover:bg-gray-50 transition-colors duration-150">
-                                        <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
-                                            <a href="{{ url_for('report.view_report', report_id=report.id) }}" class="text-primary-600 hover:text-primary-900 hover:underline">#{{ report.id }}</a>
-                                        </td>
-                                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ report.report_date.strftime('%d/%m/%Y %H:%M') if report.report_date else 'N/A' }}</td>
-                                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ report.author.username if report.author else 'N/A' }}</td>
-                                        <td class="px-6 py-4 whitespace-nowrap">
-                                            <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full {{ get_report_status_badge(report.status) }}">
-                                                {{ report.status|capitalize }}
-                                            </span>
-                                        </td>
-                                        <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium space-x-2">
-                                            <a href="{{ url_for('report.view_report', report_id=report.id) }}" class="text-blue-600 hover:text-blue-900" title="Xem chi tiết"><i class="fas fa-eye"></i></a>
-                                            <a href="{{ url_for('report.edit_report', report_id=report.id) }}" class="text-indigo-600 hover:text-indigo-900" title="Chỉnh sửa"><i class="fas fa-edit"></i></a>
-                                            {% if report.status == 'finalized' %}
-                                            <span class="mx-1">|</span>
-                                            {# Thêm nút tải PDF nếu báo cáo đã hoàn thành #}
-                                            <a href="{{ url_for('report.download_report', report_id=report.id) }}" class="text-green-600 hover:text-green-900" title="Xuất PDF"><i class="fas fa-file-pdf"></i></a>
-                                            {% endif %}
-                                            {% if current_user.is_admin %}
-                                            <span class="mx-1">|</span>
-                                            <a href="{{ url_for('report.delete_report', report_id=report.id) }}" class="text-red-600 hover:text-red-900" title="Xóa" onclick="return confirm('Bạn có chắc chắn muốn xóa báo cáo này không?');"><i class="fas fa-trash"></i></a>
-                                            {% endif %}
-                                        </td>
-                                    </tr>
-                                {% endfor %}
-                            </tbody>
-                        </table>
-                    {% else %}
-                        <p class="text-center text-gray-500 py-6">Chưa có báo cáo nào cho bệnh nhân này.</p>
-                    {% endif %}
-                </div>
-            </div>
-        </div>
-
          <!-- Tab Lượt khám (Encounters) -->
         <div id="encounters" class="tab-pane hidden">
              <div class="bg-white shadow rounded-lg">
@@ -361,9 +345,8 @@
                     </h3>
                     {# Thay thế button bằng form #}
                     <form action="{{ url_for('patients.new_encounter', patient_id=patient.id) }}" method="POST" class="inline-block">
-                        {# Thêm CSRF token nếu bạn muốn xác thực trong route #}
-                        {# BỎ COMMENT DÒNG DƯỚI ĐỂ THÊM CSRF TOKEN #}
-                        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
+                        {# Thêm CSRF token từ EmptyForm #}
+                        {{ EmptyForm().csrf_token }}
                         <button type="submit" class="inline-flex items-center px-3 py-1 border border-transparent rounded text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-all duration-200">
                             <i class="fas fa-plus mr-2"></i>
                             Thêm lượt khám
@@ -385,27 +368,30 @@
                                 </tr>
                             </thead>
                              <tbody class="bg-white divide-y divide-gray-200">
-                                {% for data in encounters_data %}
-                                {% set encounter = data.encounter %}
-                                {% set status = data.status %}
-                                {% set unstable_metrics = data.unstable_metrics %}
+                                {% for enc_data in encounters_data %}
+                                {% set encounter = enc_data.encounter %}
+                                {% set status_info = enc_data.status %}
                                 <tr class="hover:bg-gray-100 transition duration-150 ease-in-out">
-                                     <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">{{ encounter.custom_encounter_id if encounter.custom_encounter_id else encounter.encounterID }}</td>
+                                     <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
+                                         {# Link đến chi tiết encounter #}
+                                         <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=encounter.encounterID) }}" class="text-blue-600 hover:underline">
+                                            {{ encounter.custom_encounter_id if encounter.custom_encounter_id else encounter.encounterID }}
+                                         </a>
+                                         {# Icon cảnh báo nếu ML dự đoán cần can thiệp #}
+                                         {% if encounter.needs_intervention %}
+                                             <i class="fas fa-exclamation-triangle text-red-500 ml-1" title="ML: Needs Intervention"></i>
+                                         {% endif %}
+                                     </td>
                                      <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ encounter.start_time.strftime('%d/%m/%Y %H:%M') if encounter.start_time else 'N/A' }}</td>
                                      <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
                                          {{ encounter.assigned_dietitian.full_name if encounter.assigned_dietitian else 'Chưa gán' }}
                                      </td>
                                      <td class="px-6 py-4 whitespace-nowrap text-sm text-red-600">
-                                        {% if unstable_metrics %}
-                                            {{ unstable_metrics | join(', ') }}
-                                        {% else %}
-                                            <span class="text-gray-500">-</span>
-                                        {% endif %}
+                                        {{ enc_data.unstable_metrics | join(', ') if enc_data.unstable_metrics else '-' }}
                                      </td>
                                      <td class="px-6 py-4 whitespace-nowrap">
-                                         <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-{{ status.color }}-100 text-{{ status.color }}-800">
-                                             <span class="w-2 h-2 mr-1.5 rounded-full bg-{{ status.color }}-500"></span>
-                                             {{ status.text }}
+                                         <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-{{ status_info.color }}-100 text-{{ status_info.color }}-800">
+                                             {{ status_info.text }}
                                          </span>
                                      </td>
                                      <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium space-x-2">
@@ -414,10 +400,9 @@
                                             <i class="fas fa-eye"></i>
                                         </a>
                                         {# Nút xóa encounter #}
-                                        <form action="{{ url_for('patients.delete_encounter', patient_id=patient.id, encounter_pk=encounter.encounterID) }}" method="POST" class="inline-block" onsubmit="return confirm('Bạn có chắc chắn muốn xóa lượt khám này và tất cả dữ liệu đo lường liên quan không?');">
+                                        <form action="{{ url_for('patients.delete_encounter', patient_id=patient.id, encounter_pk=encounter.encounterID) }}" method="POST" class="inline-block needs-confirmation" data-confirmation-message="Are you sure you want to delete encounter {{ encounter.custom_encounter_id if encounter.custom_encounter_id else encounter.encounterID }}? This will also delete all associated measurements.">
                                             {# Sử dụng EmptyForm để tạo CSRF token #}
-                                            {% set form = EmptyForm() %}
-                                            {{ form.csrf_token }}
+                                            {{ EmptyForm().csrf_token }}
                                             <button type="submit" class="text-red-600 hover:text-red-800" title="Delete Encounter">
                                                 <i class="fas fa-trash-alt"></i>
                                             </button>
@@ -435,13 +420,301 @@
             </div>
         </div>
 
+        <!-- Tab giới thiệu & đánh giá -->
+        <div id="referrals" class="tab-pane hidden">
+            <!-- Nội dung tab Giới thiệu & Đánh giá -->
+             <div class="bg-white shadow rounded-lg">
+                <div class="px-4 py-5 sm:px-6 flex justify-between items-center">
+                    <h3 class="text-lg leading-6 font-medium text-gray-900">
+                        Lịch sử Giới thiệu & Đánh giá Dinh dưỡng
+                    </h3>
+                </div>
+                <div class="border-t border-gray-200 px-4 py-5 sm:p-6">
+                    {% if referrals %}
+                        <div class="overflow-x-auto">
+                            <table class="min-w-full divide-y divide-gray-200">
+                                <thead class="bg-gray-50">
+                                    <tr>
+                                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">ID</th>
+                                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Ngày yêu cầu</th>
+                                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Encounter</th>
+                                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Lý do</th>
+                                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Trạng thái</th>
+                                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Chuyên gia DD</th>
+                                        <th scope="col" class="px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider">Thao tác</th>
+                                    </tr>
+                                </thead>
+                                <tbody class="bg-white divide-y divide-gray-200">
+                                    {% for ref in referrals %}
+                                    <tr class="hover:bg-gray-100 transition duration-150 ease-in-out">
+                                        <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
+                                            <span class="text-blue-600">#{{ ref.id }}</span>
+                                        </td>
+                                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ ref.referralRequestedDateTime.strftime('%d/%m/%Y %H:%M') if ref.referralRequestedDateTime else 'N/A' }}</td>
+                                         <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
+                                            {% if ref.encounter %}
+                                                <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=ref.encounter.encounterID) }}" class="text-blue-600 hover:underline">
+                                                    {{ ref.encounter.custom_encounter_id if ref.encounter.custom_encounter_id else ref.encounter.encounterID }}
+                                                </a>
+                                            {% else %}
+                                                N/A
+                                            {% endif %}
+                                        </td>
+                                        <td class="px-6 py-4 text-sm text-gray-900 max-w-xs break-words">
+                                            {{ ref.reason or 'N/A' }}
+                                            {# Thêm tag (ML) nếu referral được tạo tự động #}
+                                            {% if ref.is_ml_recommended or ref.referral_source == 'ML Prediction' %}
+                                                <span class="ml-1 inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-purple-100 text-purple-800">
+                                                    <i class="fas fa-robot mr-1"></i> ML
+                                                </span>
+                                            {% endif %}
+                                        </td>
+                                        <td class="px-6 py-4 whitespace-nowrap">
+                                            {# Sửa hiển thị status và thêm màu #}
+                                            {% set ref_status = ref.referral_status %}
+                                            {% set ref_color_map = {
+                                                ReferralStatus.DIETITIAN_UNASSIGNED: 'yellow',
+                                                ReferralStatus.WAITING_FOR_REPORT: 'orange',
+                                                ReferralStatus.COMPLETED: 'emerald' 
+                                            } %}
+                                            {% set ref_color = ref_color_map.get(ref_status, 'gray') %}
+                                            <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-{{ ref_color }}-100 text-{{ ref_color }}-800">
+                                                {{ ref_status.value if ref_status else 'Unknown' }}
+                                            </span>
+                                            {# Thêm tên dietitian nếu đã completed #}
+                                            {% if ref_status == ReferralStatus.COMPLETED and ref.assigned_dietitian %}
+                                                <span class="text-xs text-gray-500 ml-1">- by {{ ref.assigned_dietitian.full_name }}</span>
+                                            {% endif %}
+                                        </td>
+                                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
+                                            {{ ref.assigned_dietitian.full_name if ref.assigned_dietitian else 'Chưa gán' }}
+                                        </td>
+                                         <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium space-x-2">
+                                            {# Căn chỉnh lại icon và thêm link #}
+                                            {% if ref.encounter %}
+                                            <a href="{{ url_for('patients.encounter_measurements', patient_id=patient.id, encounter_id=ref.encounter.encounterID) }}" class="text-blue-600 hover:text-blue-800 inline-block align-middle" title="View Encounter Details">
+                                                <i class="fas fa-eye"></i>
+                                            </a>
+                                            {% else %}
+                                            <span class="text-gray-400 inline-block align-middle" title="No associated encounter">
+                                                <i class="fas fa-eye-slash"></i>
+                                            </span>
+                                            {% endif %}
+                                         </td>
+                                    </tr>
+                                    {% endfor %}
+                                </tbody>
+                            </table>
+                        </div>
+                    {% else %}
+                        <p class="text-center text-gray-500 py-4">Không có giới thiệu nào.</p>
+                    {% endif %}
+                </div>
+            </div>
+        </div>
+
+        <!-- Tab Thủ thuật -->
+        <div id="procedures" class="tab-pane hidden">
+             <div class="bg-white shadow rounded-lg p-6">
+                <h3 class="text-lg font-medium text-gray-900 mb-4">Thông tin Thủ thuật</h3>
+                <p class="text-sm text-gray-500">Chức năng này đang được phát triển hoặc chưa có dữ liệu thủ thuật cho bệnh nhân này.</p>
+             </div>
+        </div>
+
+        <!-- Tab Báo cáo -->
+        <div id="reports" class="tab-pane hidden">
+            <div class="bg-white shadow-md rounded-lg overflow-hidden">
+                <div class="px-4 py-5 sm:px-6 border-b border-gray-200 flex justify-between items-center">
+                    <h3 class="text-lg leading-6 font-medium text-gray-900">
+                        Danh sách Báo cáo Dinh dưỡng
+                    </h3>
+                    <a href="{{ url_for('report.new_report', patient_id=patient.id) }}" class="inline-flex items-center px-3 py-1.5 border border-transparent text-xs font-medium rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors duration-200">
+                        <i class="fas fa-plus mr-1"></i> Tạo báo cáo mới
+                    </a>
+                </div>
+                <div class="px-4 py-5 sm:p-6">
+                    {% if reports %}
+                        <table class="min-w-full divide-y divide-gray-200">
+                            <thead class="bg-gray-50">
+                                <tr>
+                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">ID Báo cáo</th>
+                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Ngày tạo</th>
+                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Người tạo</th>
+                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Trạng thái</th>
+                                    <th scope="col" class="relative px-6 py-3">
+                                        <span class="sr-only">Actions</span>
+                                    </th>
+                                </tr>
+                            </thead>
+                            <tbody class="bg-white divide-y divide-gray-200">
+                                {% for report in reports|sort(attribute='report_date', reverse=True) %} {# Sắp xếp báo cáo theo ngày, mới nhất đầu tiên #}
+                                    <tr class="hover:bg-gray-50 transition-colors duration-150">
+                                        <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
+                                            {# Sửa lại url_for và id #}
+                                            <a href="{{ url_for('report.view_report', report_id=report.id) }}" class="text-primary-600 hover:text-primary-900 hover:underline">#{{ report.id }}</a>
+                                        </td>
+                                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ report.report_date.strftime('%d/%m/%Y %H:%M') if report.report_date else 'N/A' }}</td>
+                                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ report.author.username if report.author else 'N/A' }}</td>
+                                        <td class="px-6 py-4 whitespace-nowrap">
+                                            {% set status_color = 'green' if report.status == 'Completed' else 'yellow' if report.status == 'Pending' else 'gray' if report.status == 'Draft' else 'gray' %}
+                                            <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-{{ status_color }}-100 text-{{ status_color }}-800">
+                                                {{ report.status }}
+                                            </span>
+                                        </td>
+                                        <td class="px-6 py-4 whitespace-nowrap text-right text-sm font-medium">
+                                            {# Bọc các actions vào div để căn chỉnh #}
+                                            <div class="flex items-center justify-end space-x-2">
+                                                {# Nút Xem #}
+                                                <a href="{{ url_for('report.view_report', report_id=report.id) }}" class="text-blue-600 hover:text-blue-900" title="Xem chi tiết"><i class="fas fa-eye"></i></a>
+                                                
+                                                {# Nút Sửa (chỉ khi Draft/Pending và có quyền) #}
+                                                {% if report.status in ['Draft', 'Pending'] and (current_user.is_admin or current_user.userID == report.author_id or current_user.userID == patient.assigned_dietitian_user_id) %}
+                                                <a href="{{ url_for('report.edit_report', report_id=report.id) }}" class="text-indigo-600 hover:text-indigo-900" title="Chỉnh sửa"><i class="fas fa-edit"></i></a>
+                                                {% endif %}
+                                                
+                                                {# Nút Hoàn thành (chỉ khi Pending và có quyền) #}
+                                                {% if report.status == 'Pending' and (current_user.is_admin or current_user.userID == patient.assigned_dietitian_user_id) %}
+                                                <form action="{{ url_for('report.complete_report', report_id=report.id) }}" method="post" class="inline-flex items-center needs-confirmation" data-confirmation-message="Bạn có chắc chắn muốn hoàn thành báo cáo này? Hành động này sẽ cập nhật trạng thái của bệnh nhân, lượt khám và giấy giới thiệu.">
+                                                    {{ EmptyForm().csrf_token }}
+                                                    <button type="submit" class="text-green-600 hover:text-green-900" title="Hoàn thành báo cáo"><i class="fas fa-check-circle"></i></button>
+                                                </form>
+                                                {% endif %}
+                                                
+                                                {# Nút Tải PDF (khi Completed) #}
+                                                {% if report.status == 'Completed' %}
+                                                <a href="{{ url_for('report.download_report', report_id=report.id) }}" class="text-green-600 hover:text-green-900" title="Xuất PDF"><i class="fas fa-file-pdf"></i></a>
+                                                {% endif %}
+                                                
+                                                {# Nút Xóa (chỉ Admin) #}
+                                                {% if current_user.role == 'Admin' %}
+                                                <form action="{{ url_for('report.delete_report', report_id=report.id) }}" method="post" class="inline-flex items-center needs-confirmation" data-confirmation-message="Bạn có chắc chắn muốn xóa báo cáo #{{ report.id }}? Hành động này không thể khôi phục.">
+                                                    {{ EmptyForm().csrf_token }}
+                                                    <button type="submit" class="text-red-600 hover:text-red-900" title="Xóa báo cáo"><i class="fas fa-trash-alt"></i></button>
+                                                </form>
+                                                {% endif %}
+                                            </div>
+                                        </td>
+                                    </tr>
+                                {% endfor %}
+                            </tbody>
+                        </table>
+                    {% else %}
+                        <p class="text-center text-gray-500 py-6">Chưa có báo cáo nào cho bệnh nhân này.</p>
+                    {% endif %}
+                </div>
+            </div>
+        </div>
+
         <!-- Các tab khác sẽ được thêm vào đây -->
     </div>
 </div>
+
+{# Include confirmation modal macro #}
+{% from 'macros/modals.html' import confirmation_modal %}
+{{ confirmation_modal('deleteConfirmationModal', 'Confirm Deletion') }}
+
+{# Add the Assign Dietitian Modal - Redesigned #}
+<div id="assignDietitianModal" class="fixed z-10 inset-0 overflow-y-auto hidden" aria-labelledby="modal-title" role="dialog" aria-modal="true">
+    <div class="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
+        <!-- Background overlay -->
+        <div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity" aria-hidden="true"></div>
+        <span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">&#8203;</span>
+
+        <!-- Modal panel -->
+        <div class="relative inline-block align-bottom bg-white rounded-xl text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-3xl md:max-w-4xl lg:w-3/4 xl:w-2/3 w-full modal-content-height">
+            <div class="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
+                <div class="sm:flex sm:items-start">
+                    <div class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-orange-100 sm:mx-0 sm:h-10 sm:w-10">
+                        <i class="fas fa-user-md text-orange-600"></i>
+                    </div>
+                    <div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
+                        <h3 class="text-xl leading-6 font-semibold text-gray-900" id="modal-title">
+                            Assign Dietitian
+                        </h3>
+                        <p class="text-sm text-gray-500 mt-1">
+                            Choose an assignment method for patient {{ patient.full_name }}.
+                        </p>
+                    </div>
+                </div>
+
+                {# FORM Wrapper Starts Here #}
+                <form id="assignDietitianForm" action="{{ url_for('patients.assign_dietitian', patient_id=patient.id) }}" method="POST">
+                    {# Add CSRF token from EmptyForm #}
+                    {{ EmptyForm().csrf_token }}
+                    {# Hidden input to store assignment type #}
+                    <input type="hidden" id="assignmentTypeInput" name="assignment_type" value="">
+
+                    <!-- Initial Choice View -->
+                    <div id="assignmentChoiceView" class="mt-6 grid grid-cols-1 md:grid-cols-2 gap-6">
+                        <!-- Auto Assign Card -->
+                        <button type="button" id="chooseAutoAssign" class="assignment-choice-card group bg-gradient-to-br from-blue-50 to-indigo-100 p-6 rounded-lg border border-gray-200 hover:border-blue-400 hover:shadow-lg transition duration-300 text-left focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500">
+                            <div class="flex items-center mb-3">
+                                <div class="p-2 bg-blue-200 rounded-full mr-3 group-hover:scale-110 transition-transform">
+                                    <i class="fas fa-magic text-blue-700"></i>
+                                </div>
+                                <h4 class="text-lg font-semibold text-gray-800">Auto Assign</h4>
+                            </div>
+                            <p class="text-sm text-gray-600">Automatically assign the dietitian with the fewest current patients. Quick and efficient.</p>
+                        </button>
+
+                        <!-- Manual Assign Card -->
+                        <button type="button" id="chooseManualAssign" class="assignment-choice-card group bg-gradient-to-br from-green-50 to-teal-100 p-6 rounded-lg border border-gray-200 hover:border-green-400 hover:shadow-lg transition duration-300 text-left focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500">
+                            <div class="flex items-center mb-3">
+                                <div class="p-2 bg-green-200 rounded-full mr-3 group-hover:scale-110 transition-transform">
+                                    <i class="fas fa-user-edit text-green-700"></i>
+                                </div>
+                                <h4 class="text-lg font-semibold text-gray-800">Manual Assign</h4>
+                            </div>
+                            <p class="text-sm text-gray-600">Select a specific dietitian from the list and add optional notes for the assignment.</p>
+                        </button>
+                    </div>
+
+                    <!-- Manual Assignment Form View (Initially Hidden) -->
+                    <div id="manualAssignmentView" class="mt-6 hidden animate__animated animate__fadeIn">
+                        <div class="space-y-4">
+                            <div class="form-group" id="dietitianSelectGroup">
+                                <label for="dietitian_id" class="block text-sm font-medium text-gray-700 mb-1">Select Dietitian:</label>
+                                <select class="form-select mt-1 block w-full pl-3 pr-10 py-2 text-base border-gray-300 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm rounded-md shadow-sm" id="dietitian_id" name="dietitian_id" required>
+                                    <option value="" disabled selected>-- Select a Dietitian --</option>
+                                    {% for dietitian_user in dietitians %} {# Changed loop variable name #}
+                                        <option value="{{ dietitian_user.userID }}">{{ dietitian_user.full_name }} ({{ dietitian_user.assigned_patients_count }} patients)</option>
+                                    {% endfor %}
+                                </select>
+                            </div>
+                            
+                            <div class="form-group">
+                                <label for="notes" class="block text-sm font-medium text-gray-700 mb-1">Notes (Optional):</label>
+                                <textarea class="form-textarea mt-1 block w-full border-gray-300 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" id="notes" name="notes" rows="3" placeholder="Add any relevant notes for the dietitian..."></textarea>
+                            </div>
+                        </div>
+                    </div>
+                {# FORM Wrapper Ends Before Footer #}
+            </div>
+            
+            <!-- Modal Footer -->
+            <div class="bg-gray-50 px-4 py-4 sm:px-6 sm:flex sm:flex-row-reverse rounded-b-xl border-t border-gray-200">
+                {# Removed form attribute from this button #}
+                <button type="submit" id="assignSubmitBtn" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-6 py-2 bg-blue-600 text-base font-medium text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 sm:ml-3 sm:w-auto sm:text-sm disabled:opacity-50 transition duration-150 ease-in-out">
+                    <i class="fas fa-check mr-2"></i>Confirm Assignment
+                </button>
+                <button type="button" id="closeModalBtn" class="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-6 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:w-auto sm:text-sm transition duration-150 ease-in-out">
+                    Cancel
+                </button>
+                 <button type="button" id="backToChoiceBtn" class="mt-3 mr-auto hidden w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-6 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:w-auto sm:text-sm transition duration-150 ease-in-out">
+                    <i class="fas fa-arrow-left mr-2"></i>Back
+                </button>
+            </div>
+            </form> {# Close the form tag here, wrapping the footer as well #}
+        </div>
+    </div>
+</div>
+
 {% endblock %}
 
 {% block scripts %}
 {{ super() }} {# Kế thừa scripts từ base.html nếu có #}
+
+<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
 <script>
     document.addEventListener('DOMContentLoaded', function() {
         const tabs = document.querySelectorAll('.tab-link');
@@ -464,27 +737,27 @@
             // Activate the target tab and pane
             const activeTab = document.querySelector(`.tab-link[data-target="${targetId}"]`);
             const activePane = document.getElementById(targetId);
+            const defaultTabId = 'overview'; // Default tab
 
-            if (activeTab && activePane) {
-                activeTab.classList.add('border-primary-500', 'text-primary-600');
-                activeTab.classList.remove('border-transparent', 'text-gray-500', 'hover:text-gray-700', 'hover:border-gray-300');
-                activePane.classList.remove('hidden');
+            let tabToActivate = activeTab;
+            let paneToActivate = activePane;
+
+            // If target tab/pane doesn't exist, default to overview
+            if (!tabToActivate || !paneToActivate) {
+                 tabToActivate = document.querySelector(`.tab-link[data-target="${defaultTabId}"]`);
+                 paneToActivate = document.getElementById(defaultTabId);
+                 targetId = defaultTabId; // Update targetId for hash update
+             }
+
+
+            if (tabToActivate && paneToActivate) {
+                tabToActivate.classList.add('border-primary-500', 'text-primary-600');
+                tabToActivate.classList.remove('border-transparent', 'text-gray-500', 'hover:text-gray-700', 'hover:border-gray-300');
+                paneToActivate.classList.remove('hidden');
                 // Add animation class with a slight delay to ensure it's visible
                 setTimeout(() => {
-                     activePane.classList.add('animate-fade-in-fast');
+                     paneToActivate.classList.add('animate-fade-in-fast');
                 }, 10); // Small delay
-            } else if (targetId === 'overview') {
-                 // Default to overview if target not found (might happen on initial load)
-                 const overviewTab = document.querySelector(`.tab-link[data-target="overview"]`);
-                 const overviewPane = document.getElementById('overview');
-                 if (overviewTab && overviewPane) {
-                    overviewTab.classList.add('border-primary-500', 'text-primary-600');
-                    overviewTab.classList.remove('border-transparent', 'text-gray-500', 'hover:text-gray-700', 'hover:border-gray-300');
-                    overviewPane.classList.remove('hidden');
-                     setTimeout(() => {
-                         overviewPane.classList.add('animate-fade-in-fast');
-                    }, 10);
-                 }
             }
 
             // Update URL hash without scrolling
@@ -507,7 +780,8 @@
         const hash = window.location.hash.substring(1); // Remove '#'
         if (hash) {
             const targetPane = document.getElementById(hash);
-            if (targetPane && targetPane.classList.contains('tab-pane')) {
+            // Check if hash corresponds to a valid tab pane
+            if (targetPane && Array.from(panes).includes(targetPane)) {
                 activateTab(hash);
             } else {
                  activateTab('overview'); // Default to overview if hash is invalid
@@ -521,15 +795,270 @@
         const patientStatus = "{{ patient.status|default('Active')|lower }}"; // Get patient status
 
         if (statusCard) {
+            let borderColorClass = 'border-green-500'; // Default for active
             if (patientStatus === 'discharged') {
-                statusCard.classList.add('border-l-4', 'border-gray-400'); // Example style for discharged
-            } else if (patientStatus === 'in treatment') {
-                 statusCard.classList.add('border-l-4', 'border-blue-500'); // Example style for in treatment
-             } else {
-                statusCard.classList.add('border-l-4', 'border-green-500'); // Default for active
+                borderColorClass = 'border-gray-400'; // Example style for discharged
+            } else if (patientStatus === 'in treatment') { // Assuming 'in treatment' status exists
+                 borderColorClass = 'border-blue-500'; // Example style for in treatment
              }
+             statusCard.classList.add('border-l-4', borderColorClass);
+        }
+
+        // Confirmation Modal Logic
+        var confirmationForms = document.querySelectorAll('.needs-confirmation');
+        var confirmationModalElement = document.getElementById('deleteConfirmationModal');
+        if (confirmationModalElement) {
+            var confirmationModal = new bootstrap.Modal(confirmationModalElement);
+            var confirmDeleteBtn = document.getElementById('confirmDeleteBtn');
+            var confirmationMessageElement = document.getElementById('confirmationMessage');
+            var formToSubmit;
+
+            confirmationForms.forEach(function (form) {
+                form.addEventListener('submit', function (event) {
+                    event.preventDefault(); // Prevent default form submission
+                    formToSubmit = form; // Store the form to be submitted
+                    var message = form.getAttribute('data-confirmation-message') || 'Are you sure you want to proceed?';
+                    if(confirmationMessageElement) confirmationMessageElement.textContent = message; // Set the confirmation message
+                    confirmationModal.show(); // Show the modal
+                });
+            });
+
+            // Handle the confirmation button click inside the modal
+            if (confirmDeleteBtn) {
+                confirmDeleteBtn.addEventListener('click', function () {
+                    if (formToSubmit) {
+                        formToSubmit.submit(); // Submit the stored form
+                    }
+                });
+            }
+        } else {
+            console.warn("Confirmation modal element ('deleteConfirmationModal') not found.");
+        }
+
+        // Modal handling - Debugging
+        const assignDietitianModal = document.getElementById('assignDietitianModal');
+        const assignDietitianBtn = document.getElementById('assignDietitianBtn'); // Button to open modal
+        const closeModalBtn = document.getElementById('closeModalBtn'); // Cancel button inside modal
+
+        console.log('Assign Dietitian Modal:', assignDietitianModal);
+        console.log('Assign Dietitian Button:', assignDietitianBtn);
+        console.log('Close Modal Button:', closeModalBtn);
+        
+        // Show modal
+        if (assignDietitianBtn && assignDietitianModal) {
+            console.log('Adding click listener to Assign Dietitian Button');
+            assignDietitianBtn.addEventListener('click', function() {
+                console.log('Assign Dietitian Button clicked!');
+                showChoiceView(); // Reset to choice view first
+                assignDietitianModal.classList.remove('hidden');
+                console.log('Modal should be visible now.');
+            });
+        } else {
+            console.error('Assign Dietitian button or modal not found!');
+        }
+        
+        // Close modal with Cancel button
+        if (closeModalBtn && assignDietitianModal) {
+             console.log('Adding click listener to Close Modal Button');
+            closeModalBtn.addEventListener('click', function() {
+                console.log('Close button clicked');
+                assignDietitianModal.classList.add('hidden');
+                showChoiceView(); // Also reset view on cancel
+            });
+        }
+        
+        // Close on backdrop click
+        if (assignDietitianModal) {
+            console.log('Adding backdrop click listener');
+            assignDietitianModal.addEventListener('click', function(e) {
+                // Check if the click is directly on the backdrop (the modal container itself)
+                if (e.target === assignDietitianModal) {
+                    console.log('Backdrop clicked');
+                    assignDietitianModal.classList.add('hidden');
+                    showChoiceView(); // Reset view
+                }
+            });
+        }
+        
+        // Form submission spinner (Keep this)
+        const assignDietitianForm = document.getElementById('assignDietitianForm');
+        const assignSubmitBtn = document.getElementById('assignSubmitBtn');
+        
+        if (assignDietitianForm && assignSubmitBtn) {
+            assignDietitianForm.addEventListener('submit', function() {
+                assignSubmitBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Processing...';
+                assignSubmitBtn.disabled = true;
+            });
+        }
+
+        // New Assign Dietitian Modal Logic (Auto/Manual Choice)
+        const chooseAutoBtn = document.getElementById('chooseAutoAssign');
+        const chooseManualBtn = document.getElementById('chooseManualAssign');
+        const assignmentChoiceView = document.getElementById('assignmentChoiceView');
+        const manualAssignmentView = document.getElementById('manualAssignmentView');
+        const assignmentTypeInput = document.getElementById('assignmentTypeInput');
+        const backToChoiceBtn = document.getElementById('backToChoiceBtn');
+        const modalSubmitBtn = document.getElementById('assignSubmitBtn');
+        const modalDietitianSelect = document.getElementById('dietitian_id');
+
+        function showChoiceView() {
+            assignmentChoiceView.classList.remove('hidden');
+            manualAssignmentView.classList.add('hidden');
+            backToChoiceBtn.classList.remove('hidden');
+            modalSubmitBtn.disabled = false; // Kích hoạt nút confirm
+            modalSubmitBtn.innerHTML = '<i class="fas fa-magic mr-2"></i>Confirm Auto Assignment'; // Thay đổi text nút confirm (tùy chọn)
+            modalDietitianSelect.required = false; // Not required in choice view
+             // Reset selected value if needed
+            modalDietitianSelect.value = "";
+            assignmentTypeInput.value = ""; // Clear assignment type
+            console.log('Showing Choice View');
+        }
+
+        function showManualView() {
+            assignmentChoiceView.classList.add('hidden');
+            manualAssignmentView.classList.remove('hidden');
+            backToChoiceBtn.classList.remove('hidden');
+            assignmentTypeInput.value = 'manual';
+            modalDietitianSelect.required = true; // Required for manual
+            // Enable submit button only if a dietitian is selected initially (or handle validation)
+            modalSubmitBtn.disabled = !modalDietitianSelect.value; 
+            console.log('Showing Manual View');
+        }
+
+        if (chooseAutoBtn) {
+            chooseAutoBtn.addEventListener('click', function() {
+                console.log('Auto Assign chosen');
+                assignmentTypeInput.value = 'auto';
+                modalDietitianSelect.required = false;
+                
+                // KHÔNG submit form ngay lập tức nữa
+                // assignDietitianForm.submit(); 
+                
+                // Thay vào đó, ẩn view lựa chọn và hiển thị nút back/confirm
+                assignmentChoiceView.classList.add('hidden');
+                manualAssignmentView.classList.add('hidden'); // Đảm bảo view manual cũng ẩn
+                backToChoiceBtn.classList.remove('hidden');
+                modalSubmitBtn.disabled = false; // Kích hoạt nút confirm
+                modalSubmitBtn.innerHTML = '<i class="fas fa-magic mr-2"></i>Confirm Auto Assignment'; // Thay đổi text nút confirm (tùy chọn)
+
+                // Không disable nút auto nữa
+                // this.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Assigning...';
+                // this.disabled = true;
+                // if(chooseManualBtn) chooseManualBtn.disabled = true; 
+            });
+        }
+
+        if (chooseManualBtn) {
+            // Sửa hàm showManualView để đổi text nút Confirm
+            chooseManualBtn.addEventListener('click', function() {
+                showManualView();
+                modalSubmitBtn.innerHTML = '<i class="fas fa-check mr-2"></i>Confirm Manual Assignment';
+            }); 
+        }
+
+        if (backToChoiceBtn) {
+             console.log('Adding listener to Back button');
+            backToChoiceBtn.addEventListener('click', function() {
+                showChoiceView();
+                 modalSubmitBtn.innerHTML = '<i class="fas fa-check mr-2"></i>Confirm Assignment'; // Reset text khi quay lại
+            }); 
+        }
+        
+        // Enable submit button when a dietitian is selected in manual mode
+        if (modalDietitianSelect) {
+            modalDietitianSelect.addEventListener('change', function() {
+                if (assignmentTypeInput.value === 'manual') {
+                    modalSubmitBtn.disabled = !this.value; // Enable only if a value is selected
+                }
+            });
         }
+        
+        // Reset modal to choice view when opened/closed (Removed redundant listeners, handled above)
+        // if (assignDietitianBtn) { ... }
+        // if (closeModalBtn) { ... }
+        // if (assignDietitianModal) { ... }
 
+        // Remove old toggle logic
+        // Không còn sử dụng mã cũ ở đây
+    });
+</script>
+
+<!-- CSS cho các nút trong trang -->
+<style>
+    .btn-white-outline {
+        background-color: white;
+        color: #212529;
+        border: 1px solid #212529;
+        transition: transform 0.2s, box-shadow 0.2s;
+    }
+    
+    .btn-white-outline:hover {
+        transform: translateY(-2px);
+        box-shadow: 0 4px 8px rgba(0,0,0,0.1);
+    }
+    
+    .btn-orange {
+        background-color: #fd7e14;
+        color: white;
+        border: none;
+        transition: transform 0.3s, box-shadow 0.3s;
+    }
+    
+    .btn-orange:hover {
+        background-color: #e67211;
+        transform: scale(1.05);
+        box-shadow: 0 5px 15px rgba(253, 126, 20, 0.4);
+    }
+    
+    /* Chuyển đổi các nút không nổi bật thành nút viền trắng */
+    .convert-to-white-outline {
+        background-color: white !important;
+        color: #212529 !important;
+        border: 1px solid #212529 !important;
+        transition: transform 0.2s, box-shadow 0.2s !important;
+    }
+    
+    .convert-to-white-outline:hover {
+        transform: translateY(-2px) !important;
+        box-shadow: 0 4px 8px rgba(0,0,0,0.1) !important;
+    }
+
+    .floating-animation {
+        animation: float 3s ease-in-out infinite;
+    }
+    @keyframes float {
+        0% { transform: translateY(0px); }
+        50% { transform: translateY(-5px); }
+        100% { transform: translateY(0px); }
+    }
+    
+    .bounce-on-hover:hover {
+        animation: bounce 0.5s ease;
+    }
+    @keyframes bounce {
+        0%, 100% { transform: translateY(0); }
+        50% { transform: translateY(-3px); }
+    }
+
+    /* Tăng chiều cao tối đa cho modal */
+    .modal-content-height {
+        max-height: 80vh; /* Hoặc một giá trị phù hợp khác */
+        overflow-y: auto; /* Thêm thanh cuộn nếu nội dung vẫn vượt quá */
+    }
+</style>
+
+<script>
+    // Áp dụng CSS mới cho các nút
+    $(document).ready(function() {
+        // Chuyển đổi các nút Edit Patient và Latest Statistics
+        $("#editPatientBtn").addClass("btn-white-outline").removeClass("btn-primary");
+        $("#latestStatsBtn").addClass("btn-white-outline").removeClass("btn-info");
+        
+        // Chuyển đổi nút Assign Dietitian thành màu cam
+        $("#assignDietitianBtn").addClass("btn-orange").removeClass("btn-primary");
+        
+        // Chuyển đổi các nút khác nếu cần
+        $(".btn-secondary").addClass("convert-to-white-outline");
     });
 </script>
 {% endblock %}
diff --git a/app/templates/patients.html b/app/templates/patients.html
index 9e4593029435c4dd33303c3c23cc8128cdaf09ab..011f608139f0436d60c369213681aaaaacb0ae95 100644
--- a/app/templates/patients.html
+++ b/app/templates/patients.html
@@ -28,10 +28,10 @@
             <div class="flex flex-col sm:flex-row gap-2">
                 <select id="status-filter" class="form-select rounded-md border-gray-300 py-2 pr-8 pl-3 text-base focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm">
                     <option value="">All Statuses</option>
-                    <option value="active">Active</option>
-                    <option value="discharged">Discharged</option>
-                    <option value="critical">Critical</option>
-                    <option value="stable">Stable</option>
+                    <option value="NOT_ASSESSED">Not Assessed</option>
+                    <option value="NEEDS_ASSESSMENT">Needs Assessment</option>
+                    <option value="ASSESSMENT_IN_PROGRESS">Assessment In Progress</option>
+                    <option value="COMPLETED">Completed</option>
                 </select>
                 
                 <button type="button" onclick="window.location.href='{{ url_for('patients.new_patient') }}'" class="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500">
@@ -97,22 +97,29 @@
                         </td>
                         <td class="px-6 py-4 whitespace-nowrap">
                             <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full 
-                                {% if patient.status == 'active' %}bg-green-100 text-green-800
-                                {% elif patient.status == 'discharged' %}bg-gray-100 text-gray-800
-                                {% elif patient.status == 'critical' %}bg-red-100 text-red-800
-                                {% else %}bg-blue-100 text-blue-800{% endif %}">
-                                {{ patient.status }}
+                                {% set p_status = patient.status %}
+                                {% set p_color_map = {
+                                    'NOT_ASSESSED': 'gray',
+                                    'NEEDS_ASSESSMENT': 'amber',
+                                    'ASSESSMENT_IN_PROGRESS': 'blue',
+                                    'COMPLETED': 'green'
+                                } %}
+                                {% set p_color = p_color_map.get(p_status.value if p_status else 'UNKNOWN', 'gray') %}
+                                bg-{{ p_color }}-100 text-{{ p_color }}-800" data-status="{{ patient.status.value if patient.status else 'UNKNOWN' }}">
+                                {{ patient.status.value.replace('_', ' ').title() if patient.status else 'Unknown' }}
                             </span>
                         </td>
-                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ patient.admission_date.strftime('%Y-%m-%d') }}</td>
+                        <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ patient.admission_date.strftime('%Y-%m-%d') if patient.admission_date else 'N/A' }}</td>
                         <td class="px-6 py-4 whitespace-nowrap text-sm font-medium">
-                            <a href="{{ url_for('patients.patient_detail', patient_id=patient.patient_id) }}" class="text-blue-600 hover:text-blue-900 mr-3">
+                            <a href="{{ url_for('patients.patient_detail', patient_id=patient.patient_id) }}" class="text-blue-600 hover:text-blue-900 mr-3" title="View Details">
                                 <i class="fas fa-eye text-2xl"></i>
                             </a>
-                            <a href="{{ url_for('patients.edit_patient', patient_id=patient.patient_id) }}" class="text-indigo-600 hover:text-indigo-900 mr-3">
+                            {% if patient.status and patient.status.value != 'COMPLETED' %}
+                            <a href="{{ url_for('patients.edit_patient', patient_id=patient.patient_id) }}" class="text-indigo-600 hover:text-indigo-900 mr-3" title="Edit Patient">
                                 <i class="fas fa-edit text-2xl"></i>
                             </a>
-                            <button type="button" data-patient-id="{{ patient.patient_id }}" class="text-red-600 hover:text-red-900 delete-patient">
+                            {% endif %}
+                            <button type="button" data-patient-id="{{ patient.patient_id }}" class="text-red-600 hover:text-red-900 delete-patient" title="Delete Patient">
                                 <i class="fas fa-trash text-2xl"></i>
                             </button>
                         </td>
@@ -192,6 +199,7 @@
             <div class="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
                 <form id="delete-form" action="" method="POST">
                     <input type="hidden" name="_method" value="DELETE">
+                    {{ EmptyForm().csrf_token }}
                     <button type="submit" class="w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 bg-red-600 text-base font-medium text-white hover:bg-red-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-red-500 sm:ml-3 sm:w-auto sm:text-sm">
                         Delete
                     </button>
@@ -208,37 +216,114 @@
 {% block scripts %}
 <script>
     document.addEventListener('DOMContentLoaded', function() {
-        // Search functionality
         const searchInput = document.getElementById('search');
-        searchInput.addEventListener('input', function() {
-            // In a real application, you would implement searching here
-            // For now we'll just console.log the search term
-            console.log('Searching for:', this.value);
-        });
-        
-        // Status filter
         const statusFilter = document.getElementById('status-filter');
-        statusFilter.addEventListener('change', function() {
-            console.log('Filtering by status:', this.value);
-        });
+        const patientTableBody = document.querySelector('tbody');
+        const patientRows = patientTableBody.querySelectorAll('tr');
+        const noPatientsRow = patientTableBody.querySelector('td[colspan="6"]')?.closest('tr'); // Hàng "No patients found"
+
+        function filterAndSearchPatients() {
+            const searchTerm = searchInput.value.toLowerCase();
+            const selectedStatus = statusFilter.value;
+            let visibleCount = 0;
+
+            patientRows.forEach(row => {
+                // Bỏ qua hàng "No patients found" khỏi việc lọc
+                if (row === noPatientsRow) return; 
+
+                const patientId = row.cells[0].textContent.toLowerCase();
+                const patientName = row.cells[1].textContent.toLowerCase();
+                const patientStatus = row.querySelector('[data-status]')?.getAttribute('data-status');
+
+                const matchesSearch = patientId.includes(searchTerm) || patientName.includes(searchTerm);
+                const matchesStatus = !selectedStatus || patientStatus === selectedStatus;
+
+                if (matchesSearch && matchesStatus) {
+                    row.style.display = ''; // Hiện hàng
+                    visibleCount++;
+                } else {
+                    row.style.display = 'none'; // Ẩn hàng
+                }
+            });
+
+            // Hiển thị/Ẩn thông báo "No patients found"
+            if (noPatientsRow) {
+                noPatientsRow.style.display = visibleCount === 0 ? '' : 'none';
+            }
+            
+            // Cập nhật thông tin pagination (Tạm thời bỏ qua, cần logic phức tạp hơn nếu phân trang phía server)
+            // Bạn có thể cần gọi lại API hoặc cập nhật logic phân trang JS nếu muốn phân trang hoạt động chính xác với bộ lọc/tìm kiếm client-side
+        }
+
+        // Event listeners
+        searchInput.addEventListener('input', filterAndSearchPatients);
+        statusFilter.addEventListener('change', filterAndSearchPatients);
         
-        // Delete modal functionality
+        // Delete modal functionality (giữ nguyên)
         const deleteButtons = document.querySelectorAll('.delete-patient');
         const deleteModal = document.getElementById('delete-modal');
         const deleteForm = document.getElementById('delete-form');
         const cancelDelete = document.getElementById('cancel-delete');
-        
-        deleteButtons.forEach(button => {
-            button.addEventListener('click', function() {
-                const patient_id = this.getAttribute('data-patient-id');
-                deleteForm.action = `/patients/${patient_id}/delete`;
-                deleteModal.classList.remove('hidden');
+        const modalPatientIdInput = document.getElementById('modal-patient-id'); // Giả sử có input này
+
+        if (deleteButtons && deleteModal && deleteForm && cancelDelete) {
+            const confirmDeleteBtn = deleteModal.querySelector('button[type="submit"]'); // Tìm nút Delete trong modal
+
+            deleteButtons.forEach(button => {
+                button.addEventListener('click', function(event) {
+                    event.preventDefault(); // Ngăn hành động mặc định nếu nút nằm trong form
+                    const patientId = this.getAttribute('data-patient-id');
+                    // Đặt action cho form xóa
+                    deleteForm.action = `{{ url_for('patients.delete_patient', patient_id='PATIENT_ID_PLACEHOLDER') }}`.replace('PATIENT_ID_PLACEHOLDER', patientId);
+                    
+                    // (Tùy chọn) Hiển thị ID/tên bệnh nhân trong modal
+                    const patientNameElement = this.closest('tr').querySelector('.text-sm.font-medium.text-gray.900'); 
+                    // Lấy element để hiển thị thông báo trong modal (cần id hoặc class cụ thể)
+                    const modalMessageElement = deleteModal.querySelector('#delete-confirmation-message'); // Giả sử element có id này
+                    if (modalMessageElement && patientNameElement) {
+                        modalMessageElement.textContent = `Are you sure you want to delete patient ${patientNameElement.textContent.trim()} (ID: ${patientId})? All data will be permanently removed.`;
+                    } else {
+                        // Hiển thị text mặc định nếu không tìm thấy element
+                        const modalDefaultTextElement = deleteModal.querySelector('#delete-default-message'); // Giả sử có id này
+                         if (modalDefaultTextElement) modalDefaultTextElement.classList.remove('hidden');
+                    }
+
+                    deleteModal.classList.remove('hidden');
+                    deleteModal.setAttribute('aria-hidden', 'false');
+                });
             });
-        });
-        
-        cancelDelete.addEventListener('click', function() {
-            deleteModal.classList.add('hidden');
-        });
+
+            // Xử lý khi nút Cancel được click
+            cancelDelete.addEventListener('click', function() {
+                deleteModal.classList.add('hidden');
+                deleteModal.setAttribute('aria-hidden', 'true');
+                // Reset message nếu cần
+                const modalMessageElement = deleteModal.querySelector('#delete-confirmation-message'); 
+                 if (modalMessageElement) modalMessageElement.textContent = 'Are you sure you want to delete this patient? All data will be permanently removed from our servers. This action cannot be undone.';
+                 const modalDefaultTextElement = deleteModal.querySelector('#delete-default-text');
+                 if (modalDefaultTextElement) modalDefaultTextElement.classList.add('hidden'); 
+            });
+            
+            // Xử lý khi nút Confirm (Delete) trong modal được click
+            if (confirmDeleteBtn) {
+                confirmDeleteBtn.addEventListener('click', function(event) {
+                    event.preventDefault(); // Ngăn submit mặc định của nút
+                    deleteForm.submit(); // Submit form một cách tường minh
+                });
+            }
+
+            // Đóng modal khi click bên ngoài
+             deleteModal.addEventListener('click', function(event) {
+                 if (event.target === deleteModal) {
+                      cancelDelete.click(); 
+                 }
+             });
+        } else {
+            console.warn('Delete modal elements not found. Delete functionality might be incomplete.');
+        }
+
+        // Initial filter on load (optional)
+        // filterAndSearchPatients(); 
     });
 </script>
 {% endblock %}
diff --git a/app/templates/physical_measurements.html b/app/templates/physical_measurements.html
index 4112cb28ea218a3b2cb39ca875f8b716e8240c63..a90913189a26889a6fcf185106dad1be812640a7 100644
--- a/app/templates/physical_measurements.html
+++ b/app/templates/physical_measurements.html
@@ -38,22 +38,34 @@
     </div>
 
     <!-- Các nút thao tác -->
-    <div class="flex justify-end items-center mb-6 space-x-3">
-         <!-- Nút Upload CSV -->
-         <form id="uploadCsvForm" action="{{ url_for('patients.upload_measurements_csv', patient_id=patient.id) }}" method="post" enctype="multipart/form-data" class="inline-flex">
-             <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
-             <label for="csvFile" class="cursor-pointer inline-flex items-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 transition-all duration-200">
-                 <i class="fas fa-file-csv -ml-1 mr-2 text-gray-500"></i>
-                 Upload CSV
-             </label>
-             <input type="file" id="csvFile" name="csv_file" class="hidden" accept=".csv">
-         </form>
-
-         <!-- Nút Thêm đo lường -->
-         <a href="{{ url_for('patients.new_physical_measurement', patient_id=patient.id) }}" class="inline-flex items-center px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-all duration-200 transform hover:-translate-y-1">
-            <i class="fas fa-plus -ml-1 mr-2"></i>
-            Thêm đo lường
+    <div class="flex justify-between items-center mb-6 space-x-3">
+        <!-- Nút Back (Thêm mới) -->
+        <a href="{{ url_for('patients.patient_detail', patient_id=patient.id, _anchor='encounters') }}" 
+           class="inline-flex items-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 transition-all duration-200">
+            <i class="fas fa-arrow-left -ml-1 mr-2 text-gray-500"></i>
+            Quay lại
         </a>
+
+        <!-- Các nút còn lại (Upload CSV) -->
+        <div class="flex items-center space-x-3">
+             <!-- Nút Upload CSV -->
+             <form id="uploadCsvForm" action="{{ url_for('patients.upload_measurements_csv', patient_id=patient.id) }}" method="post" enctype="multipart/form-data" class="inline-flex">
+                 <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
+                 <label for="csvFile" class="cursor-pointer inline-flex items-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 transition-all duration-200">
+                     <i class="fas fa-file-csv -ml-1 mr-2 text-gray-500"></i>
+                     Upload CSV
+                 </label>
+                 <input type="file" id="csvFile" name="csv_file" class="hidden" accept=".csv">
+             </form>
+
+             <!-- Nút Thêm đo lường (ĐÃ XÓA) -->
+             {# 
+             <a href="{{ url_for('patients.new_physical_measurement', patient_id=patient.id) }}" class="inline-flex items-center px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-all duration-200 transform hover:-translate-y-1">
+                <i class="fas fa-plus -ml-1 mr-2"></i>
+                Thêm đo lường
+            </a> 
+             #}
+        </div>
     </div>
 
     <!-- Container thông báo -->
diff --git a/app/templates/procedure_form.html b/app/templates/procedure_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..673ec083ea613156e89eb3950dd4f96827726322
--- /dev/null
+++ b/app/templates/procedure_form.html
@@ -0,0 +1,117 @@
+{% extends 'base.html' %}
+
+{% block title %}{% if edit_mode %}Edit Procedure{% else %}New Procedure{% endif %} - Dietitian Area{% endblock %}
+
+{% block head %}
+{{ super() }}
+{# Add any specific CSS/JS for this form if needed #}
+{% endblock %}
+
+{% block content %}
+<div class="container mx-auto px-4 py-6 animate-slide-in">
+
+    <div class="bg-white shadow-md rounded-lg p-6 mb-8">
+        <div class="flex justify-between items-center mb-6 pb-4 border-b border-gray-200">
+            <h1 class="text-2xl font-bold text-gray-800">
+                {% if edit_mode %}
+                    Edit Procedure {% if procedure %}#{{ procedure.id }}{% endif %}
+                {% else %}
+                    Add New Procedure for Patient: {{ patient.full_name }} ({{ patient.id }})
+                {% endif %}
+            </h1>
+            <a href="{{ url_for('.list_procedures', patient_id=patient.id if patient else None) }}" class="text-gray-600 hover:text-gray-800 font-medium flex items-center transition duration-300">
+                <i class="fas fa-arrow-left mr-2"></i>
+                Back to Procedures List
+            </a>
+        </div>
+
+        {# Form Rendering #}
+        <form method="POST" action="{{ url_for('.new_procedure', patient_id=patient.id) if not edit_mode else '' # TODO: Add edit action url # }}" class="space-y-6" novalidate>
+            {{ form.hidden_tag() }} {# Important for CSRF protection #}
+
+            {# Associated Encounter #}
+            <div class="form-group">
+                {{ form.encounter_id.label(class="block text-sm font-medium text-gray-700 mb-1") }}
+                {{ form.encounter_id(class='w-full rounded-md border-gray-400 shadow-sm focus:border-blue-500 focus:ring focus:ring-blue-500 focus:ring-opacity-50 ' + ('is-invalid' if form.encounter_id.errors else '')) }}
+                {% if form.encounter_id.errors %}
+                    <div class="text-red-500 text-sm mt-1">
+                        {% for error in form.encounter_id.errors %}<span>{{ error }}</span>{% endfor %}
+                    </div>
+                {% endif %}
+            </div>
+
+            {# Procedure Type and Name (Side-by-side) #}
+            <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
+                <div class="form-group">
+                    {{ form.procedureType.label(class="block text-sm font-medium text-gray-700 mb-1") }}
+                    {{ form.procedureType(class='w-full rounded-md border-gray-400 shadow-sm focus:border-blue-500 focus:ring focus:ring-blue-500 focus:ring-opacity-50 ' + ('is-invalid' if form.procedureType.errors else '')) }}
+                    {% if form.procedureType.errors %}
+                        <div class="text-red-500 text-sm mt-1">
+                            {% for error in form.procedureType.errors %}<span>{{ error }}</span>{% endfor %}
+                        </div>
+                    {% endif %}
+                </div>
+                <div class="form-group">
+                    {{ form.procedureName.label(class="block text-sm font-medium text-gray-700 mb-1") }}
+                    {{ form.procedureName(class='w-full rounded-md border-gray-400 shadow-sm focus:border-blue-500 focus:ring focus:ring-blue-500 focus:ring-opacity-50 ' + ('is-invalid' if form.procedureName.errors else ''), placeholder="e.g., NG Tube Size 12 Fr") }}
+                    {% if form.procedureName.errors %}
+                        <div class="text-red-500 text-sm mt-1">
+                            {% for error in form.procedureName.errors %}<span>{{ error }}</span>{% endfor %}
+                        </div>
+                    {% endif %}
+                </div>
+            </div>
+
+            {# Date/Time Performed and End Date/Time (Side-by-side) #}
+            <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
+                 <div class="form-group">
+                    {{ form.procedureDateTime.label(class="block text-sm font-medium text-gray-700 mb-1") }}
+                    {{ form.procedureDateTime(class='w-full rounded-md border-gray-400 shadow-sm focus:border-blue-500 focus:ring focus:ring-blue-500 focus:ring-opacity-50 ' + ('is-invalid' if form.procedureDateTime.errors else ''), type='datetime-local') }}
+                    {% if form.procedureDateTime.errors %}
+                        <div class="text-red-500 text-sm mt-1">
+                            {% for error in form.procedureDateTime.errors %}<span>{{ error }}</span>{% endfor %}
+                        </div>
+                    {% endif %}
+                </div>
+                 <div class="form-group">
+                    {{ form.procedureEndDateTime.label(class="block text-sm font-medium text-gray-700 mb-1") }}
+                    {{ form.procedureEndDateTime(class='w-full rounded-md border-gray-400 shadow-sm focus:border-blue-500 focus:ring focus:ring-blue-500 focus:ring-opacity-50 ' + ('is-invalid' if form.procedureEndDateTime.errors else ''), type='datetime-local') }}
+                    {% if form.procedureEndDateTime.errors %}
+                        <div class="text-red-500 text-sm mt-1">
+                            {% for error in form.procedureEndDateTime.errors %}<span>{{ error }}</span>{% endfor %}
+                        </div>
+                    {% endif %}
+                </div>
+            </div>
+
+            {# Description/Notes #}
+             <div class="form-group">
+                {{ form.description.label(class="block text-sm font-medium text-gray-700 mb-1") }}
+                {{ form.description(class='w-full rounded-md border-gray-400 shadow-sm focus:border-blue-500 focus:ring focus:ring-blue-500 focus:ring-opacity-50 ' + ('is-invalid' if form.description.errors else '')) }}
+                {% if form.description.errors %}
+                    <div class="text-red-500 text-sm mt-1">
+                        {% for error in form.description.errors %}<span>{{ error }}</span>{% endfor %}
+                    </div>
+                {% endif %}
+            </div>
+
+            {# Results/Outcome #}
+            <div class="form-group">
+                {{ form.procedureResults.label(class="block text-sm font-medium text-gray-700 mb-1") }}
+                {{ form.procedureResults(class='w-full rounded-md border-gray-400 shadow-sm focus:border-blue-500 focus:ring focus:ring-blue-500 focus:ring-opacity-50 ' + ('is-invalid' if form.procedureResults.errors else '')) }}
+                {% if form.procedureResults.errors %}
+                    <div class="text-red-500 text-sm mt-1">
+                        {% for error in form.procedureResults.errors %}<span>{{ error }}</span>{% endfor %}
+                    </div>
+                {% endif %}
+            </div>
+
+            {# Form Actions #}
+            <div class="flex justify-end pt-6 border-t border-gray-200">
+                 {{ form.submit(class="bg-green-600 hover:bg-green-700 text-white font-medium py-2 px-5 rounded-md transition duration-300 shadow hover:shadow-md cursor-pointer") }}
+            </div>
+
+        </form>
+    </div>
+</div>
+{% endblock %} 
\ No newline at end of file
diff --git a/app/templates/report.html b/app/templates/report.html
index d3b39b378b549027e04dbcd46031fa80f23989be..af032a2c1f62e5c0c4fad3873ae151bada02396e 100644
--- a/app/templates/report.html
+++ b/app/templates/report.html
@@ -7,16 +7,21 @@
     <div class="mb-6 md:flex md:items-center md:justify-between fade-in">
         <div class="min-w-0 flex-1">
             <h2 class="text-2xl font-bold leading-7 text-gray-900 sm:truncate sm:text-3xl sm:tracking-tight">
-                Reports and Analysis
+                Reports and Analysis {% if current_user.role == 'Dietitian' %} (My Reports){% endif %}
             </h2>
         </div>
         <div class="mt-4 flex md:ml-4 md:mt-0 gap-2">
+            {# Nút Create Report chỉ cho Admin #}
+            {% if current_user.is_admin %}
             <a href="{{ url_for('report.new_report') }}" class="flex items-center justify-center px-4 py-2 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-primary-600 hover:bg-primary-700 transform hover:scale-105 transition-all duration-200">
                 <svg class="w-4 h-4 mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
                     <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6v6m0 0v6m0-6h6m-6 0H6"></path>
                 </svg>
                 Create Patient Report
             </a>
+            {% endif %}
+            {# Nút Generate Statistics chỉ cho Admin #}
+            {% if current_user.is_admin %}
             <div class="dropdown relative">
                 <button id="reportDropdownButton" data-dropdown-toggle="reportDropdown" class="flex items-center justify-center px-4 py-2 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 transform hover:scale-105 transition-all duration-200">
                     <svg class="w-4 h-4 mr-2" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
@@ -30,36 +35,58 @@
                     <a href="{{ url_for('report.create_stats_report', report_type='monthly') }}" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">Monthly Report</a>
                 </div>
             </div>
+            {% endif %}
         </div>
     </div>
 
     <!-- Filters -->
     <div class="mb-6 p-4 bg-white rounded-lg shadow hover:shadow-md transition-shadow duration-300">
-        <form method="GET" action="{{ url_for('report.index') }}" class="grid grid-cols-1 md:grid-cols-3 gap-4">
+        {# Form có id để JS nhắm tới #}
+        <form id="reportFilterForm" method="GET" action="{{ url_for('report.index') }}" 
+              class="grid grid-cols-1 {{ 'md:grid-cols-4' if current_user.is_admin else 'md:grid-cols-2' }} gap-4">
+            
+            {# Report Type Filter (Chung) #}
             <div>
                 <label for="report_type" class="block text-sm font-medium text-gray-700">Report Type</label>
-                <select id="report_type" name="report_type" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500">
+                <select id="report_type" name="report_type" class="filter-change mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500">
                     <option value="">All Types</option>
-                    <option value="initial_assessment" {% if request.args.get('report_type') == 'initial_assessment' %}selected{% endif %}>Initial Assessment</option>
-                    <option value="follow_up" {% if request.args.get('report_type') == 'follow_up' %}selected{% endif %}>Follow-up</option>
-                    <option value="discharge" {% if request.args.get('report_type') == 'discharge' %}selected{% endif %}>Discharge</option>
-                    <option value="consultation" {% if request.args.get('report_type') == 'consultation' %}selected{% endif %}>Nutrition Consultation</option>
-                    <option value="progress" {% if request.args.get('report_type') == 'progress' %}selected{% endif %}>Progress Report</option>
+                    {% for value, display in report_types_choices %}
+                    <option value="{{ value }}" {% if value == selected_report_type %}selected{% endif %}>{{ display }}</option>
+                    {% endfor %}
                 </select>
             </div>
+            
+            {# Status Filter (Chung) #}
             <div>
                 <label for="status" class="block text-sm font-medium text-gray-700">Status</label>
-                <select id="status" name="status" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500">
+                <select id="status" name="status" class="filter-change mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500">
                     <option value="">All Statuses</option>
-                    <option value="draft" {% if request.args.get('status') == 'draft' %}selected{% endif %}>Draft</option>
-                    <option value="finalized" {% if request.args.get('status') == 'finalized' %}selected{% endif %}>Finalized</option>
+                     {% for value, display in report_statuses_choices %}
+                    <option value="{{ value }}" {% if value == selected_status %}selected{% endif %}>{{ display }}</option>
+                    {% endfor %}
                 </select>
             </div>
+            
+            {# Dietitian Filter (Chỉ Admin) #}
+            {% if current_user.is_admin %}
+            <div>
+                <label for="dietitian_id" class="block text-sm font-medium text-gray-700">Filter by Dietitian</label>
+                <select id="dietitian_id" name="dietitian_id" class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500">
+                    <option value="">All Dietitians</option>
+                    {% for d in dietitians_for_filter %}
+                    <option value="{{ d.userID }}" {% if d.userID == selected_dietitian_id %}selected{% endif %}>{{ d.full_name }}</option>
+                    {% endfor %}
+                </select>
+            </div>
+            
+            {# Nút Filter cho Admin #}
             <div class="flex items-end">
                 <button type="submit" class="w-full px-4 py-2 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-primary-600 hover:bg-primary-700 transform hover:scale-105 transition-all duration-200">
-                    Filter Reports
+                    <i class="fas fa-filter mr-1"></i> Filter Reports
                 </button>
             </div>
+            {% endif %}
+            {# Dietitian không có nút filter riêng #}
         </form>
     </div>
 
@@ -69,27 +96,16 @@
             <table class="min-w-full divide-y divide-gray-200">
                 <thead class="bg-gray-50">
                     <tr>
-                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
-                            ID
-                        </th>
-                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
-                            Patient
-                        </th>
-                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
-                            Type
-                        </th>
-                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
-                            Report Date
-                        </th>
-                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
-                            Author
-                        </th>
-                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
-                            Status
-                        </th>
-                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
-                            Actions
-                        </th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">ID</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Patient</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Type</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Report Date</th>
+                        {# Chỉ Admin thấy cột Author #}
+                        {% if current_user.is_admin %}
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Author</th>
+                        {% endif %}
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Status</th>
+                        <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Actions</th>
                     </tr>
                 </thead>
                 <tbody class="bg-white divide-y divide-gray-200">
@@ -104,65 +120,67 @@
                             </a>
                         </td>
                         <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
-                            {% if report.report_type == 'initial_assessment' %}
-                                <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-blue-100 text-blue-800">
-                                    Initial Assessment
-                                </span>
-                            {% elif report.report_type == 'follow_up' %}
-                                <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">
-                                    Follow-up
-                                </span>
-                            {% elif report.report_type == 'discharge' %}
-                                <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-purple-100 text-purple-800">
-                                    Discharge
-                                </span>
-                            {% elif report.report_type == 'consultation' %}
-                                <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-yellow-100 text-yellow-800">
-                                    Nutrition Consultation
-                                </span>
-                            {% elif report.report_type == 'progress' %}
-                                <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-indigo-100 text-indigo-800">
-                                    Progress Report
-                                </span>
-                            {% endif %}
+                            {# Hiển thị loại report với badge màu #}
+                            {% set type_color_map = {
+                                'initial_assessment': 'blue',
+                                'follow_up': 'green',
+                                'discharge': 'purple',
+                                'consultation': 'yellow',
+                                'progress': 'indigo'
+                            } %}
+                            {% set type_color = type_color_map.get(report.report_type, 'gray') %}
+                            <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-{{ type_color }}-100 text-{{ type_color }}-800">
+                                {{ report.report_type.replace('_', ' ').title() }}
+                            </span>
                         </td>
                         <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
                             {{ report.report_date.strftime('%d-%m-%Y %H:%M') }}
                         </td>
+                        {# Chỉ Admin thấy cột Author #}
+                        {% if current_user.is_admin %}
                         <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
-                            {{ report.author.full_name }}
+                            {{ report.author.full_name if report.author else 'N/A'}}
                         </td>
+                        {% endif %}
                         <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
-                            {% if report.status == 'draft' %}
-                                <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-gray-100 text-gray-800">
-                                    Draft
-                                </span>
-                            {% elif report.status == 'finalized' %}
-                                <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800">
-                                    Finalized
-                                </span>
-                            {% endif %}
+                            {# Hiển thị status với badge màu #}
+                            {% set status_color_map = {
+                                'Draft': 'gray',
+                                'Pending': 'yellow',
+                                'Completed': 'green'
+                            } %}
+                            {% set status_color = status_color_map.get(report.status, 'gray') %}
+                            <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-{{ status_color }}-100 text-{{ status_color }}-800">
+                                {{ report.status }}
+                            </span>
                         </td>
                         <td class="px-6 py-4 whitespace-nowrap text-sm font-medium">
                             <div class="flex items-center space-x-2">
-                                <a href="{{ url_for('report.view_report', report_id=report.id) }}" class="text-primary-600 hover:text-primary-900 transform hover:scale-110 transition-transform duration-200">
-                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
-                                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
-                                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z" />
-                                    </svg>
+                                <a href="{{ url_for('report.view_report', report_id=report.id) }}" class="text-primary-600 hover:text-primary-900 transform hover:scale-110 transition-transform duration-200" title="View Report">
+                                    <i class="fas fa-eye"></i>
                                 </a>
-                                {% if report.status == 'draft' %}
-                                <a href="{{ url_for('report.edit_report', report_id=report.id) }}" class="text-indigo-600 hover:text-indigo-900 transform hover:scale-110 transition-transform duration-200">
-                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
-                                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z" />
-                                    </svg>
+                                {# Nút Edit chỉ hiện khi Draft/Pending và có quyền (Admin hoặc Author/Assigned Dietitian) #}
+                                {# Logic kiểm tra quyền đã phức tạp hơn, dựa vào route xử lý #}
+                                {% if report.status in ['Draft', 'Pending'] %}
+                                <a href="{{ url_for('report.edit_report', report_id=report.id) }}" class="text-indigo-600 hover:text-indigo-900 transform hover:scale-110 transition-transform duration-200" title="Edit Report">
+                                    <i class="fas fa-edit"></i>
                                 </a>
                                 {% endif %}
-                                <a href="{{ url_for('report.download_report', report_id=report.id) }}" class="text-green-600 hover:text-green-900 transform hover:scale-110 transition-transform duration-200">
-                                    <svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" fill="none" viewBox="0 0 24 24" stroke="currentColor">
-                                        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" />
-                                    </svg>
+                                {# Nút Download chỉ khi Completed #}
+                                {% if report.status == 'Completed' %}
+                                <a href="{{ url_for('report.download_report', report_id=report.id) }}" class="text-green-600 hover:text-green-900 transform hover:scale-110 transition-transform duration-200" title="Download PDF">
+                                    <i class="fas fa-file-pdf"></i>
                                 </a>
+                                {% endif %}
+                                {# Nút Xóa chỉ cho Admin #}
+                                {% if current_user.is_admin %}
+                                <form action="{{ url_for('report.delete_report', report_id=report.id) }}" method="POST" class="inline needs-confirmation" data-confirmation-message="Are you sure you want to delete report #{{ report.id }}? This cannot be undone.">
+                                     {{ csrf_token() }}
+                                     <button type="submit" class="text-red-600 hover:text-red-900 transform hover:scale-110 transition-transform duration-200" title="Delete Report">
+                                        <i class="fas fa-trash-alt"></i>
+                                    </button>
+                                </form>
+                                {% endif %}
                             </div>
                         </td>
                     </tr>
@@ -170,8 +188,8 @@
 
                     {% if reports.items|length == 0 %}
                     <tr>
-                        <td colspan="7" class="px-6 py-4 text-center text-sm text-gray-500">
-                            No reports found.
+                        <td colspan="{{ 7 if current_user.is_admin else 6 }}" class="px-6 py-4 text-center text-sm text-gray-500">
+                            No reports found matching the criteria.
                         </td>
                     </tr>
                     {% endif %}
@@ -180,144 +198,114 @@
         </div>
         
         <!-- Pagination -->
+        {% if reports.pages > 1 %}
         <div class="px-4 py-3 flex items-center justify-between border-t border-gray-200 sm:px-6">
             <div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between">
                 <div>
                     <p class="text-sm text-gray-700">
-                        Showing <span class="font-medium">{{ reports.items|length }}</span> of <span class="font-medium">{{ reports.total }}</span> reports
+                        Showing <span class="font-medium">{{ reports.first }}</span> to <span class="font-medium">{{ reports.last }}</span> of <span class="font-medium">{{ reports.total }}</span> reports
                     </p>
                 </div>
                 <div>
                     <nav class="relative z-0 inline-flex rounded-md shadow-sm -space-x-px" aria-label="Pagination">
-                        {% if reports.has_prev %}
-                        <a href="{{ url_for('report.index', page=reports.prev_num, report_type=request.args.get('report_type', ''), status=request.args.get('status', '')) }}" class="relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50">
+                        {# Tạo URL với các filter hiện tại #}
+                        {% set pagination_args = request.args.to_dict() %}
+                        {% set _ = pagination_args.pop('page', None) %}
+                        
+                        <a href="{{ url_for('report.index', page=reports.prev_num, **pagination_args) if reports.has_prev else '#' }}" 
+                           class="relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 {{ 'opacity-50 cursor-not-allowed' if not reports.has_prev else '' }}">
                             <span class="sr-only">Previous</span>
-                            <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
-                                <path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
-                            </svg>
+                            <i class="fas fa-chevron-left h-5 w-5"></i>
                         </a>
-                        {% else %}
-                        <span class="relative inline-flex items-center px-2 py-2 rounded-l-md border border-gray-300 bg-gray-100 text-sm font-medium text-gray-400 cursor-not-allowed">
-                            <span class="sr-only">Previous</span>
-                            <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
-                                <path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
-                            </svg>
-                        </span>
-                        {% endif %}
                         
                         {% for page_num in reports.iter_pages(left_edge=1, right_edge=1, left_current=2, right_current=2) %}
                             {% if page_num %}
-                                {% if page_num == reports.page %}
-                                <span class="relative inline-flex items-center px-4 py-2 border border-gray-300 bg-primary-100 text-sm font-medium text-primary-700">
-                                    {{ page_num }}
-                                </span>
-                                {% else %}
-                                <a href="{{ url_for('report.index', page=page_num, report_type=request.args.get('report_type', ''), status=request.args.get('status', '')) }}" class="relative inline-flex items-center px-4 py-2 border border-gray-300 bg-white text-sm font-medium text-gray-700 hover:bg-gray-50">
+                                <a href="{{ url_for('report.index', page=page_num, **pagination_args) }}" 
+                                   class="relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium 
+                                   {% if page_num == reports.page %}bg-primary-100 text-primary-700{% else %}bg-white text-gray-700 hover:bg-gray-50{% endif %}">
                                     {{ page_num }}
                                 </a>
-                                {% endif %}
                             {% else %}
-                                <span class="relative inline-flex items-center px-4 py-2 border border-gray-300 bg-white text-sm font-medium text-gray-700">
-                                    ...
-                                </span>
+                                <span class="relative inline-flex items-center px-4 py-2 border border-gray-300 bg-white text-sm font-medium text-gray-700">...</span>
                             {% endif %}
                         {% endfor %}
                         
-                        {% if reports.has_next %}
-                        <a href="{{ url_for('report.index', page=reports.next_num, report_type=request.args.get('report_type', ''), status=request.args.get('status', '')) }}" class="relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50">
+                        <a href="{{ url_for('report.index', page=reports.next_num, **pagination_args) if reports.has_next else '#' }}" 
+                           class="relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-white text-sm font-medium text-gray-500 hover:bg-gray-50 {{ 'opacity-50 cursor-not-allowed' if not reports.has_next else '' }}">
                             <span class="sr-only">Next</span>
-                            <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
-                                <path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
-                            </svg>
+                            <i class="fas fa-chevron-right h-5 w-5"></i>
                         </a>
-                        {% else %}
-                        <span class="relative inline-flex items-center px-2 py-2 rounded-r-md border border-gray-300 bg-gray-100 text-sm font-medium text-gray-400 cursor-not-allowed">
-                            <span class="sr-only">Next</span>
-                            <svg class="h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
-                                <path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
-                            </svg>
-                        </span>
-                        {% endif %}
                     </nav>
                 </div>
             </div>
         </div>
+        {% endif %}
     </div>
 </div>
 
-<!-- Statistics -->
+<!-- Report Statistics (Chung) -->
 <div class="px-4 py-6 sm:px-6 lg:px-8 max-w-7xl mx-auto">
     <h3 class="text-lg font-medium leading-6 text-gray-900 mb-4">Report Statistics</h3>
-    <div class="grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-3">
+    <div class="grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-4"> {# Thêm cột cho Pending #}
         <!-- Total Reports -->
         <div class="bg-white overflow-hidden shadow rounded-lg hover-shadow transform hover:scale-102 transition-all duration-300">
             <div class="p-5">
                 <div class="flex items-center">
                     <div class="flex-shrink-0 bg-primary-100 rounded-md p-3">
-                        <svg class="h-6 w-6 text-primary-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
-                            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
-                        </svg>
+                        <i class="fas fa-file-alt h-6 w-6 text-primary-600"></i>
                     </div>
                     <div class="ml-5 w-0 flex-1">
                         <dl>
-                            <dt class="text-sm font-medium text-gray-500 truncate">
-                                Total Reports
-                            </dt>
-                            <dd>
-                                <div class="text-lg font-medium text-gray-900">
-                                    {{ stats.total }}
-                                </div>
-                            </dd>
+                            <dt class="text-sm font-medium text-gray-500 truncate">Total Reports</dt>
+                            <dd><div class="text-lg font-medium text-gray-900">{{ stats.total }}</div></dd>
                         </dl>
                     </div>
                 </div>
             </div>
         </div>
-
-        <!-- Reports this month -->
+        <!-- Draft Reports -->
         <div class="bg-white overflow-hidden shadow rounded-lg hover-shadow transform hover:scale-102 transition-all duration-300">
             <div class="p-5">
                 <div class="flex items-center">
-                    <div class="flex-shrink-0 bg-green-100 rounded-md p-3">
-                        <svg class="h-6 w-6 text-green-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
-                            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
-                        </svg>
+                    <div class="flex-shrink-0 bg-gray-100 rounded-md p-3">
+                        <i class="fas fa-pencil-alt h-6 w-6 text-gray-600"></i>
                     </div>
                     <div class="ml-5 w-0 flex-1">
                         <dl>
-                            <dt class="text-sm font-medium text-gray-500 truncate">
-                                Reports This Month
-                            </dt>
-                            <dd>
-                                <div class="text-lg font-medium text-gray-900">
-                                    {{ stats.this_month }}
-                                </div>
-                            </dd>
+                            <dt class="text-sm font-medium text-gray-500 truncate">Draft Reports</dt>
+                            <dd><div class="text-lg font-medium text-gray-900">{{ stats.draft }}</div></dd>
                         </dl>
                     </div>
                 </div>
             </div>
         </div>
-
-        <!-- Drafted Reports -->
+        <!-- Pending Reports -->
         <div class="bg-white overflow-hidden shadow rounded-lg hover-shadow transform hover:scale-102 transition-all duration-300">
             <div class="p-5">
                 <div class="flex items-center">
                     <div class="flex-shrink-0 bg-yellow-100 rounded-md p-3">
-                        <svg class="h-6 w-6 text-yellow-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
-                            <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z" />
-                        </svg>
+                        <i class="fas fa-hourglass-half h-6 w-6 text-yellow-600"></i>
+                    </div>
+                    <div class="ml-5 w-0 flex-1">
+                        <dl>
+                            <dt class="text-sm font-medium text-gray-500 truncate">Pending Reports</dt>
+                            <dd><div class="text-lg font-medium text-gray-900">{{ stats.pending }}</div></dd>
+                        </dl>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!-- Completed Reports -->
+        <div class="bg-white overflow-hidden shadow rounded-lg hover-shadow transform hover:scale-102 transition-all duration-300">
+            <div class="p-5">
+                <div class="flex items-center">
+                    <div class="flex-shrink-0 bg-green-100 rounded-md p-3">
+                        <i class="fas fa-check-circle h-6 w-6 text-green-600"></i>
                     </div>
                     <div class="ml-5 w-0 flex-1">
                         <dl>
-                            <dt class="text-sm font-medium text-gray-500 truncate">
-                                Draft Reports
-                            </dt>
-                            <dd>
-                                <div class="text-lg font-medium text-gray-900">
-                                    {{ stats.draft }}
-                                </div>
-                            </dd>
+                            <dt class="text-sm font-medium text-gray-500 truncate">Completed Reports</dt>
+                            <dd><div class="text-lg font-medium text-gray-900">{{ stats.completed }}</div></dd>
                         </dl>
                     </div>
                 </div>
@@ -326,7 +314,17 @@
     </div>
 </div>
 
-<!-- Report Type Distribution Chart -->
+{# Biểu đồ Contribution chỉ cho Admin #}
+{% if current_user.is_admin and dietitian_contribution_chart_data %}
+<div class="px-4 py-6 sm:px-6 lg:px-8 max-w-7xl mx-auto">
+    <div class="bg-white shadow rounded-lg p-6 hover:shadow-lg transition-shadow duration-300">
+        <h3 class="text-lg font-medium leading-6 text-gray-900 mb-4">Dietitian Report Contributions</h3>
+        <canvas id="dietitianContributionChart" class="mt-4 max-h-80"></canvas>
+    </div>
+</div>
+{% endif %}
+
+<!-- Report Type Distribution Chart (Chung) -->
 <div class="px-4 py-6 sm:px-6 lg:px-8 max-w-7xl mx-auto">
     <div class="bg-white shadow rounded-lg p-6 hover:shadow-lg transition-shadow duration-300">
         <h3 class="text-lg font-medium leading-6 text-gray-900 mb-4">Report Type Distribution</h3>
@@ -334,86 +332,185 @@
     </div>
 </div>
 
+{# Import thư viện Chart.js nếu chưa có trong base #}
+<script src="https://cdn.jsdelivr.net/npm/chart.js@3.7.1/dist/chart.min.js"></script>
 <script>
 document.addEventListener('DOMContentLoaded', function() {
-    // Toggle dropdown menu
-    const dropdown = document.getElementById('reportDropdownButton');
+    // Truyền vai trò người dùng vào biến JavaScript
+    const currentUserRole = {{ current_user.role|tojson }};
+
+    // --- Auto-submit filter form for Dietitian ---
+    if (currentUserRole === 'Dietitian') {
+        const filterForm = document.getElementById('reportFilterForm');
+        // Thêm kiểm tra null phòng trường hợp form không tồn tại
+        if (filterForm) {
+            const filterSelects = filterForm.querySelectorAll('.filter-change'); // Class cho các select cần trigger
+
+            filterSelects.forEach(select => {
+                select.addEventListener('change', () => {
+                    filterForm.submit();
+                });
+            });
+        }
+    }
+
+    // --- Dropdown cho Generate Statistics (Chỉ Admin) ---
+    const dropdownButton = document.getElementById('reportDropdownButton');
     const dropdownMenu = document.getElementById('reportDropdown');
-    
-    if (dropdown && dropdownMenu) {
-        dropdown.addEventListener('click', function() {
+    if (dropdownButton && dropdownMenu) {
+        dropdownButton.addEventListener('click', function(event) {
+            event.stopPropagation(); // Ngăn sự kiện click lan ra ngoài
             dropdownMenu.classList.toggle('hidden');
         });
-        
-        // Close dropdown when clicking outside
+        // Đóng dropdown khi click ra ngoài
         document.addEventListener('click', function(event) {
-            if (!dropdown.contains(event.target) && !dropdownMenu.contains(event.target)) {
+            if (!dropdownButton.contains(event.target) && !dropdownMenu.contains(event.target)) {
                 dropdownMenu.classList.add('hidden');
             }
         });
     }
-    
-    // Report Type Chart
-    const ctx = document.getElementById('reportTypeChart');
-    
-    if (ctx) {
-        new Chart(ctx, {
-            type: 'pie',
+
+    // --- Hàm tạo màu ngẫu nhiên cho biểu đồ cột ---
+    function getRandomColor() {
+        const r = Math.floor(Math.random() * 200); // Giảm giá trị max để màu đậm hơn
+        const g = Math.floor(Math.random() * 200);
+        const b = Math.floor(Math.random() * 200);
+        return `rgba(${r}, ${g}, ${b}, 0.7)`;
+    }
+
+    // --- Biểu đồ Report Type Distribution (Chung) ---
+    const reportTypeCtx = document.getElementById('reportTypeChart')?.getContext('2d');
+    // Sử dụng try-catch để xử lý lỗi parse JSON tiềm ẩn
+    let reportTypeData = null;
+    try {
+        reportTypeData = JSON.parse('{{ report_type_chart_data|tojson|safe }}');
+    } catch (e) {
+        console.error("Error parsing report type chart data:", e);
+    }
+
+    if (reportTypeCtx && reportTypeData && reportTypeData.labels && reportTypeData.data && reportTypeData.labels.length === reportTypeData.data.length) {
+        new Chart(reportTypeCtx, {
+            type: 'pie', // Hoặc 'doughnut'
             data: {
-                labels: ['Initial Assessment', 'Follow-up', 'Discharge', 'Nutrition Consultation', 'Progress Report'],
+                labels: reportTypeData.labels,
                 datasets: [{
                     label: 'Number of Reports',
-                    data: [
-                        {{ stats.initial_assessment }}, 
-                        {{ stats.follow_up }}, 
-                        {{ stats.discharge }},
-                        {{ stats.consultation }},
-                        {{ stats.progress }}
-                    ],
-                    backgroundColor: [
-                        'rgba(59, 130, 246, 0.7)',
-                        'rgba(16, 185, 129, 0.7)',
-                        'rgba(139, 92, 246, 0.7)',
-                        'rgba(251, 191, 36, 0.7)',
-                        'rgba(79, 70, 229, 0.7)'
-                    ],
-                    borderColor: [
-                        'rgba(59, 130, 246, 1)',
-                        'rgba(16, 185, 129, 1)',
-                        'rgba(139, 92, 246, 1)',
-                        'rgba(251, 191, 36, 1)',
-                        'rgba(79, 70, 229, 1)'
+                    data: reportTypeData.data,
+                    backgroundColor: [ // Cung cấp đủ màu cho số lượng labels có thể có
+                        'rgba(59, 130, 246, 0.7)', // blue
+                        'rgba(16, 185, 129, 0.7)', // emerald
+                        'rgba(245, 158, 11, 0.7)', // amber
+                        'rgba(239, 68, 68, 0.7)',  // red
+                        'rgba(139, 92, 246, 0.7)', // violet
+                        'rgba(236, 72, 153, 0.7)', // pink
+                        'rgba(14, 165, 233, 0.7)', // sky
+                        'rgba(34, 197, 94, 0.7)',  // green
+                        'rgba(249, 115, 22, 0.7)', // orange
+                        'rgba(107, 114, 128, 0.7)' // gray
                     ],
+                    borderColor: 'rgba(255, 255, 255, 0.8)', // White border
                     borderWidth: 1
                 }]
             },
             options: {
                 responsive: true,
+                maintainAspectRatio: false,
                 plugins: {
-                    legend: {
-                        position: 'bottom',
-                    },
+                    legend: { position: 'bottom' },
                     tooltip: {
                         callbacks: {
                             label: function(context) {
                                 const label = context.label || '';
                                 const value = context.parsed || 0;
-                                const total = context.dataset.data.reduce((a, b) => a + b, 0);
-                                const percentage = Math.round((value / total) * 100);
-                                return `${label}: ${value} (${percentage}%)`;
+                                return `${label}: ${value}`;
                             }
                         }
                     }
-                },
-                animation: {
-                    animateScale: true,
-                    animateRotate: true,
-                    duration: 1000,
-                    easing: 'easeOutQuart'
                 }
             }
         });
+    } else if(reportTypeCtx) {
+         console.warn("Report type chart data is invalid or missing.");
+         // Có thể hiển thị thông báo lỗi trên canvas
+         reportTypeCtx.font = "16px Arial";
+         reportTypeCtx.fillStyle = "gray";
+         reportTypeCtx.textAlign = "center";
+         reportTypeCtx.fillText("No data available for report types.", reportTypeCtx.canvas.width / 2, reportTypeCtx.canvas.height / 2);
     }
+
+    // --- Biểu đồ Dietitian Contribution (Chỉ Admin) ---
+    if (currentUserRole === 'Admin') {
+        const contributionCtx = document.getElementById('dietitianContributionChart')?.getContext('2d');
+        let contributionData = null;
+
+        // Chỉ cố gắng parse JSON nếu là Admin và có dữ liệu được truyền từ backend
+        {% if current_user.is_admin and dietitian_contribution_chart_data %}
+            try {
+                 contributionData = JSON.parse('{{ dietitian_contribution_chart_data|tojson|safe }}');
+            } catch (e) {
+                console.error("Error parsing dietitian contribution chart data:", e);
+                contributionData = null; // Đảm bảo là null nếu parse lỗi
+            }
+        {% endif %}
+
+        if (contributionCtx && contributionData && contributionData.labels && contributionData.data && contributionData.labels.length === contributionData.data.length && contributionData.labels.length > 0) {
+            new Chart(contributionCtx, {
+                type: 'bar', // Biểu đồ cột
+                data: {
+                    labels: contributionData.labels,
+                    datasets: [{
+                        label: 'Reports Created',
+                        data: contributionData.data,
+                        backgroundColor: contributionData.labels.map(() => getRandomColor()), // Màu ngẫu nhiên cho mỗi cột
+                        borderColor: 'rgba(255, 255, 255, 0.5)',
+                        borderWidth: 1
+                    }]
+                },
+                options: {
+                    responsive: true,
+                    maintainAspectRatio: false,
+                    indexAxis: 'y', // Hiển thị tên dietitian dọc (dễ đọc hơn nếu nhiều)
+                    scales: {
+                        x: {
+                            beginAtZero: true,
+                            title: { display: true, text: 'Number of Reports' }
+                        },
+                        y: {
+                            title: { display: true, text: 'Dietitian' }
+                        }
+                    },
+                    plugins: {
+                        legend: { display: false }, // Ẩn legend vì chỉ có 1 dataset
+                        tooltip: {
+                            callbacks: {
+                                label: function(context) {
+                                    const value = context.parsed.x || 0;
+                                    return ` Reports: ${value}`;
+                                }
+                            }
+                        }
+                    }
+                }
+            });
+        } else if (contributionCtx) {
+             // Chỉ hiển thị cảnh báo và text nếu là Admin và không có data hợp lệ
+             console.warn("Dietitian contribution chart data is invalid, missing, or empty.");
+             contributionCtx.font = "16px Arial";
+             contributionCtx.fillStyle = "gray";
+             contributionCtx.textAlign = "center";
+             contributionCtx.fillText("No contribution data available.", contributionCtx.canvas.width / 2, contributionCtx.canvas.height / 2);
+        }
+    }
+
+    // Confirmation modal logic (dùng confirm() đơn giản)
+    document.querySelectorAll('.needs-confirmation').forEach(form => {
+        form.addEventListener('submit', function(event) {
+            const message = this.getAttribute('data-confirmation-message') || 'Are you sure?';
+            if (!confirm(message)) {
+                event.preventDefault(); // Ngăn chặn submit nếu người dùng chọn Cancel
+            }
+        });
+    });
 });
 </script>
 {% endblock %}
diff --git a/app/templates/report_detail.html b/app/templates/report_detail.html
index b96aca14ec9654d35eb0ca5ff218120ac1a1b323..d7cd078717c9595b89f74f5440cb6155cfe3b390 100644
--- a/app/templates/report_detail.html
+++ b/app/templates/report_detail.html
@@ -121,6 +121,33 @@
             </div>
         </div>
         
+        <!-- Related Procedure (Nếu có) -->
+        {% if report.procedure %}
+        <div class="border-b border-gray-200 px-6 py-4 bg-indigo-50">
+            <h3 class="text-base font-semibold text-indigo-700 mb-2 flex items-center">
+                <i class="fas fa-link mr-2"></i>
+                Related Procedure
+            </h3>
+            <div class="grid grid-cols-1 md:grid-cols-2 gap-4 text-sm">
+                <div>
+                    <p><span class="font-medium">Procedure ID:</span> 
+                        <a href="{{ url_for('dietitian.list_procedures', patient_id=report.patient.id) }}#proc-{{ report.procedure.id }}" 
+                           class="text-blue-600 hover:underline" title="View in Procedures List">
+                            #{{ report.procedure.id }}
+                        </a>
+                    </p>
+                    <p><span class="font-medium">Type:</span> {{ report.procedure.procedureType }}</p>
+                </div>
+                <div>
+                    <p><span class="font-medium">Date:</span> {{ report.procedure.procedureDateTime.strftime('%d/%m/%Y %H:%M') if report.procedure.procedureDateTime else 'N/A' }}</p>
+                    {% if report.procedure.procedureName %}
+                    <p><span class="font-medium">Name/Detail:</span> {{ report.procedure.procedureName }}</p>
+                    {% endif %}
+                </div>
+            </div>
+        </div>
+        {% endif %}
+        
         <!-- Assessment -->
         <div class="border-b border-gray-200 px-6 py-4">
             <h3 class="text-lg font-semibold text-gray-700 mb-2">Assessment</h3>
diff --git a/app/templates/report_form.html b/app/templates/report_form.html
index 6ccd9b65c361d28709dc3e1a125aa610bf593ff2..6d9cdb30e50e1bbd0cabb711eaf4e59902e047e1 100644
--- a/app/templates/report_form.html
+++ b/app/templates/report_form.html
@@ -43,11 +43,15 @@
         </div>
 
         {% set current_patient_id = form.patient_id.data or request.args.get('patient_id') %}
+        {% set current_encounter_id = form.encounter_id.data if form.encounter_id else request.args.get('encounter_id') %}
         <form method="POST" class="space-y-8" enctype="multipart/form-data" id="report-form" novalidate>
             {{ form.hidden_tag() }}
+            {# Pass patient_id if creating new report from patient context #}
             {% if current_patient_id and not report %}
                 <input type="hidden" name="patient_id" value="{{ current_patient_id }}">
             {% endif %}
+            {# Add hidden field for encounter_id #}
+            {{ form.encounter_id(value=(current_encounter_id if current_encounter_id else (report.encounter_id if report else None))) }}
             
             <!-- Report Information Section -->
             <div class="border border-gray-300 rounded-md p-4">
@@ -87,9 +91,20 @@
                         <label for="patient_id" class="block text-sm font-medium text-gray-700 mb-1">Patient*</label>
                         <div class="relative">
                             {{ form.patient_id(class="w-full rounded-md border-gray-400 shadow-sm focus:border-blue-500 focus:ring focus:ring-blue-500 focus:ring-opacity-50" ~ (' bg-gray-100 cursor-not-allowed' if report else ''), disabled=report) }}
-                            <div id="patient-info" class="mt-2 p-2 bg-blue-50 rounded-md text-sm {{ 'hidden' if not report }}">
-                                {% if report %}
-                                <strong>{{ report.patient.full_name }}</strong> | {{ report.patient.gender }}, {{ report.patient.age }} years old | MRN: {{ report.patient.hospital_number }}
+                            <div id="patient-info" class="mt-2 p-2 bg-blue-50 rounded-md text-sm {{ 'hidden' if not (report or current_patient_id) }}">
+                                {# Initial display if report exists #}
+                                {% if report and report.patient %}
+                                    <strong>{{ report.patient.full_name }}</strong> | {{ report.patient.gender }}, {{ report.patient.age }} years old | MRN: {{ report.patient.hospital_number }}
+                                {% elif current_patient_id and not report %}
+                                    Loading patient info...
+                                {% endif %}
+                            </div>
+                            {# Display Encounter Info #}
+                            <div id="encounter-info" class="mt-2 p-2 bg-indigo-50 rounded-md text-sm {{ 'hidden' if not (report and report.encounter_id or current_encounter_id) }}">
+                                {% if report and report.encounter %}
+                                    <strong>Related Encounter:</strong> #{{ report.encounter.id }} | Started: {{ report.encounter.start_time.strftime('%Y-%m-%d %H:%M') if report.encounter.start_time else 'N/A' }}
+                                {% elif current_encounter_id %}
+                                    Loading encounter info...
                                 {% endif %}
                             </div>
                         </div>
@@ -327,6 +342,8 @@
         const patientInfo = document.getElementById('patient-info');
         const referralSelect = document.getElementById('referral_id');
         const referralInfo = document.getElementById('referral-info');
+        const encounterInfo = document.getElementById('encounter-info');
+        const encounterIdField = document.querySelector('input[name="encounter_id"]');
 
         function updateReferrals(patient_id) {
             if (!referralSelect) return;
@@ -390,6 +407,10 @@
                                 referralSelect.innerHTML = '<option value="">Select referral</option>';
                                 referralInfo.classList.add('hidden');
                             }
+                            if (encounterInfo) {
+                                encounterInfo.classList.add('hidden');
+                                encounterInfo.innerHTML = '';
+                            }
                         });
                 } else {
                     patientInfo.innerHTML = '';
@@ -397,66 +418,90 @@
                         referralSelect.innerHTML = '<option value="">Select referral</option>';
                         referralInfo.classList.add('hidden');
                      }
+                     if (encounterInfo) {
+                         encounterInfo.classList.add('hidden');
+                         encounterInfo.innerHTML = '';
+                     }
                 }
             });
 
-            if (patientSelect.value) {
-                const initialPatientId = patientSelect.value;
-                 if (initialPatientId) {
-                     setTimeout(() => {
-                        if (patientSelect.disabled) {
-                             fetch(`/api/patients/${initialPatientId}/summary`) 
-                                .then(response => response.json()).then(data => {
-                                     if (!data.error) {
-                                         patientInfo.innerHTML = `<strong>${data.full_name || 'N/A'}</strong> | ${data.gender || 'N/A'}, ${data.age || 'N/A'} years | MRN: ${data.hospital_number || 'N/A'}`;
-                                         patientInfo.classList.remove('hidden');
-                                     }
-                                 }).catch(err => console.error("Error preloading patient info:", err));
-                        }
-                         updateReferrals(initialPatientId);
-                    }, 100);
-                }
-            }
-        }
-        
-        if (referralSelect) {
-            referralSelect.addEventListener('change', function() {
-                const referralId = this.value;
-                 referralInfo.classList.add('hidden');
-                 referralInfo.innerHTML = ''; 
-                if (referralId) {
-                     referralInfo.innerHTML = 'Loading referral info...';
-                     referralInfo.classList.remove('hidden');
-                    fetch(`/api/referrals/${referralId}/summary`)
+            // Fetch and display encounter info if encounter_id is present on load
+            function loadEncounterInfo(encounterId) {
+                if (encounterInfo && encounterId) {
+                    encounterInfo.classList.remove('hidden'); // Show the div
+                    encounterInfo.innerHTML = 'Loading encounter info...';
+                    fetch(`/api/encounters/${encounterId}/summary`)
                         .then(response => {
-                             if (!response.ok) throw new Error('Referral not found or API error');
-                             return response.json();
-                         })
+                            if (!response.ok) throw new Error('Encounter not found or API error');
+                            return response.json();
+                        })
                         .then(data => {
-                            if(data.error){
-                                 referralInfo.innerHTML = `<span class="text-red-500">${data.error}</span>`;
+                            if (data.error) {
+                                encounterInfo.innerHTML = `<span class="text-red-500">${data.error}</span>`;
                             } else {
-                                 referralInfo.innerHTML = `<strong>${data.referral_type || 'N/A'}</strong> | Date: ${data.referral_date || 'N/A'} | Status: ${data.status || 'N/A'}`;
+                                encounterInfo.innerHTML = `<strong>Related Encounter:</strong> #${data.id} | Started: ${data.start_time || 'N/A'}`;
                             }
                         })
                         .catch(error => {
-                            console.error('Error fetching referral data:', error);
-                             referralInfo.innerHTML = '<span class="text-red-500">Error loading referral info</span>';
+                            console.error('Error fetching encounter data:', error);
+                            encounterInfo.innerHTML = '<span class="text-red-500">Error loading encounter info</span>';
                         });
-                } 
-            });
+                } else if (encounterInfo) {
+                    encounterInfo.classList.add('hidden'); // Hide if no ID
+                    encounterInfo.innerHTML = '';
+                }
+            }
 
-             var initialReferralId = null;
-             {% if report is defined and report and report.referral_id is defined and report.referral_id %}
-             initialReferralId = "{{ report.referral_id | string }}";
-             {% endif %}
-              if (initialReferralId && patientSelect && patientSelect.value) {
-                   setTimeout(() => {
-                       if (referralSelect.value === initialReferralId) {
-                           referralSelect.dispatchEvent(new Event('change'));
-                       }
-                   }, 700);
-               }
+            // --- Initial Load Logic ---
+            const initialPatientId = patientSelect ? patientSelect.value : null;
+            const initialEncounterId = encounterIdField ? encounterIdField.value : null;
+            const initialReferralId = referralSelect ? referralSelect.value : null;
+            const isEditingReport = {{ 'true' if report else 'false' }};
+
+            // If editing or creating with pre-selected patient, load patient info
+            if (initialPatientId && (isEditingReport || !patientSelect.disabled)) {
+                 // If select is enabled (new report with dropdown), trigger change to load referrals etc.
+                 if (!patientSelect.disabled) {
+                     patientSelect.dispatchEvent(new Event('change')); 
+                 } else {
+                     // If select is disabled (editing or creating from context), just load patient and referral info
+                     if (!patientInfo.textContent.trim() || patientInfo.textContent.includes("Loading")) {
+                         fetch(`/api/patients/${initialPatientId}/summary`) 
+                             .then(response => response.json()).then(data => {
+                                 if (!data.error) {
+                                     patientInfo.innerHTML = `<strong>${data.full_name || 'N/A'}</strong> | ${data.gender || 'N/A'}, ${data.age || 'N/A'} years | MRN: ${data.hospital_number || 'N/A'}`;
+                                     patientInfo.classList.remove('hidden');
+                                 }
+                             }).catch(err => console.error("Error preloading patient info:", err));
+                     }
+                     // Load referrals if needed for existing report
+                     if (isEditingReport) {
+                         updateReferrals(initialPatientId);
+                     }
+                 }
+            }
+            
+            // Load encounter info if ID is available
+            if (initialEncounterId && (!encounterInfo.textContent.trim() || encounterInfo.textContent.includes("Loading"))) {
+                 loadEncounterInfo(initialEncounterId);
+            }
+
+            // Pre-select and load referral info if applicable (needs patient referrals loaded first)
+            if (initialReferralId && referralSelect && isEditingReport) {
+                  // Use a slight delay to ensure referrals are loaded by updateReferrals
+                  setTimeout(() => {
+                     // Check if the initialReferralId is actually an option before triggering change
+                     const optionExists = Array.from(referralSelect.options).some(opt => opt.value == initialReferralId);
+                     if (optionExists) {
+                         referralSelect.value = initialReferralId; 
+                         referralSelect.dispatchEvent(new Event('change')); 
+                     } else {
+                         console.warn(`Initial referral ID ${initialReferralId} not found in options after loading.`);
+                         referralInfo.classList.add('hidden');
+                     }
+                  }, 700); // Adjust delay if needed
+            }
+            // --- End Initial Load Logic ---
         }
         
         document.querySelectorAll('.delete-attachment').forEach(button => {
@@ -493,37 +538,36 @@
                 if (typeof tinymce !== 'undefined') {
                     let allEditorsExist = true;
                     ['assessment_details', 'intervention_plan', 'monitoring_plan'].forEach(id => {
-                        if (!tinymce.get(id)) {
-                             console.warn(`TinyMCE editor with id '${id}' not found.`);
-                             allEditorsExist = false;
+                        const editor = tinymce.get(id);
+                        if (!editor) {
+                            console.warn(`TinyMCE editor with id '${id}' not found.`);
+                        } else {
+                            if (editor.getContent() === null) {
+                                console.warn(`TinyMCE editor with id '${id}' has null content. Setting to empty string.`);
+                                editor.setContent('');
+                            }
                         }
                     });
 
-                    if (allEditorsExist) {
-                         console.log("Attempting tinymce.triggerSave()..."); 
-                         try {
-                             tinymce.triggerSave();
-                             console.log("tinymce.triggerSave() completed.");
-                         } catch (tinymceError) {
-                              console.error("Error during tinymce.triggerSave():", tinymceError);
-                         }
-                    } else {
-                         console.warn('One or more TinyMCE editors not found. Skipping triggerSave().');
+                    console.log("Attempting tinymce.triggerSave()...");
+                    try {
+                        tinymce.triggerSave();
+                        console.log("tinymce.triggerSave() completed.");
+                    } catch (tinymceError) {
+                         console.error("Error during tinymce.triggerSave():", tinymceError);
                     }
                 } else {
                      console.warn('TinyMCE is not defined. Skipping triggerSave().');
                 }
 
-                const submitButton = form.querySelector('button[type="submit"][name="action"][value="save"]');
-                const updateButton = form.querySelector('button[type="submit"][name="action"][value="save_draft"]');
-                const finalizeButton = form.querySelector('button[type="submit"][name="action"][value="finalize"]');
-                
-                let clickedButton = submitButton || updateButton || finalizeButton;
+                const submitButton = e.submitter;
 
-                if (clickedButton) {
+                if (submitButton && submitButton.tagName === 'BUTTON' && submitButton.type === 'submit') {
                      console.log("Disabling submit button...");
-                    clickedButton.disabled = true;
-                    clickedButton.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i> Processing...';
+                    submitButton.disabled = true;
+                    submitButton.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i> Processing...';
+                } else {
+                    console.warn("Could not identify the clicked submit button.");
                 }
 
                console.log("Form submit proceeding...");
diff --git a/app/utils/__init__.py b/app/utils/__init__.py
deleted file mode 100644
index 7e281fc8f9f3166c9ca2b2566f1527386c5ac3de..0000000000000000000000000000000000000000
--- a/app/utils/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# Util functions for CCU HTM application 
\ No newline at end of file
diff --git a/app/utils/csv_handler.py b/app/utils/csv_handler.py
index 936aea433089d91fcbd75a958297f92c8ee57762..aebabbc4b4d31887e4b6edb403c3c988f062bcff 100644
--- a/app/utils/csv_handler.py
+++ b/app/utils/csv_handler.py
@@ -372,158 +372,264 @@ def _process_combined_patient_measurement_csv(uploaded_file_id):
 
     return {'success': error_records == 0, 'processed_records': processed_records, 'error_records': error_records, 'total_records': total_records, 'errors': errors}
 
-# --- Function for processing Encounter Measurements CSV ---
-def process_encounter_measurements_csv(file_storage, patient_id, encounter_id):
+# --- Function to process Encounter Measurements CSV ---
+def process_encounter_measurements_csv(file_stream, patient_id_param, encounter_id_param):
     """
-    Xử lý file CSV chứa dữ liệu đo lường sinh lý cho một encounter cụ thể.
+    Processes a CSV file containing physiological measurements for a specific encounter.
+    Assumes the CSV file is already opened as a stream (e.g., request.files['csv_file']).
+    Validates that PatientID in the CSV matches the provided parameter.
+    Ignores EncounterID from the CSV, uses the parameter instead.
 
     Args:
-        file_storage: Đối tượng FileStorage từ request.
-        patient_id: ID của bệnh nhân.
-        encounter_id: ID của encounter.
+        file_stream: The file stream object (e.g., from request.files).
+        patient_id_param: The expected Patient ID for all rows.
+        encounter_id_param: The expected Encounter ID (primary key) for all rows.
 
     Returns:
-        Tuple (bool, str): (True, success_message) nếu thành công,
-                           (False, error_message) nếu thất bại.
+        tuple: (bool, result_data)
+            - If success: (True, (message, flash_category))
+            - If failure: (False, error_message)
     """
+    errors = []
+    measurements_to_add = []
+    skipped_mismatch_count = 0 # Đổi tên: giờ đây là bỏ qua do PatientID hoặc EncounterID (CSV) không khớp với trang hiện tại
+    row_count = 0
+
+    # Mapping from POTENTIAL CSV headers to PhysiologicalMeasurement model fields
+    # Keys should be LOWERCASE for case-insensitive matching
+    header_map_lower = {
+        # Chính xác (thường có)
+        'measurementdatetime': 'measurementDateTime', # Chấp nhận cả viết thường
+        'temperature': 'temperature',
+        'heart rate': 'heart_rate', 'heart_rate': 'heart_rate', # Chấp nhận có dấu cách hoặc không
+        'blood pressure systolic': 'blood_pressure_systolic', 'blood_pressure_systolic': 'blood_pressure_systolic',
+        'blood pressure diastolic': 'blood_pressure_diastolic', 'blood_pressure_diastolic': 'blood_pressure_diastolic',
+        'oxygen saturation': 'oxygen_saturation', 'oxygen_saturation': 'oxygen_saturation',
+        'resp rate': 'resp_rate', 'respiratory rate': 'resp_rate', 'resp_rate': 'resp_rate', # Nhiều biến thể
+        'fio2': 'fio2',
+        'tidal vol': 'tidal_vol', 'tidal volume': 'tidal_vol', 'tidal_vol': 'tidal_vol',
+        'end tidal co2': 'end_tidal_co2', 'end_tidal_co2': 'end_tidal_co2',
+        'feed vol': 'feed_vol', 'feed volume': 'feed_vol', 'feed_vol': 'feed_vol',
+        'feed vol adm': 'feed_vol_adm', 'feed volume administered': 'feed_vol_adm', 'feed_vol_adm': 'feed_vol_adm',
+        'fio2 ratio': 'fio2_ratio', 'fio2_ratio': 'fio2_ratio',
+        'insp time': 'insp_time', 'inspiratory time': 'insp_time', 'insp_time': 'insp_time',
+        'oxygen flow rate': 'oxygen_flow_rate', 'oxygen_flow_rate': 'oxygen_flow_rate',
+        'peep': 'peep',
+        'pip': 'pip',
+        'sip': 'sip',
+        'tidal vol actual': 'tidal_vol_actual', 'tidal_vol_actual': 'tidal_vol_actual',
+        'tidal vol kg': 'tidal_vol_kg', 'tidal_vol_kg': 'tidal_vol_kg',
+        'tidal vol spon': 'tidal_vol_spon', 'tidal_vol_spon': 'tidal_vol_spon',
+        'bmi': 'bmi',
+        'notes': 'notes',
+        # Cần thêm để validate (dùng key lowercase)
+        'patientid': 'patientID_csv', # Tên tạm để validate
+        'encounterid': 'encounterID_csv' # Lấy EncounterID từ CSV để so sánh
+    }
+
+    # Đọc file stream
     try:
-        # Đảm bảo patient và encounter tồn tại
-        patient = Patient.query.get(patient_id)
-        encounter = Encounter.query.get(encounter_id)
-        if not patient or not encounter or encounter.patient_id != patient.id:
-            return False, "Bệnh nhân hoặc encounter không hợp lệ."
-
-        # Đọc nội dung file CSV
-        stream = io.StringIO(file_storage.stream.read().decode("UTF8"), newline=None)
-        csv_reader = csv.DictReader(stream)
-
-        required_headers = [
-            'measurementDateTime', 'temperature', 'heart_rate',
-            'blood_pressure_systolic', 'blood_pressure_diastolic',
-            'oxygen_saturation', 'resp_rate' # Thêm các header bắt buộc khác nếu cần
-        ]
-        optional_headers = [
-            'fio2', 'tidal_vol', 'end_tidal_co2', 'feed_vol', 'feed_vol_adm',
-            'fio2_ratio', 'insp_time', 'oxygen_flow_rate', 'peep', 'pip', 'sip',
-            'tidal_vol_actual', 'tidal_vol_kg', 'tidal_vol_spon', 'bmi'
-        ]
-        
-        # Kiểm tra header
-        if not all(header in csv_reader.fieldnames for header in required_headers):
-            missing = [h for h in required_headers if h not in csv_reader.fieldnames]
-            return False, f"File CSV thiếu các cột bắt buộc: {', '.join(missing)}"
-
-        measurements_to_add = []
-        errors = []
-        row_count = 0
-        skipped_mismatch_count = 0 # Đếm số dòng bị bỏ qua do ID không khớp
-
-        for row in csv_reader:
+        # Đảm bảo đọc file stream dưới dạng text
+        csvfile = io.TextIOWrapper(file_stream, encoding='utf-8') # Mặc định utf-8
+        reader = csv.DictReader(csvfile)
+
+        if not reader.fieldnames:
+             raise ValueError("CSV file is empty or header row is missing.")
+
+        # --- Header Mapping Logic ---
+        actual_headers_lower = [h.lower().strip() for h in reader.fieldnames] # Chuyển header thực tế sang lowercase
+        reverse_header_map = {}
+        missing_required = []
+
+        # Kiểm tra cột bắt buộc: measurementDateTime và patientID
+        datetime_found = False
+        patientid_found = False
+        encounterid_found = False # Thêm biến kiểm tra encounterid
+        datetime_col_name_in_csv = None
+        patientid_col_name_in_csv = None
+        encounterid_col_name_in_csv = None # Thêm biến lưu tên cột encounterid gốc
+
+        for i, actual_header_lower in enumerate(actual_headers_lower):
+            if actual_header_lower in header_map_lower:
+                 model_attr = header_map_lower[actual_header_lower]
+                 reverse_header_map[reader.fieldnames[i]] = model_attr # Dùng tên cột gốc làm key
+                 if model_attr == 'measurementDateTime':
+                     datetime_found = True
+                     datetime_col_name_in_csv = reader.fieldnames[i] # Lưu tên cột gốc
+                 if model_attr == 'patientID_csv':
+                     patientid_found = True
+                     patientid_col_name_in_csv = reader.fieldnames[i] # Lưu tên cột gốc
+                 if model_attr == 'encounterID_csv': # Kiểm tra encounterid
+                     encounterid_found = True
+                     encounterid_col_name_in_csv = reader.fieldnames[i]
+
+        if not datetime_found:
+            missing_required.append('MeasurementDateTime')
+        if not patientid_found:
+            missing_required.append('PatientID')
+        if not encounterid_found: # Kiểm tra encounterid là bắt buộc để so sánh
+            missing_required.append('EncounterID')
+
+        if missing_required:
+            raise ValueError(f"Missing required column(s): {', '.join(missing_required)} in CSV header.")
+        # --- End Header Mapping Logic ---
+
+        # Lấy custom_encounter_id của encounter đang xem từ database
+        current_encounter = Encounter.query.get(encounter_id_param) # Lấy encounter bằng ID từ URL
+        if not current_encounter or current_encounter.patient_id != patient_id_param:
+             # Điều này không nên xảy ra nếu route hoạt động đúng, nhưng kiểm tra cho chắc
+             raise ValueError(f"Không tìm thấy encounter hợp lệ với ID {encounter_id_param} cho bệnh nhân {patient_id_param}.")
+        target_custom_encounter_id = current_encounter.custom_encounter_id
+        if not target_custom_encounter_id:
+             raise ValueError(f"Encounter ID {encounter_id_param} không có custom_encounter_id được đặt.")
+
+        for row in reader:
             row_count += 1
+            measurement_data = {}
             try:
-                # Lấy patientID và encounterID từ dòng CSV
-                csv_patient_id = row.get('patientID')
-                csv_encounter_id = row.get('encounterID')
-
-                # Kiểm tra xem ID trong CSV có khớp với ID từ route không
-                if csv_patient_id != patient_id or csv_encounter_id != encounter.custom_encounter_id:
-                    # Ghi log hoặc bỏ qua nhẹ nhàng nếu ID không khớp
-                    current_app.logger.warning(f"Dòng {row_count + 1}: Bỏ qua do PatientID/EncounterID không khớp (CSV: {csv_patient_id}/{csv_encounter_id}, Target: {patient_id}/{encounter.custom_encounter_id})")
+                # Convert keys from CSV header names to model attribute names using the map derived above
+                raw_data = {reverse_header_map[csv_header]: value
+                            for csv_header, value in row.items()
+                            if csv_header in reverse_header_map} # Chỉ xử lý các cột đã map được
+
+                # --- Validation ---
+                # Lấy PatientID và EncounterID từ cột CSV đã map được
+                csv_patient_id = row.get(patientid_col_name_in_csv)
+                csv_encounter_id_str = row.get(encounterid_col_name_in_csv)
+
+                if not csv_patient_id:
+                    errors.append(f"Dòng {row_count + 1}: Thiếu giá trị PatientID.")
+                    continue # Skip this row
+                if not csv_encounter_id_str:
+                    errors.append(f"Dòng {row_count + 1}: Thiếu giá trị EncounterID.")
+                    continue # Skip this row
+
+                # Check if PatientID matches the parameter
+                if csv_patient_id != str(patient_id_param):
                     skipped_mismatch_count += 1
-                    continue # Bỏ qua dòng này và xử lý dòng tiếp theo
-
-                # Sử dụng tên thuộc tính Python cho keys
-                measurement_data = {
-                    'patient_id': patient_id,
-                    'encounter_id': encounter_id
-                }
+                    # Log nếu cần
+                    # current_app.logger.warning(f"CSV Dòng {row_count + 1}: Bỏ qua do PatientID ({csv_patient_id}) không khớp với đích ({patient_id_param}).")
+                    continue # Skip this row
 
-                # Xử lý các trường bắt buộc
-                try:
-                    measurement_data['measurementDateTime'] = datetime.fromisoformat(row['measurementDateTime'])
-                except ValueError:
-                    raise ValueError(f"Định dạng measurementDateTime không hợp lệ: {row['measurementDateTime']}")
-                
-                # Gán các giá trị từ CSV vào dictionary measurement_data dùng tên thuộc tính model
-                measurement_data['temperature'] = float(row['temperature']) if row.get('temperature') else None
-                measurement_data['heart_rate'] = int(row['heart_rate']) if row.get('heart_rate') else None
-                measurement_data['blood_pressure_systolic'] = int(row['blood_pressure_systolic']) if row.get('blood_pressure_systolic') else None
-                measurement_data['blood_pressure_diastolic'] = int(row['blood_pressure_diastolic']) if row.get('blood_pressure_diastolic') else None
-                measurement_data['oxygen_saturation'] = float(row['oxygen_saturation']) if row.get('oxygen_saturation') else None
-                # Đảm bảo tên key khớp với tên thuộc tính trong model measurement.py (vd: resp_rate)
-                measurement_data['resp_rate'] = int(row['resp_rate']) if row.get('resp_rate') else None 
-
-                # Xử lý các trường tùy chọn (dùng tên thuộc tính model)
-                for header in optional_headers:
-                    model_attribute_name = header # Giả sử tên header CSV khớp tên thuộc tính model
-                    # Nếu tên header CSV khác tên thuộc tính, cần có map chuyển đổi ở đây
-                    if header in row and row[header]:
-                         try:
-                            try: measurement_data[model_attribute_name] = float(row[header])
-                            except ValueError: measurement_data[model_attribute_name] = int(row[header])
-                         except (ValueError, TypeError):
-                             current_app.logger.warning(f"Giá trị không hợp lệ cho cột '{header}' ở dòng {row_count+1}: {row[header]}. Gán None.")
-                             measurement_data[model_attribute_name] = None
-                    else:
-                        measurement_data[model_attribute_name] = None
-
-                # Lọc dictionary dựa trên các thuộc tính hợp lệ của model
+                # Check if EncounterID from CSV matches the custom_id of the current encounter
+                if csv_encounter_id_str != target_custom_encounter_id:
+                    skipped_mismatch_count += 1
+                    # Log nếu cần
+                    # current_app.logger.info(f"CSV Dòng {row_count + 1}: Bỏ qua do EncounterID ({csv_encounter_id_str}) không khớp với encounter hiện tại ({target_custom_encounter_id}).")
+                    continue # Skip this row
+
+                # --- Data Parsing and Type Conversion ---
+                # Gán patient_id và encounter_id từ parameter URL (vì dòng này đã được xác định là của encounter này)
+                measurement_data['patient_id'] = patient_id_param
+                measurement_data['encounter_id'] = encounter_id_param # Dùng ID từ URL
+
+                # Lấy datetime từ cột CSV đã map được
+                dt_str = row.get(datetime_col_name_in_csv)
+                measurement_data['measurementDateTime'] = _parse_datetime(dt_str)
+                if measurement_data['measurementDateTime'] is None and dt_str: # Chỉ báo lỗi nếu có giá trị nhưng không parse được
+                     raise ValueError(f"MeasurementDateTime '{dt_str}' không hợp lệ.")
+                elif measurement_data['measurementDateTime'] is None:
+                     raise ValueError("MeasurementDateTime không được để trống.")
+
+                # Parse other fields using helper functions and the mapped keys in raw_data
+                # Lưu ý: raw_data đã chứa key là tên thuộc tính model
+                measurement_data['temperature'] = _parse_float(raw_data.get('temperature'))
+                measurement_data['heart_rate'] = _parse_int(raw_data.get('heart_rate'))
+                measurement_data['blood_pressure_systolic'] = _parse_int(raw_data.get('blood_pressure_systolic'))
+                measurement_data['blood_pressure_diastolic'] = _parse_int(raw_data.get('blood_pressure_diastolic'))
+                measurement_data['oxygen_saturation'] = _parse_float(raw_data.get('oxygen_saturation'))
+                measurement_data['resp_rate'] = _parse_int(raw_data.get('resp_rate'))
+                measurement_data['fio2'] = _parse_float(raw_data.get('fio2'))
+                measurement_data['tidal_vol'] = _parse_float(raw_data.get('tidal_vol'))
+                measurement_data['end_tidal_co2'] = _parse_float(raw_data.get('end_tidal_co2'))
+                measurement_data['feed_vol'] = _parse_float(raw_data.get('feed_vol'))
+                measurement_data['feed_vol_adm'] = _parse_float(raw_data.get('feed_vol_adm'))
+                measurement_data['fio2_ratio'] = _parse_float(raw_data.get('fio2_ratio'))
+                measurement_data['insp_time'] = _parse_float(raw_data.get('insp_time'))
+                measurement_data['oxygen_flow_rate'] = _parse_float(raw_data.get('oxygen_flow_rate'))
+                measurement_data['peep'] = _parse_float(raw_data.get('peep'))
+                measurement_data['pip'] = _parse_float(raw_data.get('pip'))
+                measurement_data['sip'] = _parse_float(raw_data.get('sip'))
+                measurement_data['tidal_vol_actual'] = _parse_float(raw_data.get('tidal_vol_actual'))
+                measurement_data['tidal_vol_kg'] = _parse_float(raw_data.get('tidal_vol_kg'))
+                measurement_data['tidal_vol_spon'] = _parse_float(raw_data.get('tidal_vol_spon'))
+                measurement_data['bmi'] = _parse_float(raw_data.get('bmi'))
+                measurement_data['notes'] = raw_data.get('notes')
+
+                # Lọc bỏ các key không phải là thuộc tính của model trước khi tạo object
                 valid_attributes = {key for key in PhysiologicalMeasurement.__mapper__.attrs.keys()}
-                # Thêm cả các key relationship nếu cần (nhưng ở đây không cần gán relationship khi tạo)
-                # valid_attributes.update({rel.key for rel in PhysiologicalMeasurement.__mapper__.relationships})
-                
-                filtered_data = {k: v for k, v in measurement_data.items() if k in valid_attributes}
-                
-                # Kiểm tra xem encounter_id và patient_id có trong filtered_data không
-                if 'encounter_id' not in filtered_data or 'patient_id' not in filtered_data:
-                     current_app.logger.error(f"Lỗi lọc key: encounter_id hoặc patient_id bị thiếu trong filtered_data. Keys: {filtered_data.keys()}")
-                     # Có thể raise lỗi ở đây nếu muốn dừng xử lý
-                     # raise ValueError("Lỗi nội bộ: Không thể lọc đúng encounter_id/patient_id")
+                filtered_data = {k: v for k, v in measurement_data.items() if k in valid_attributes and v is not None} # Chỉ lấy các giá trị không None
+
+                if not filtered_data or len(filtered_data) <= 2: # Nếu chỉ có patient_id và encounter_id thì cũng là dòng trống
+                    errors.append(f"Dòng {row_count + 1}: Không có dữ liệu đo lường hợp lệ.")
+                    continue
 
                 measurement = PhysiologicalMeasurement(**filtered_data)
                 measurements_to_add.append(measurement)
 
             except (ValueError, TypeError) as e:
                 errors.append(f"Dòng {row_count + 1}: Lỗi dữ liệu - {e}")
+            except KeyError as e:
+                # Lỗi này xảy ra nếu logic map header bị sai
+                errors.append(f"Dòng {row_count + 1}: Lỗi cấu trúc file CSV - Không tìm thấy cột cần thiết ({e}) sau khi map header.")
+                current_app.logger.error(f"Lỗi KeyError khi xử lý dòng {row_count + 1} CSV cho encounter {encounter_id_param}: {e}", exc_info=True)
             except Exception as e:
-                 errors.append(f"Dòng {row_count + 1}: Lỗi không xác định - {e}")
+                 # Bắt lỗi không xác định khác khi xử lý dòng
+                 errors.append(f"Dòng {row_count + 1}: Lỗi không xác định khi xử lý dòng - {e}")
+                 current_app.logger.error(f"Lỗi không xác định khi xử lý dòng {row_count + 1} CSV cho encounter {encounter_id_param}: {e}", exc_info=True)
 
+        # --- Kết thúc vòng lặp ---
+
+        # Kiểm tra lỗi sau khi đọc hết file
         if errors:
             # Nếu có lỗi, không commit và báo lỗi
-            db.session.rollback()
+            db.session.rollback() # Đảm bảo rollback nếu có lỗi
             error_message = f"Đã xảy ra lỗi khi xử lý file CSV. {len(errors)} dòng bị lỗi. Lỗi đầu tiên: {errors[0]}"
-            current_app.logger.error(f"Lỗi xử lý CSV cho encounter {encounter_id}: {error_message}")
+            current_app.logger.error(f"Lỗi xử lý CSV cho encounter {encounter_id_param}: {error_message}")
             return False, error_message
 
-        if not measurements_to_add:
-             return False, "Không có dữ liệu hợp lệ nào được tìm thấy trong file CSV cho encounter này."
-
-        # Thêm thông báo nếu có dòng bị bỏ qua do không khớp ID
+        if not measurements_to_add and skipped_mismatch_count == 0:
+             # Không có lỗi, không có dòng nào hợp lệ, và cũng không có dòng nào bị skip do mismatch ID
+             return False, "Không có dữ liệu đo lường hợp lệ nào được tìm thấy trong file CSV cho encounter này."
+        elif not measurements_to_add and skipped_mismatch_count > 0:
+             # Không có dòng hợp lệ nhưng có dòng bị skip -> Vẫn tính là thành công nhưng có cảnh báo
+             # Cập nhật thông báo
+             final_message = f"Không có bản ghi đo lường mới nào được thêm cho encounter này. Đã bỏ qua {skipped_mismatch_count} dòng do PatientID hoặc EncounterID không khớp với encounter hiện tại."
+             return True, (final_message, 'warning')
+
+        # Nếu không có lỗi và có measurement để thêm
+        final_message = f"Đã nhập thành công {len(measurements_to_add)} bản ghi đo lường."
+        flash_category = 'success'
         if skipped_mismatch_count > 0:
-             final_message = f"Đã nhập thành công {len(measurements_to_add)} bản ghi đo lường. Bỏ qua {skipped_mismatch_count} dòng do PatientID/EncounterID không khớp."
-             flash_category = 'warning' # Dùng warning nếu có dòng bị bỏ qua
-        else:
-            final_message = f"Đã nhập thành công {len(measurements_to_add)} bản ghi đo lường."
-            flash_category = 'success'
+             # Cập nhật thông báo
+             final_message += f" Đã bỏ qua {skipped_mismatch_count} dòng do PatientID hoặc EncounterID không khớp với encounter hiện tại."
+             flash_category = 'warning'
 
         # Thêm tất cả các measurement hợp lệ vào session và commit
-        if measurements_to_add:
+        try:
             db.session.bulk_save_objects(measurements_to_add)
             db.session.commit()
-            current_app.logger.info(f"Đã thêm {len(measurements_to_add)} bản ghi cho encounter {encounter_id} từ CSV. Bỏ qua {skipped_mismatch_count} dòng không khớp.")
+            current_app.logger.info(f"Đã thêm {len(measurements_to_add)} bản ghi cho encounter {encounter_id_param} từ CSV. Bỏ qua {skipped_mismatch_count} dòng không khớp.")
             # Trả về message và category để route có thể flash đúng loại thông báo
-            return True, (final_message, flash_category) 
-        else:
-            # Trường hợp không có lỗi nhưng cũng không có bản ghi nào được thêm (và không có dòng nào bị skip mismatch)
-            return False, "Không có dữ liệu hợp lệ nào được tìm thấy trong file CSV cho encounter này."
+            return True, (final_message, flash_category)
+        except Exception as commit_e:
+             db.session.rollback()
+             current_app.logger.error(f"Lỗi khi commit dữ liệu CSV cho encounter {encounter_id_param}: {commit_e}", exc_info=True)
+             return False, f"Lỗi database khi lưu dữ liệu: {commit_e}"
 
+    # --- Khối except của try chính ---
     except UnicodeDecodeError:
         db.session.rollback()
-        return False, "Lỗi mã hóa file. Vui lòng đảm bảo file được lưu dưới dạng UTF-8."
+        current_app.logger.error(f"Lỗi UnicodeDecodeError khi đọc file CSV cho encounter {encounter_id_param}.", exc_info=True)
+        return False, "Lỗi đọc file CSV. File có thể không phải là định dạng UTF-8 hoặc bị hỏng."
+    except ValueError as e: # Bắt lỗi từ header check hoặc lỗi parse datetime bắt buộc
+         db.session.rollback()
+         current_app.logger.error(f"Lỗi ValueError khi xử lý CSV cho encounter {encounter_id_param}: {e}", exc_info=True)
+         return False, f"Lỗi cấu trúc file CSV: {e}"
     except Exception as e:
         db.session.rollback()
-        current_app.logger.error(f"Lỗi nghiêm trọng khi xử lý CSV cho encounter {encounter_id}: {e}", exc_info=True)
-        return False, f"Đã xảy ra lỗi không mong muốn: {str(e)}"
+        current_app.logger.error(f"Lỗi không xác định khi xử lý file CSV cho encounter {encounter_id_param}: {e}", exc_info=True)
+        return False, f"Lỗi không mong muốn khi xử lý file: {e}"
 
 # Bạn có thể thêm các hàm xử lý CSV khác ở đây nếu cần
 # Ví dụ: process_patient_csv, process_encounter_csv, ...
diff --git a/create_admin.py b/create_admin.py
deleted file mode 100644
index 410d09d3398c90b54d4913b7e83ffd5ebd7e29ba..0000000000000000000000000000000000000000
--- a/create_admin.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-from flask_bcrypt import Bcrypt
-from flask import Flask
-import mysql.connector
-
-# Cấu hình kết nối MySQL trực tiếp không qua SQLAlchemy
-db_config = {
-    'host': 'localhost',
-    'user': 'root',
-    'password': 'trung13062005',
-    'database': 'ccu'
-}
-
-def create_admin_user():
-    """
-    Tạo tài khoản admin trực tiếp trong MySQL mà không cần sử dụng mô hình.
-    """
-    try:
-        # Kết nối đến MySQL
-        connection = mysql.connector.connect(**db_config)
-        cursor = connection.cursor()
-        
-        # Kiểm tra xem admin đã tồn tại chưa
-        cursor.execute("SELECT * FROM users WHERE email = 'admin@ccuhtm.com'")
-        admin = cursor.fetchone()
-        
-        if not admin:
-            print("Đang tạo người dùng admin...")
-            
-            # Tạo mật khẩu băm
-            bcrypt = Bcrypt()
-            hashed_password = bcrypt.generate_password_hash('admin').decode('utf-8')
-            
-            # Thêm người dùng admin
-            query = """
-            INSERT INTO users (username, password_hash, email, role) 
-            VALUES (%s, %s, %s, %s)
-            """
-            values = ('admin', hashed_password, 'admin@ccuhtm.com', 'Admin')
-            
-            cursor.execute(query, values)
-            
-            # Lấy ID của người dùng vừa tạo
-            cursor.execute("SELECT userID FROM users WHERE email = 'admin@ccuhtm.com'")
-            user_id = cursor.fetchone()[0]
-            
-            # Tạo dietitian info cho admin
-            query_dietitian = """
-            INSERT INTO dietitians (userID, firstName, lastName) 
-            VALUES (%s, %s, %s)
-            """
-            values_dietitian = (user_id, 'Admin', 'System')
-            
-            cursor.execute(query_dietitian, values_dietitian)
-            
-            connection.commit()
-            print('Người dùng admin đã được tạo thành công!')
-        else:
-            print('Người dùng admin đã tồn tại.')
-        
-        # Đóng kết nối
-        cursor.close()
-        connection.close()
-        
-        return True
-    
-    except Exception as e:
-        print(f"Lỗi khi tạo người dùng admin: {str(e)}")
-        return False
-
-if __name__ == '__main__':
-    print("Bắt đầu tạo người dùng admin...")
-    create_admin_user() 
diff --git a/encounter_measurements_sample.csv b/encounter_measurements_sample.csv
index d4c26c169f6f70893a331023efa219eaf72a6c79..2a0c8005822ed82bf23a0379a7223b3b6526198a 100644
--- a/encounter_measurements_sample.csv
+++ b/encounter_measurements_sample.csv
@@ -1,1065 +1,1039 @@
 patientID,encounterID,measurementDateTime,temperature,heart_rate,blood_pressure_systolic,blood_pressure_diastolic,oxygen_saturation,resp_rate,fio2,tidal_vol,end_tidal_co2,feed_vol,feed_vol_adm,fio2_ratio,insp_time,oxygen_flow_rate,peep,pip,sip,tidal_vol_actual,tidal_vol_kg,tidal_vol_spon,bmi,referral
-P-10001,E-10001-01,2025-04-16T17:27:19.747106,37.1,72,142,91,99.2,17,21.0,484,,,,,,,6,28,25,440,8.4,,37.0,1
-P-10001,E-10001-01,2025-04-16T18:39:57.166076,36.0,77,136,81,96.3,12,21.0,354,43.9,221,138,,1.1,,,35,27,339,6.1,,37.0,
-P-10001,E-10001-01,2025-04-16T20:54:25.424493,36.3,75,133,86,98.5,20,21.0,366,,,,,1.3,,,28,,329,6.9,,37.0,
-P-10001,E-10001-01,2025-04-16T19:06:33.949065,36.9,68,132,79,99.3,14,21.0,446,37.1,216,165,,,,4,,,446,7.7,,37.0,1
-P-10001,E-10001-01,2025-04-16T19:35:37.207372,37.0,83,125,85,96.6,18,21.0,393,,,,,,,,32,32,384,6.8,,37.0,
-P-10001,E-10001-01,2025-04-17T02:22:53.394803,36.2,73,134,75,99.5,12,21.0,450,39.4,,,,,,4,,,425,8.4,,37.0,1
-P-10001,E-10001-01,2025-04-16T21:10:12.239405,36.0,108,158,105,99.3,15,30.7,448,,,,0.31,0.9,8,,,,415,7.8,,37.0,
-P-10001,E-10001-01,2025-04-17T06:51:08.825106,36.8,72,128,90,98.3,17,21.0,414,,,,,,,,26,26,376,7.8,,37.0,
-P-10001,E-10001-01,2025-04-17T09:21:54.347076,36.9,68,141,82,98.3,19,30.1,543,,,,0.3,,7,6,27,,506,10.2,,37.0,
-P-10001,E-10001-01,2025-04-16T22:12:50.484655,36.8,76,137,77,91.1,18,21.0,352,39.7,,,,1.2,,8,,,326,6.1,77,37.0,
-P-10001,E-10001-02,2025-04-14T17:27:19.747106,36.1,71,136,85,96.4,17,21.0,471,43.4,465,399,,1.4,,,,,433,8.8,,37.0,
-P-10001,E-10001-02,2025-04-14T18:46:50.881197,37.0,76,135,84,99.4,15,21.0,367,,,,,,,5,31,30,342,6.9,,37.0,
-P-10001,E-10001-02,2025-04-14T19:02:20.006804,36.2,73,130,81,97.4,18,21.0,478,44.8,,,,1.0,,4,,,460,9.0,,37.0,1
-P-10001,E-10001-02,2025-04-14T19:28:39.705507,36.9,70,142,85,97.4,15,21.0,531,,,,,,,,26,,491,9.2,,37.0,
-P-10001,E-10001-02,2025-04-14T22:18:49.517753,36.6,81,140,84,96.3,17,21.0,429,,,,,,,,,,420,7.4,,37.0,
-P-10001,E-10001-02,2025-04-14T21:51:32.760000,36.4,76,128,76,98.4,12,36.9,368,,,,0.37,1.2,6,,35,,351,6.4,,37.0,1
-P-10001,E-10001-02,2025-04-14T22:51:15.262578,37.0,82,158,86,96.6,18,21.0,523,,,,,1.2,,,,,520,9.1,80,37.0,1
-P-10001,E-10001-02,2025-04-15T06:03:41.769816,36.9,77,133,86,98.1,19,21.0,405,,,,,1.5,,,,,372,7.6,62,37.0,1
-P-10001,E-10001-02,2025-04-15T09:16:19.918117,37.0,83,128,92,97.0,15,21.0,408,38.8,,,,0.9,,,,,391,7.7,,37.0,1
-P-10001,E-10001-02,2025-04-15T00:55:54.497538,36.1,105,133,94,98.7,20,21.0,480,40.1,,,,0.9,,,29,,479,9.0,,37.0,
-P-10001,E-10001-02,2025-04-15T07:14:21.192850,36.4,84,135,85,97.0,17,49.0,520,42.4,154,108,0.49,1.3,9,4,34,27,517,9.8,,37.0,
-P-10001,E-10001-02,2025-04-14T23:06:52.500388,37.2,70,140,89,97.7,14,21.0,395,,,,,,,8,,,374,7.4,,37.0,1
-P-10001,E-10001-02,2025-04-15T17:06:53.969753,37.0,88,135,81,97.2,15,21.0,442,,316,176,,0.8,,5,,,405,8.3,,37.0,
-P-10001,E-10001-02,2025-04-15T10:49:14.132686,37.0,77,138,89,98.7,20,21.0,524,,,,,,,,,,484,9.8,,37.0,
-P-10002,E-10002-01,2025-04-13T17:27:19.747106,37.2,72,153,104,99.1,18,21.0,373,37.8,,,,,,,,,370,5.8,,28.1,
-P-10002,E-10002-01,2025-04-13T19:16:13.202700,37.1,84,149,91,96.2,17,21.0,380,,,,,,,,,,355,5.5,,28.1,
-P-10002,E-10002-01,2025-04-13T21:06:53.070893,37.1,111,134,79,98.3,19,21.0,527,41.6,321,101,,1.3,,6,27,21,509,8.1,,28.1,
-P-10002,E-10002-01,2025-04-13T22:53:14.146976,37.0,70,141,82,97.4,13,50.9,450,,456,244,0.51,1.4,4,,,,427,6.5,,28.1,1
-P-10002,E-10002-01,2025-04-13T22:18:42.092586,37.2,70,141,89,97.5,18,21.0,461,,118,81,,,,5,,,414,7.1,,28.1,1
-P-10002,E-10002-01,2025-04-13T20:58:25.302447,36.6,77,135,85,99.0,14,21.0,432,38.3,,,,,,5,25,,422,6.7,,28.1,1
-P-10002,E-10002-01,2025-04-13T20:33:50.275619,37.0,85,143,95,98.1,15,21.0,486,35.5,,,,1.4,,,32,30,448,7.0,25,28.1,
-P-10002,E-10002-01,2025-04-14T04:36:55.698193,36.1,76,132,95,96.5,14,41.2,498,44.3,,,0.41,1.4,5,,30,,451,7.2,78,28.1,1
-P-10002,E-10002-01,2025-04-13T23:22:11.113842,36.8,75,147,105,98.9,17,21.0,490,38.6,,,,,,,,,466,7.1,36,28.1,
-P-10002,E-10002-01,2025-04-14T06:41:25.217321,37.4,83,129,95,97.7,17,21.0,361,,,,,,,,,,339,5.2,,28.1,
-P-10002,E-10002-01,2025-04-14T12:10:55.960699,36.4,83,141,95,97.7,12,35.8,412,,,,0.36,1.2,7,5,,,377,5.9,,28.1,
-P-10002,E-10002-01,2025-04-14T12:15:15.766251,36.9,73,126,88,98.0,18,21.0,454,,,,,1.5,,,,,450,6.5,27,28.1,
-P-10002,E-10002-01,2025-04-14T07:01:01.472873,36.8,77,135,79,96.5,17,21.0,507,36.2,237,168,,,,,29,,466,7.3,41,28.1,
-P-10002,E-10002-01,2025-04-14T02:37:16.570498,36.1,85,126,98,97.5,18,21.0,498,38.8,,,,1.0,,,32,24,465,7.7,,28.1,
-P-10002,E-10002-01,2025-04-14T09:52:44.209457,36.6,74,135,99,99.4,12,21.0,357,44.7,362,205,,1.3,,8,,,352,5.5,,28.1,
-P-10002,E-10002-02,2025-04-12T17:27:19.747106,36.3,66,123,98,96.8,15,21.0,511,41.5,,,,,,4,,,499,7.9,80,28.1,
-P-10002,E-10002-02,2025-04-12T19:19:29.410120,36.3,73,131,84,98.7,16,21.0,411,42.2,,,,,,,30,,410,5.9,,28.1,1
-P-10002,E-10002-02,2025-04-12T21:11:38.693335,36.4,69,124,89,97.3,19,21.0,367,41.8,,,,,,7,25,,342,5.7,,28.1,1
-P-10002,E-10002-02,2025-04-12T20:16:56.543139,36.1,79,135,82,97.0,14,21.0,370,41.0,256,141,,1.4,,,,,350,5.3,,28.1,1
-P-10002,E-10002-02,2025-04-12T23:03:50.762045,36.7,79,132,94,98.4,13,21.0,467,,,,,1.3,,8,26,,449,6.7,,28.1,1
-P-10002,E-10002-02,2025-04-12T22:25:53.808120,36.1,79,141,86,98.3,15,21.0,495,41.8,,,,1.4,,,,,466,7.1,31,28.1,
-P-10002,E-10002-02,2025-04-12T21:55:54.626184,37.1,77,130,93,96.3,15,21.0,437,44.9,,,,1.0,,,26,,403,6.7,,28.1,
-P-10002,E-10002-02,2025-04-13T03:31:17.213800,37.1,76,137,81,96.8,17,21.0,395,,163,111,,,,4,33,30,394,5.7,,28.1,
-P-10002,E-10002-02,2025-04-12T23:58:30.896879,36.9,66,144,93,96.5,20,21.0,425,,300,,,,,,,,424,6.1,,28.1,1
-P-10002,E-10002-02,2025-04-13T04:26:15.590689,37.0,66,146,90,96.8,13,21.0,541,,,,,,,,,,502,8.3,26,28.1,1
-P-10002,E-10002-02,2025-04-13T06:16:42.089605,36.6,77,140,88,97.5,15,21.0,439,,385,249,,,,6,25,,439,6.3,,28.1,
-P-10003,E-10003-01,2025-04-13T17:27:19.747106,37.0,92,136,79,97.6,14,21.0,439,35.0,,,,1.2,,8,,,421,8.2,,37.3,
-P-10003,E-10003-01,2025-04-13T18:39:58.476831,37.6,76,153,90,96.3,18,21.0,367,39.4,,,,,,6,,,338,6.3,,37.3,
-P-10003,E-10003-01,2025-04-13T18:50:30.435986,36.3,91,134,90,99.5,12,21.0,549,,264,,,,,,,,543,10.2,,37.3,
-P-10003,E-10003-01,2025-04-13T21:11:42.228199,37.1,111,165,89,96.2,13,21.0,417,42.9,,,,1.5,,,,,389,7.8,75,37.3,
-P-10003,E-10003-01,2025-04-14T00:35:55.679047,37.4,94,122,90,98.7,13,21.0,539,37.3,,,,,,,,,504,10.1,,37.3,1
-P-10003,E-10003-01,2025-04-13T20:10:18.731487,37.0,75,150,92,96.4,12,21.0,391,,,,,1.3,,,,,367,6.7,,37.3,1
-P-10003,E-10003-01,2025-04-14T01:59:21.203252,37.6,57,132,76,96.3,12,21.0,459,38.9,,,,,,,,,448,8.6,80,37.3,
-P-10003,E-10003-01,2025-04-13T23:46:52.481977,37.4,99,148,90,96.2,14,21.0,498,,,,,1.4,,,,,471,8.6,,37.3,
-P-10004,E-10004-01,2025-04-15T17:27:19.747106,36.7,74,112,71,99.0,14,21.0,367,37.0,,,,,,8,25,,356,5.6,,19.3,
-P-10004,E-10004-01,2025-04-15T18:48:40.454703,36.3,82,121,83,98.2,20,21.0,371,,,,,1.0,,5,,,339,6.1,21,19.3,1
-P-10004,E-10004-01,2025-04-15T19:37:27.918546,36.8,83,116,70,97.8,15,21.0,356,,,,,1.0,,,,,342,5.4,,19.3,
-P-10004,E-10004-01,2025-04-15T22:45:06.361775,36.5,83,144,81,96.2,18,21.0,371,,,,,1.5,,4,32,22,362,6.1,,19.3,
-P-10004,E-10004-01,2025-04-15T21:51:09.428096,37.0,72,118,75,95.2,16,21.0,462,37.4,453,297,,,,4,,,422,7.6,,19.3,1
-P-10004,E-10004-01,2025-04-16T01:52:49.078022,36.6,74,125,75,97.8,15,52.3,476,,,,0.52,0.8,10,,,,475,7.3,,19.3,
-P-10004,E-10004-01,2025-04-15T23:03:34.833966,37.1,74,114,80,98.5,16,21.0,365,37.3,,,,1.3,,,29,28,346,6.0,,19.3,
-P-10004,E-10004-01,2025-04-16T05:08:53.420918,36.6,70,135,82,97.3,19,21.0,486,40.2,,,,,,,,,455,7.4,,19.3,
-P-10004,E-10004-01,2025-04-16T06:15:16.064019,36.4,68,112,72,99.4,18,21.0,500,,,,,,,,,,499,7.6,42,19.3,
-P-10004,E-10004-01,2025-04-16T10:02:52.920807,36.1,79,112,79,97.9,19,21.0,436,39.5,,,,1.4,,8,,,398,7.1,,19.3,
-P-10004,E-10004-01,2025-04-16T11:44:12.677564,36.9,66,120,77,98.0,13,21.0,368,,,,,0.9,,6,25,,349,5.6,,19.3,
-P-10004,E-10004-01,2025-04-16T05:41:19.979333,37.0,83,134,92,98.5,19,21.0,420,,241,212,,,,4,,,404,6.4,,19.3,
-P-10004,E-10004-01,2025-04-16T07:19:11.320735,37.0,66,130,86,98.2,13,21.0,464,,,,,0.9,,5,,,423,7.6,66,19.3,
-P-10004,E-10004-02,2025-04-07T17:27:19.747106,36.5,65,137,82,96.8,14,21.0,485,39.9,,,,,,,,,485,7.9,,19.3,
-P-10004,E-10004-02,2025-04-07T18:50:55.303194,36.0,83,125,71,94.0,17,21.0,392,,,,,0.8,,,,,370,6.4,,19.3,
-P-10004,E-10004-02,2025-04-07T20:11:39.640862,37.2,77,110,79,98.2,16,21.0,538,38.9,,,,1.4,,6,30,29,536,8.2,77,19.3,
-P-10004,E-10004-02,2025-04-07T21:07:51.609397,36.5,83,121,76,97.7,13,47.3,371,42.9,,,0.47,,5,,31,26,362,5.7,,19.3,
-P-10004,E-10004-02,2025-04-08T00:46:46.738650,36.8,77,142,78,96.6,17,21.0,515,38.0,,,,,,,,,468,8.4,,19.3,
-P-10004,E-10004-02,2025-04-07T20:01:01.319450,37.1,65,125,75,99.4,19,21.0,421,39.1,,,,0.9,,4,,,416,6.4,,19.3,
-P-10004,E-10004-02,2025-04-08T04:06:50.993367,36.0,65,119,76,99.2,13,21.0,382,,,,,,,,27,,367,6.2,,19.3,1
-P-10004,E-10004-02,2025-04-07T21:39:51.194043,36.8,75,137,91,97.9,20,21.0,440,42.4,,,,,,,,,420,6.7,30,19.3,
-P-10004,E-10004-02,2025-04-08T06:56:10.753944,36.7,67,111,79,96.4,19,21.0,478,41.4,,,,,,,,,456,7.3,,19.3,
-P-10004,E-10004-02,2025-04-08T05:43:26.343170,36.2,83,122,80,97.8,12,21.0,361,,,,,,,,35,28,324,5.9,,19.3,
-P-10004,E-10004-02,2025-04-08T06:12:07.056263,36.1,79,113,74,96.5,15,21.0,385,,,,,1.4,,,,,379,6.3,,19.3,
-P-10004,E-10004-02,2025-04-08T08:05:09.717776,36.4,82,124,70,92.6,13,21.0,401,43.0,,,,1.4,,,,,387,6.6,,19.3,
-P-10004,E-10004-02,2025-04-08T11:01:05.591907,36.5,81,118,79,99.0,19,21.0,356,,322,222,,,,,,,327,5.8,,19.3,
-P-10004,E-10004-03,2025-04-07T17:27:19.747106,36.3,83,123,75,99.5,16,21.0,447,36.1,,,,,,8,33,25,421,7.3,,19.3,
-P-10004,E-10004-03,2025-04-07T18:00:47.081728,37.8,71,119,76,97.3,18,21.0,430,43.2,,,,,,,34,32,414,6.6,,19.3,1
-P-10004,E-10004-03,2025-04-07T21:03:56.619664,36.3,67,113,74,94.4,13,27.8,417,,,,0.28,,6,,,,377,6.8,,19.3,
-P-10004,E-10004-03,2025-04-07T20:16:20.304088,37.0,82,111,85,98.1,13,21.0,421,,358,99,,1.3,,7,27,21,414,6.4,,19.3,1
-P-10004,E-10004-03,2025-04-07T22:47:28.736180,36.9,75,116,84,96.1,17,21.0,496,37.7,,,,1.1,,8,,,465,8.1,,19.3,1
-P-10004,E-10004-03,2025-04-07T23:27:41.131222,37.0,70,110,82,97.3,16,21.0,459,41.2,398,263,,1.4,,,25,22,452,7.5,,19.3,
-P-10004,E-10004-03,2025-04-07T22:47:25.320066,36.1,72,111,75,98.1,16,21.0,455,40.7,,,,0.9,,,,,428,7.4,,19.3,
-P-10004,E-10004-03,2025-04-07T20:58:45.554946,36.2,69,118,80,99.1,15,21.0,426,,,,,,,,,,413,7.0,,19.3,
-P-10005,E-10005-01,2025-04-14T17:27:19.747106,36.8,73,139,81,98.5,12,53.2,420,36.4,430,393,0.53,,4,,,,400,6.7,,31.7,
-P-10005,E-10005-01,2025-04-14T19:05:38.695067,36.1,78,126,86,96.6,12,21.0,484,36.1,,,,0.8,,,26,,453,7.7,,31.7,
-P-10005,E-10005-01,2025-04-14T21:22:49.994556,36.4,70,138,95,97.2,20,21.0,532,,,,,,,,,,528,7.9,,31.7,
-P-10005,E-10005-01,2025-04-14T21:46:27.464175,36.5,82,142,85,97.2,19,21.0,459,38.6,304,298,,0.9,,,,,415,6.8,,31.7,1
-P-10005,E-10005-01,2025-04-14T20:52:47.796484,36.2,84,135,83,98.9,19,21.0,477,,,,,0.9,,,,,432,7.1,,31.7,1
-P-10005,E-10005-01,2025-04-15T01:05:27.095615,36.2,70,140,80,97.1,15,26.5,438,,407,,0.27,1.1,2,6,25,25,429,6.9,,31.7,
-P-10005,E-10005-01,2025-04-14T23:12:20.366645,36.5,102,141,90,94.9,20,56.6,545,36.9,350,,0.57,1.5,9,5,25,24,495,8.6,,31.7,
-P-10005,E-10005-01,2025-04-15T03:32:17.883164,36.0,70,135,96,98.7,13,21.0,479,41.2,160,106,,1.1,,,26,25,460,7.6,,31.7,1
-P-10005,E-10005-01,2025-04-15T00:11:22.668805,36.6,77,139,76,99.0,12,37.2,419,,,,0.37,,7,,30,24,398,6.6,,31.7,
-P-10005,E-10005-01,2025-04-15T01:52:32.416451,36.6,50,131,90,97.3,13,21.0,490,41.3,109,101,,1.4,,,,,467,7.8,29,31.7,
-P-10005,E-10005-01,2025-04-15T12:15:23.882939,36.9,80,130,95,96.5,16,21.0,443,40.4,,,,,,,,,441,6.6,70,31.7,
-P-10005,E-10005-01,2025-04-15T12:29:09.846631,36.0,72,133,84,99.4,13,21.0,441,36.1,,,,1.3,,8,,,409,7.0,,31.7,
-P-10005,E-10005-02,2025-04-09T17:27:19.747106,36.4,83,133,85,97.5,19,21.0,500,41.6,237,101,,,,8,,,450,7.9,,31.7,
-P-10005,E-10005-02,2025-04-09T18:32:07.040044,37.3,79,159,95,97.1,20,21.0,542,,,,,0.9,,5,34,,509,8.6,,31.7,
-P-10005,E-10005-02,2025-04-09T20:04:05.150213,36.7,82,140,82,96.9,15,21.0,464,35.3,273,183,,,,4,25,,451,7.4,,31.7,
-P-10005,E-10005-02,2025-04-09T22:50:42.367632,36.3,85,137,81,98.3,17,21.0,459,39.5,,,,1.2,,6,,,415,7.3,,31.7,
-P-10005,E-10005-02,2025-04-09T21:26:58.272310,36.7,71,126,86,95.6,17,21.0,390,,,,,1.3,,4,26,,354,5.8,,31.7,
-P-10005,E-10005-02,2025-04-10T02:10:27.335042,37.0,79,167,96,98.6,19,21.0,453,,,,,,,8,,,440,6.7,,31.7,1
-P-10005,E-10005-02,2025-04-09T23:39:07.526507,36.3,77,136,86,99.1,17,21.0,469,35.0,,,,1.4,,6,,,426,6.9,,31.7,
-P-10005,E-10005-02,2025-04-10T05:00:31.520130,36.8,70,141,93,97.6,12,21.0,435,,,,,1.1,,,,,403,6.4,,31.7,
-P-10005,E-10005-02,2025-04-10T01:21:35.067375,36.5,52,137,80,98.5,15,21.0,366,,,,,,,,28,27,365,5.4,,31.7,
-P-10005,E-10005-02,2025-04-10T03:57:46.429069,36.7,82,163,97,93.8,17,21.0,402,41.1,,,,1.2,,6,,,379,6.4,,31.7,
-P-10005,E-10005-02,2025-04-10T08:35:40.403966,36.0,73,130,87,96.2,12,46.2,359,,478,432,0.46,,5,,,,351,5.7,,31.7,
-P-10006,E-10006-01,2025-04-15T17:27:19.748194,36.5,84,116,73,96.4,12,21.0,542,,349,192,,,,,,,512,8.2,25,30.2,1
-P-10006,E-10006-01,2025-04-15T18:51:03.918037,37.0,68,116,78,96.2,19,21.0,371,37.3,,,,1.4,,5,,,360,5.6,,30.2,
-P-10006,E-10006-01,2025-04-15T19:48:44.126579,36.5,67,115,79,96.5,14,21.0,459,,225,86,,1.5,,6,,,423,7.5,,30.2,1
-P-10006,E-10006-01,2025-04-15T21:25:38.463183,36.2,100,117,71,97.4,15,27.1,488,,,,0.27,1.0,8,,35,29,446,7.9,,30.2,1
-P-10006,E-10006-01,2025-04-15T19:33:43.236016,37.6,79,130,84,97.9,19,21.0,360,,,,,1.4,,,,,342,5.8,,30.2,1
-P-10006,E-10006-01,2025-04-16T02:34:36.821707,36.9,82,130,93,96.4,18,21.0,473,,153,112,,,,,27,20,444,7.2,,30.2,1
-P-10006,E-10006-01,2025-04-16T05:00:03.780489,36.2,57,112,79,98.0,19,21.0,368,,334,118,,,,,,,334,6.0,,30.2,
-P-10006,E-10006-01,2025-04-15T23:04:33.867668,36.2,67,141,90,98.6,20,21.0,436,,331,199,,,,,,,435,6.6,,30.2,
-P-10006,E-10006-01,2025-04-15T22:40:56.316486,36.9,71,116,76,96.1,20,21.0,531,,,,,1.4,,6,,,509,8.6,,30.2,
-P-10006,E-10006-01,2025-04-16T06:48:06.927685,36.6,66,117,78,98.8,18,42.3,483,,106,101,0.42,1.1,3,,,,481,7.3,,30.2,
-P-10007,E-10007-01,2025-04-16T17:27:19.748194,37.1,93,129,80,98.9,17,21.0,365,,,,,1.1,,,,,342,6.2,,21.7,
-P-10007,E-10007-01,2025-04-16T18:48:45.604061,37.8,103,130,86,98.7,15,26.0,397,,195,97,0.26,,4,,30,25,373,6.3,,21.7,
-P-10007,E-10007-01,2025-04-16T18:48:46.099958,36.7,72,129,94,96.8,17,21.0,436,,,,,1.0,,5,,,432,6.9,,21.7,
-P-10007,E-10007-01,2025-04-16T22:21:27.613249,36.4,100,137,83,97.9,14,21.0,455,40.4,,,,,,7,,,414,7.2,,21.7,
-P-10007,E-10007-01,2025-04-17T00:02:04.985052,37.6,94,127,78,97.7,17,21.0,538,44.1,,,,1.1,,4,27,21,496,9.1,,21.7,1
-P-10007,E-10007-02,2025-04-09T17:27:19.748194,36.9,79,136,89,96.8,17,28.9,487,35.9,,,0.29,,9,,,,474,7.7,,21.7,
-P-10007,E-10007-02,2025-04-09T18:16:51.501748,37.1,94,162,98,97.5,13,21.0,405,,,,,1.4,,,,,375,6.9,27,21.7,
-P-10007,E-10007-02,2025-04-09T21:25:17.236279,37.1,98,141,80,96.5,12,29.0,498,,,,0.29,1.4,3,4,29,20,470,8.4,,21.7,
-P-10007,E-10007-02,2025-04-09T21:29:46.406558,37.1,99,157,88,98.4,19,21.0,388,40.6,,,,,,7,,,355,6.6,,21.7,
-P-10007,E-10007-02,2025-04-09T20:32:50.421538,37.2,115,152,91,93.5,19,21.0,486,,363,347,,1.4,,6,26,,454,7.7,,21.7,
-P-10007,E-10007-02,2025-04-10T02:13:50.406457,37.2,93,130,85,97.3,15,21.0,402,35.8,,,,1.0,,5,34,,388,6.8,,21.7,
-P-10007,E-10007-02,2025-04-10T01:37:53.721006,36.9,86,140,94,97.5,16,21.0,518,,,,,0.9,,,28,26,482,8.8,,21.7,
-P-10007,E-10007-02,2025-04-10T02:08:37.690064,37.4,93,125,87,97.7,15,21.0,385,,,,,,,,,,350,6.1,,21.7,1
-P-10007,E-10007-02,2025-04-10T01:46:02.055191,37.3,100,142,107,96.6,12,21.0,447,37.0,,,,1.1,,8,,,446,7.6,70,21.7,1
-P-10007,E-10007-02,2025-04-10T03:27:34.399902,37.5,92,140,82,96.6,13,42.5,546,37.7,,,0.42,0.9,10,4,,,544,8.6,,21.7,
-P-10007,E-10007-02,2025-04-10T06:17:30.382456,37.1,99,141,96,97.6,17,21.0,515,43.1,,,,1.4,,4,31,21,485,8.7,,21.7,
-P-10007,E-10007-02,2025-04-09T23:34:30.360540,38.0,78,147,93,97.5,16,21.0,457,,,,,1.1,,,,,441,7.2,,21.7,
-P-10007,E-10007-02,2025-04-10T06:16:36.024930,38.1,102,140,86,96.5,19,21.0,452,,374,,,1.3,,6,,,438,7.7,75,21.7,
-P-10007,E-10007-03,2025-04-14T17:27:19.748194,37.1,97,147,97,98.1,15,21.0,450,38.0,,,,,,7,,,421,7.6,,21.7,1
-P-10007,E-10007-03,2025-04-14T19:26:10.131785,36.9,95,132,92,97.6,19,21.0,479,,,,,1.3,,,,,437,8.1,,21.7,1
-P-10007,E-10007-03,2025-04-14T18:32:34.800811,36.8,74,137,91,96.3,12,21.0,532,36.6,,,,1.3,,,,,484,8.4,,21.7,1
-P-10007,E-10007-03,2025-04-14T22:45:17.076323,36.6,89,142,88,98.4,18,56.7,447,,,,0.57,,4,,,,440,7.0,,21.7,1
-P-10007,E-10007-03,2025-04-14T20:39:45.799677,37.1,99,141,91,98.1,19,21.0,415,,,,,1.2,,4,28,,374,6.5,24,21.7,1
-P-10007,E-10007-03,2025-04-15T02:21:47.692214,37.4,93,130,90,97.5,20,21.0,356,38.0,284,104,,,,6,35,,324,6.0,59,21.7,
-P-10007,E-10007-03,2025-04-14T20:46:45.417214,37.2,76,127,94,96.8,18,21.0,535,44.6,,,,,,,,,509,8.4,,21.7,
-P-10007,E-10007-03,2025-04-15T03:23:23.810195,37.5,92,157,103,97.0,16,21.0,517,40.7,,,,1.1,,8,25,,488,8.8,,21.7,
-P-10007,E-10007-03,2025-04-15T04:58:56.991440,36.7,80,156,98,94.6,20,45.8,416,37.1,,,0.46,0.8,7,,,,388,6.6,57,21.7,
-P-10007,E-10007-03,2025-04-15T08:53:44.624573,36.6,98,133,92,99.2,12,21.0,472,,,,,,,,29,29,432,8.0,,21.7,1
-P-10007,E-10007-03,2025-04-15T09:14:39.073886,37.9,96,131,94,99.0,14,24.7,491,43.1,,,0.25,1.2,2,7,,,462,7.7,,21.7,1
-P-10007,E-10007-03,2025-04-15T11:09:43.252696,37.9,82,138,85,97.0,20,21.0,388,,,,,1.4,,,,,378,6.6,,21.7,
-P-10007,E-10007-03,2025-04-15T02:39:55.104195,36.9,89,135,84,99.2,14,21.0,535,,,,,1.2,,,,,490,9.1,,21.7,
-P-10007,E-10007-03,2025-04-15T08:47:38.124961,37.4,82,143,91,97.5,16,21.0,509,,247,206,,1.1,,,,,488,8.6,33,21.7,
-P-10007,E-10007-03,2025-04-15T05:01:14.530239,37.7,86,136,97,99.4,14,21.0,383,,,,,1.2,,,35,32,383,6.0,,21.7,
-P-10008,E-10008-01,2025-04-12T17:27:19.748194,36.4,72,137,90,98.8,18,46.4,359,40.8,,,0.46,1.5,4,,,,353,5.8,,27.2,
-P-10008,E-10008-01,2025-04-12T19:26:33.640965,36.6,44,136,81,96.1,12,21.0,524,,,,,1.4,,6,,,511,9.1,77,27.2,1
-P-10008,E-10008-01,2025-04-12T21:15:16.330576,37.1,79,136,88,99.4,16,21.0,382,,,,,,,,,,375,6.1,,27.2,1
-P-10008,E-10008-01,2025-04-12T22:43:46.594738,37.0,99,138,87,98.5,13,21.0,484,,,,,1.5,,,,,472,8.4,,27.2,
-P-10008,E-10008-01,2025-04-12T21:32:25.118724,36.8,107,126,83,99.4,19,21.0,412,36.1,,,,1.4,,,34,,388,7.1,,27.2,1
-P-10008,E-10008-01,2025-04-13T02:35:54.828592,37.0,77,134,96,97.3,12,58.0,378,,,,0.58,,3,,,,372,6.1,,27.2,
-P-10008,E-10008-01,2025-04-13T00:46:23.255113,36.2,81,131,91,96.1,19,21.0,483,,,,,,,,,,462,8.4,,27.2,
-P-10008,E-10008-01,2025-04-12T23:14:55.391644,36.7,68,144,91,99.2,20,21.0,369,,,,,1.1,,,35,26,352,5.9,,27.2,1
-P-10008,E-10008-01,2025-04-13T03:20:04.490666,36.7,63,123,79,95.4,14,21.0,525,42.4,,,,1.5,,7,,,521,9.1,28,27.2,
-P-10008,E-10008-01,2025-04-13T01:23:36.108683,36.1,67,138,77,98.0,15,35.6,396,,112,81,0.36,1.3,8,5,30,25,365,6.9,,27.2,
-P-10008,E-10008-01,2025-04-13T12:48:07.568961,36.7,78,136,90,98.7,12,21.0,403,,,,,,,,,,381,6.5,,27.2,
-P-10008,E-10008-01,2025-04-13T13:09:12.168943,37.0,69,142,89,98.2,18,21.0,421,,,,,,,,,,406,7.3,76,27.2,
-P-10008,E-10008-01,2025-04-13T12:15:53.701221,37.1,76,141,91,96.8,20,21.0,354,,,,,1.2,,4,,,331,5.7,,27.2,
-P-10008,E-10008-01,2025-04-13T02:45:26.750368,36.2,73,151,89,98.2,19,34.7,530,37.6,333,228,0.35,1.1,2,,34,28,521,9.2,,27.2,
-P-10008,E-10008-02,2025-04-15T17:27:19.748194,36.9,79,140,94,95.6,17,21.0,417,41.8,,,,,,,,,408,7.2,,27.2,
-P-10008,E-10008-02,2025-04-15T18:22:21.762124,36.6,68,143,86,98.9,19,21.0,403,,,,,,,,33,27,376,6.5,66,27.2,
-P-10008,E-10008-02,2025-04-15T20:39:41.304839,36.4,92,125,79,98.6,19,21.0,419,40.2,,,,,,,28,24,419,7.3,,27.2,1
-P-10008,E-10008-02,2025-04-15T20:20:37.803661,36.6,83,136,82,97.0,18,21.0,350,38.5,,,,0.9,,,30,25,339,5.6,,27.2,
-P-10008,E-10008-02,2025-04-15T19:59:23.089488,37.0,71,141,86,98.9,18,40.4,494,44.4,,,0.4,,2,,31,21,474,8.6,30,27.2,
-P-10008,E-10008-02,2025-04-16T02:50:50.849868,36.5,72,131,84,98.8,18,21.0,364,,,,,1.4,,,,,337,5.8,,27.2,
-P-10008,E-10008-02,2025-04-16T01:52:27.546679,37.2,97,144,89,97.9,17,21.0,455,,,,,,,,,,431,7.9,,27.2,
-P-10008,E-10008-02,2025-04-16T04:29:02.054951,36.5,76,134,88,98.2,16,21.0,393,43.2,,,,,,8,,,361,6.3,,27.2,
-P-10008,E-10008-02,2025-04-16T05:41:10.234350,36.7,88,129,82,97.0,13,21.0,361,,489,124,,1.1,,7,,,324,6.3,,27.2,
-P-10008,E-10008-02,2025-04-16T07:54:18.921224,37.2,66,130,81,97.7,12,54.6,390,,,,0.55,,2,,,,370,6.3,,27.2,
-P-10009,E-10009-01,2025-04-13T17:27:19.748194,36.3,86,141,86,99.4,13,26.8,358,36.6,439,210,0.27,1.5,9,,,,340,6.8,,28.0,1
-P-10009,E-10009-01,2025-04-13T18:52:32.921610,36.7,112,147,98,98.3,13,21.0,452,,,,,,,,,,410,8.0,,28.0,1
-P-10009,E-10009-01,2025-04-13T19:37:18.443523,36.6,94,125,76,97.5,13,21.0,515,40.0,,,,,,,,,508,9.9,,28.0,1
-P-10009,E-10009-01,2025-04-13T19:08:22.825773,36.7,83,132,92,99.1,16,26.5,466,,,,0.27,,5,,25,,446,8.2,,28.0,
-P-10009,E-10009-01,2025-04-13T23:55:10.276250,36.9,62,136,80,98.9,16,21.0,511,38.2,293,145,,,,6,26,20,478,9.0,,28.0,
-P-10009,E-10009-01,2025-04-14T02:50:23.252512,37.1,69,132,89,99.3,18,26.8,416,,,,0.27,1.3,5,,31,26,400,8.0,,28.0,
-P-10009,E-10009-02,2025-04-11T17:27:19.748194,36.1,94,136,79,98.1,20,21.0,378,42.9,,,,0.9,,,,,350,7.2,,28.0,
-P-10009,E-10009-02,2025-04-11T19:20:56.669349,36.7,95,157,100,98.7,18,21.0,503,,,,,1.4,,5,32,24,452,8.9,,28.0,1
-P-10009,E-10009-02,2025-04-11T18:51:21.068556,36.5,69,132,83,96.8,19,21.0,521,37.8,,,,1.0,,8,,,516,10.0,,28.0,
-P-10009,E-10009-02,2025-04-11T19:47:00.527159,36.8,84,139,90,98.5,17,21.0,517,37.0,410,345,,1.3,,,,,512,9.9,58,28.0,
-P-10009,E-10009-02,2025-04-11T22:51:38.344269,36.2,104,126,88,96.1,15,21.0,382,44.2,,,,1.3,,,,,366,7.3,,28.0,
-P-10009,E-10009-02,2025-04-11T23:05:16.170033,37.0,97,135,83,99.2,15,54.4,415,36.0,,,0.54,0.9,9,,,,410,7.9,,28.0,
-P-10009,E-10009-02,2025-04-12T04:00:27.280384,36.2,93,134,91,99.2,14,21.0,432,,,,,,,5,33,27,404,7.6,43,28.0,
-P-10009,E-10009-02,2025-04-11T22:52:01.603438,36.8,68,136,91,96.7,13,21.0,492,,227,104,,1.0,,6,,,457,8.7,,28.0,
-P-10009,E-10009-02,2025-04-12T05:58:07.306845,36.9,96,133,78,94.0,17,21.0,380,36.1,,,,1.0,,8,,,372,6.7,,28.0,
-P-10010,E-10010-01,2025-04-15T17:27:19.748194,36.1,75,110,74,98.5,14,21.0,426,35.6,,,,,,8,,,397,6.4,,26.2,
-P-10010,E-10010-01,2025-04-15T18:24:26.921813,37.1,82,115,75,97.0,12,21.0,470,,,,,1.2,,,,,433,7.1,,26.2,
-P-10010,E-10010-01,2025-04-15T21:06:18.515605,36.0,77,140,80,98.6,18,21.0,546,44.1,,,,1.1,,5,,,540,7.7,,26.2,
-P-10010,E-10010-01,2025-04-15T21:05:13.485304,36.3,78,116,73,97.9,20,21.0,517,,,,,,,8,,,511,7.3,,26.2,
-P-10010,E-10010-01,2025-04-15T22:06:57.848341,36.2,68,110,77,98.5,14,21.0,426,37.5,143,142,,0.8,,6,,,425,6.4,,26.2,1
-P-10010,E-10010-01,2025-04-15T22:27:59.699458,36.1,72,113,73,96.0,17,43.3,473,42.1,,,0.43,1.4,9,,,,464,6.7,,26.2,
-P-10010,E-10010-01,2025-04-16T02:17:49.416465,36.3,77,124,90,93.1,15,21.0,536,43.7,,,,1.0,,6,26,23,523,8.1,,26.2,
-P-10010,E-10010-01,2025-04-15T22:14:54.336273,36.2,84,116,73,96.5,19,21.0,401,,443,,,1.0,,6,,,391,6.0,55,26.2,
-P-10010,E-10010-01,2025-04-16T02:27:16.788369,36.0,81,117,77,96.7,19,21.0,542,,,,,1.0,,,,,493,7.6,,26.2,
-P-10010,E-10010-01,2025-04-16T09:32:15.102702,36.4,51,118,85,97.2,18,21.0,423,,,,,1.1,,6,27,21,393,6.0,,26.2,1
-P-10010,E-10010-01,2025-04-16T00:17:06.577729,36.1,81,132,82,98.6,16,21.0,406,,,,,,,,30,20,389,5.7,,26.2,
-P-10010,E-10010-01,2025-04-16T11:14:22.531196,36.9,102,115,83,98.0,20,21.0,541,,,,,,,,,,498,8.1,,26.2,
-P-10010,E-10010-01,2025-04-16T16:18:46.682448,37.1,79,124,75,96.5,14,21.0,371,37.3,485,362,,,,,,,367,5.6,,26.2,
-P-10010,E-10010-02,2025-04-12T17:27:19.748194,36.7,72,110,73,98.0,12,21.0,423,44.7,,,,0.9,,4,30,22,421,6.4,,26.2,
-P-10010,E-10010-02,2025-04-12T19:14:15.669444,37.7,84,118,84,99.4,18,21.0,381,41.6,205,162,,1.1,,,,,374,5.7,,26.2,1
-P-10010,E-10010-02,2025-04-12T19:32:34.174031,37.2,82,127,94,97.9,13,21.0,492,,,,,1.3,,,,,451,6.9,61,26.2,1
-P-10010,E-10010-02,2025-04-12T20:52:02.508165,36.1,80,116,76,97.1,13,21.0,392,,236,157,,1.1,,,31,,354,5.5,,26.2,1
-P-10010,E-10010-02,2025-04-12T21:43:02.131305,36.4,74,119,75,99.3,18,21.0,537,,,,,,,8,35,31,491,7.6,79,26.2,
-P-10010,E-10010-02,2025-04-12T20:07:45.841710,36.8,75,110,73,97.8,14,21.0,386,,,,,1.5,,7,,,381,5.8,,26.2,
-P-10011,E-10011-01,2025-04-14T17:27:19.749207,36.7,68,135,81,98.4,16,21.0,528,,,,,,,4,26,24,512,10.3,73,41.9,
-P-10011,E-10011-01,2025-04-14T18:07:55.091545,36.0,90,133,88,95.3,14,21.0,531,,155,139,,,,8,,,481,10.4,,41.9,
-P-10011,E-10011-01,2025-04-14T20:19:30.662501,37.2,81,138,76,96.3,18,48.8,470,,,,0.49,,8,,,,427,10.1,,41.9,
-P-10011,E-10011-01,2025-04-14T21:35:07.327916,37.2,73,133,78,99.3,18,21.0,353,,,,,1.4,,,,,352,6.9,,41.9,1
-P-10011,E-10011-01,2025-04-14T22:11:23.371517,36.7,70,142,93,98.4,14,21.0,479,,,,,,,,30,30,452,9.4,,41.9,
-P-10011,E-10011-02,2025-04-07T17:27:19.749207,36.5,68,132,97,97.7,17,21.0,546,,,,,,,,,,509,11.7,77,41.9,
-P-10011,E-10011-02,2025-04-07T18:36:54.028261,36.4,65,134,92,97.3,19,21.0,535,,,,,,,,,,516,10.5,21,41.9,
-P-10011,E-10011-02,2025-04-07T18:29:20.936804,37.2,85,144,82,96.3,12,44.8,418,,,,0.45,,9,,27,27,388,8.2,,41.9,
-P-10011,E-10011-02,2025-04-07T20:08:49.648898,37.1,73,131,91,96.7,18,21.0,523,,,,,1.3,,,28,,484,11.2,80,41.9,
-P-10011,E-10011-02,2025-04-08T00:41:25.908821,36.2,70,142,97,93.4,15,21.0,476,40.2,,,,0.9,,,,,441,9.3,,41.9,
-P-10011,E-10011-02,2025-04-07T23:45:27.519022,36.0,77,137,93,96.8,17,21.0,434,35.0,397,210,,,,5,,,419,9.3,,41.9,1
-P-10011,E-10011-02,2025-04-08T01:39:16.643642,37.1,78,146,102,98.5,16,21.0,403,36.6,290,243,,0.8,,4,29,27,379,7.9,,41.9,1
-P-10011,E-10011-02,2025-04-08T02:18:33.191139,36.8,75,137,80,94.2,18,51.0,452,42.2,477,,0.51,0.9,2,7,,,427,8.8,49,41.9,1
-P-10011,E-10011-02,2025-04-07T22:42:55.365822,36.9,67,128,96,97.8,14,21.0,422,,,,,,,,,,403,9.0,68,41.9,
-P-10011,E-10011-02,2025-04-08T08:27:56.425802,36.3,79,123,90,98.3,18,56.8,528,36.7,,,0.57,1.2,3,4,,,525,11.3,49,41.9,
-P-10011,E-10011-02,2025-04-08T10:12:27.277527,36.3,78,129,91,97.0,15,21.0,389,40.9,,,,1.2,,4,26,24,371,7.6,67,41.9,
-P-10011,E-10011-02,2025-04-08T06:13:53.053972,36.9,58,131,78,98.3,16,46.2,417,,151,,0.46,,7,,33,26,407,8.2,,41.9,1
-P-10011,E-10011-02,2025-04-08T04:30:30.530358,36.4,84,142,80,97.1,14,21.0,513,42.5,,,,1.3,,6,,,502,11.0,43,41.9,
-P-10011,E-10011-02,2025-04-08T15:55:15.694567,36.0,78,127,78,97.1,12,21.0,415,,,,,,,5,,,386,8.9,,41.9,
-P-10011,E-10011-02,2025-04-08T01:42:14.320929,36.4,70,136,94,97.3,13,21.0,501,41.0,,,,,,,,,458,10.7,,41.9,
-P-10012,E-10012-01,2025-04-14T17:27:19.749207,36.2,55,113,72,99.0,19,21.0,407,,,,,1.2,,,,,391,7.2,,30.6,
-P-10012,E-10012-01,2025-04-14T18:41:17.373968,36.7,79,111,83,98.8,17,21.0,474,,256,247,,1.1,,,,,465,7.7,,30.6,
-P-10012,E-10012-01,2025-04-14T19:49:35.532714,37.2,75,112,73,96.6,15,21.0,405,,,,,1.1,,8,,,390,6.6,40,30.6,
-P-10012,E-10012-01,2025-04-14T19:19:32.490689,36.2,79,117,83,93.1,16,21.0,523,41.8,,,,1.4,,,,,520,8.5,,30.6,
-P-10012,E-10012-01,2025-04-15T01:10:14.475717,36.6,75,118,82,99.3,19,51.0,485,,484,378,0.51,1.0,8,,,,480,8.6,27,30.6,
-P-10012,E-10012-01,2025-04-15T01:37:02.293831,36.7,85,120,70,94.7,19,21.0,541,,,,,1.3,,,,,487,8.8,79,30.6,
-P-10012,E-10012-01,2025-04-15T00:34:59.015904,36.7,85,111,82,98.0,13,21.0,439,,,,,0.9,,,,,406,7.7,,30.6,
-P-10012,E-10012-01,2025-04-14T21:48:54.966390,36.3,77,122,73,97.0,12,21.0,540,41.7,,,,1.1,,,,,521,9.5,43,30.6,1
-P-10012,E-10012-01,2025-04-15T04:18:33.894015,36.1,65,132,90,96.2,18,21.0,505,43.0,,,,1.4,,7,,,475,8.9,,30.6,
-P-10012,E-10012-01,2025-04-15T01:10:02.682121,37.0,71,117,78,97.4,13,21.0,377,,,,,,,,33,,374,6.2,,30.6,
-P-10012,E-10012-01,2025-04-14T23:06:38.015205,37.1,67,112,85,98.3,16,21.0,425,,,,,1.1,,4,,,393,7.5,52,30.6,
-P-10012,E-10012-01,2025-04-15T12:36:06.624320,36.1,73,133,82,96.4,12,21.0,540,44.4,149,118,,,,,,,497,8.8,23,30.6,
-P-10012,E-10012-01,2025-04-15T04:06:26.998866,36.5,84,125,74,97.7,18,21.0,472,,,,,1.1,,,28,21,440,8.3,,30.6,
-P-10012,E-10012-01,2025-04-15T13:56:27.270137,37.1,80,128,79,97.0,18,21.0,505,,,,,1.2,,8,,,493,8.9,50,30.6,
-P-10013,E-10013-01,2025-04-15T17:27:19.749207,37.6,76,142,83,98.9,13,21.0,416,44.7,288,176,,1.4,,8,25,23,375,7.7,,30.2,
-P-10013,E-10013-01,2025-04-15T18:59:05.953405,36.5,77,123,88,99.5,14,21.0,483,,,,,,,,29,,437,9.7,50,30.2,1
-P-10013,E-10013-01,2025-04-15T20:07:48.267279,37.4,89,159,100,96.4,19,21.0,368,,,,,,,,33,32,363,6.8,38,30.2,
-P-10013,E-10013-01,2025-04-15T21:22:46.908509,37.4,66,153,94,97.6,14,21.0,352,40.4,,,,1.3,,,28,22,330,7.1,,30.2,
-P-10013,E-10013-01,2025-04-15T21:06:52.498226,37.4,112,134,96,98.1,12,21.0,484,38.4,437,,,,,7,,,463,9.7,,30.2,
-P-10013,E-10013-01,2025-04-15T21:35:07.203009,36.9,83,131,89,97.3,14,21.0,405,39.0,,,,1.1,,,,,380,8.1,32,30.2,
-P-10013,E-10013-01,2025-04-16T01:03:33.021064,36.5,80,131,83,99.0,14,21.0,517,41.6,210,,,,,,30,,468,10.4,,30.2,
-P-10013,E-10013-01,2025-04-15T22:43:00.056357,38.0,102,123,90,96.9,15,21.0,370,35.7,,,,,,,,,346,6.8,,30.2,
-P-10013,E-10013-01,2025-04-16T02:58:21.411949,37.7,91,149,92,94.8,13,21.0,367,,,,,0.8,,,32,26,335,7.4,52,30.2,
-P-10014,E-10014-01,2025-04-13T17:27:19.749207,36.7,96,136,89,97.2,14,21.0,523,38.3,,,,0.9,,6,26,26,520,7.3,,32.0,
-P-10014,E-10014-01,2025-04-13T19:25:58.214211,37.5,107,129,82,93.9,18,25.6,465,35.6,,,0.26,,10,5,,,462,6.9,,32.0,
-P-10014,E-10014-01,2025-04-13T19:38:56.455843,36.9,84,147,96,97.4,20,21.0,451,,357,89,,0.9,,,,,436,6.3,46,32.0,
-P-10014,E-10014-01,2025-04-13T20:46:48.983706,37.2,74,130,83,97.9,14,21.0,487,,253,,,,,,,,480,7.3,,32.0,1
-P-10014,E-10014-01,2025-04-13T20:48:10.933778,37.2,84,128,96,98.8,17,21.0,459,42.1,475,225,,1.4,,,,,438,6.4,59,32.0,1
-P-10014,E-10014-01,2025-04-14T01:56:41.145457,37.4,74,136,91,96.6,20,21.0,469,43.3,,,,,,8,,,448,7.0,,32.0,1
-P-10014,E-10014-01,2025-04-13T20:32:01.282023,37.0,85,134,97,98.7,18,21.0,387,38.5,,,,,,,,,352,5.8,,32.0,
-P-10014,E-10014-01,2025-04-14T02:48:27.693893,37.7,89,124,85,99.0,16,37.9,488,43.2,131,,0.38,0.8,2,,34,25,484,7.3,28,32.0,
-P-10014,E-10014-01,2025-04-14T03:38:54.310294,37.6,82,136,85,98.4,17,21.0,413,,186,168,,,,5,28,28,397,6.2,,32.0,
-P-10014,E-10014-01,2025-04-14T08:07:47.327602,37.7,89,142,83,97.5,16,21.0,410,43.0,,,,1.1,,,,,381,6.1,,32.0,1
-P-10014,E-10014-02,2025-04-13T17:27:19.749207,36.5,88,132,76,97.8,19,21.0,449,,,,,1.0,,6,34,29,408,6.3,,32.0,1
-P-10014,E-10014-02,2025-04-13T18:26:32.914303,37.3,83,132,76,97.7,14,21.0,531,,,,,1.3,,,,,508,7.4,,32.0,
-P-10014,E-10014-02,2025-04-13T20:54:22.243295,37.5,96,144,82,96.2,15,21.0,488,,,,,0.8,,5,27,27,484,6.8,,32.0,
-P-10014,E-10014-02,2025-04-13T20:59:13.693898,37.7,93,133,83,96.6,19,21.0,521,39.0,,,,,,,,,471,7.3,,32.0,
-P-10014,E-10014-02,2025-04-13T23:22:41.223775,37.0,84,135,90,96.7,16,44.7,404,41.7,377,142,0.45,,3,,26,24,390,6.0,,32.0,1
-P-10014,E-10014-02,2025-04-14T00:48:00.737952,37.1,113,136,79,96.6,17,21.0,357,43.6,334,,,1.4,,,32,,321,5.0,,32.0,
-P-10014,E-10014-02,2025-04-14T02:58:47.834628,37.1,64,146,90,96.4,20,21.0,459,37.1,,,,,,4,32,29,444,6.4,,32.0,
-P-10014,E-10014-02,2025-04-14T06:37:21.468066,36.9,85,139,82,94.6,20,21.0,536,,358,,,,,,26,20,498,7.5,,32.0,
-P-10014,E-10014-02,2025-04-14T03:57:45.125545,37.4,87,139,92,98.5,17,35.5,361,36.9,,,0.35,,6,,35,20,338,5.4,60,32.0,1
-P-10014,E-10014-02,2025-04-13T23:19:03.064552,36.9,88,133,93,98.4,20,21.0,449,,,,,1.4,,,,,449,6.3,,32.0,
-P-10014,E-10014-02,2025-04-14T07:32:33.362241,37.1,82,129,96,97.9,15,21.0,428,,343,182,,1.1,,,28,27,423,6.0,,32.0,
-P-10014,E-10014-02,2025-04-14T04:24:30.566404,37.6,100,160,102,98.8,15,21.0,374,,,,,,,,,,363,5.2,,32.0,
-P-10014,E-10014-02,2025-04-14T06:43:43.205763,36.6,101,140,91,97.7,17,21.0,363,43.6,,,,1.2,,4,33,,359,5.4,,32.0,
-P-10014,E-10014-02,2025-04-14T19:09:43.380957,37.3,91,131,91,99.3,17,21.0,408,44.4,,,,1.0,,,29,24,401,6.1,,32.0,
-P-10014,E-10014-02,2025-04-14T13:18:13.477773,36.7,80,134,97,99.3,18,27.7,501,39.0,264,173,0.28,,9,,,,493,7.5,62,32.0,
-P-10014,E-10014-03,2025-04-06T17:27:19.749207,37.7,88,137,97,96.1,20,25.1,465,,305,193,0.25,1.4,4,,,,447,6.9,,32.0,
-P-10014,E-10014-03,2025-04-06T19:09:10.079247,37.5,88,145,98,97.5,20,55.1,413,,,,0.55,1.4,7,4,26,24,395,5.8,,32.0,1
-P-10014,E-10014-03,2025-04-06T21:19:01.001388,36.9,93,164,99,96.9,15,21.0,523,37.0,152,89,,1.4,,4,,,486,7.8,,32.0,
-P-10014,E-10014-03,2025-04-06T22:06:40.543211,37.4,81,139,82,98.1,16,21.0,370,,,,,,,,25,21,338,5.5,,32.0,
-P-10014,E-10014-03,2025-04-06T20:14:29.534147,37.3,78,155,102,98.8,12,42.8,538,,,,0.43,1.4,4,,,,524,8.0,,32.0,
-P-10014,E-10014-03,2025-04-07T02:02:53.761639,38.0,78,147,82,96.6,15,21.0,399,39.3,,,,,,,,,392,6.0,,32.0,1
-P-10014,E-10014-03,2025-04-06T20:38:16.245842,37.2,99,143,88,96.2,14,21.0,480,,204,189,,1.0,,5,32,,458,7.2,,32.0,
-P-10014,E-10014-03,2025-04-07T05:31:11.513745,37.2,89,151,95,98.8,16,21.0,386,44.0,,,,1.0,,,,,377,5.4,,32.0,
-P-10014,E-10014-03,2025-04-07T01:39:32.706514,37.3,112,157,93,96.7,14,21.0,522,42.9,,,,1.4,,7,30,25,498,7.8,,32.0,
-P-10014,E-10014-03,2025-04-06T22:19:34.392479,37.2,85,154,102,96.8,14,21.0,377,39.0,130,98,,1.1,,6,31,22,371,5.6,,32.0,1
-P-10014,E-10014-03,2025-04-07T06:58:39.088062,37.3,79,133,84,93.4,13,21.0,495,,396,293,,,,,,,474,6.9,,32.0,
-P-10015,E-10015-01,2025-04-12T17:27:19.749207,37.0,108,123,86,99.0,16,21.0,385,,,,,0.9,,,,,365,7.4,,34.0,
-P-10015,E-10015-01,2025-04-12T18:17:56.441727,36.3,50,134,99,98.5,19,21.0,513,36.8,,,,,,5,30,26,496,9.1,,34.0,
-P-10015,E-10015-01,2025-04-12T19:25:15.437555,37.1,85,123,91,94.5,12,21.0,381,44.3,,,,1.3,,5,,,358,7.3,38,34.0,1
-P-10015,E-10015-01,2025-04-12T22:15:13.350725,36.5,85,126,91,97.8,12,21.0,441,36.5,217,110,,,,,,,406,8.5,,34.0,
-P-10015,E-10015-01,2025-04-12T22:58:47.595750,36.8,82,144,77,96.9,20,21.0,424,,145,92,,,,7,26,26,394,8.2,,34.0,
-P-10015,E-10015-01,2025-04-12T23:40:51.425292,37.2,74,135,92,99.2,20,21.0,432,,,,,1.3,,8,,,393,7.6,,34.0,
-P-10015,E-10015-01,2025-04-13T00:54:42.579720,36.5,69,133,89,98.4,19,21.0,442,,,,,1.3,,,,,419,7.8,,34.0,
-P-10015,E-10015-01,2025-04-13T04:32:20.179355,36.9,69,147,90,97.9,13,55.8,546,40.7,149,106,0.56,,6,5,33,33,541,10.5,,34.0,
-P-10015,E-10015-01,2025-04-13T07:04:07.356907,37.0,78,126,93,98.8,19,21.0,411,,,,,0.9,,4,,,392,7.9,,34.0,
-P-10015,E-10015-01,2025-04-13T01:18:29.838518,36.4,72,138,95,92.7,13,59.7,456,,460,385,0.6,,7,,,,441,8.1,,34.0,
-P-10015,E-10015-01,2025-04-13T12:52:05.019989,36.8,84,137,89,96.3,14,21.0,408,,,,,,,,,,370,7.8,,34.0,
-P-10015,E-10015-01,2025-04-13T01:32:02.492109,36.3,74,137,97,96.7,18,21.0,479,,231,,,1.5,,4,,,438,9.2,,34.0,
-P-10015,E-10015-01,2025-04-13T14:55:19.821770,36.0,78,127,87,97.3,19,21.0,511,40.9,222,155,,,,5,,,492,9.0,,34.0,
-P-10015,E-10015-01,2025-04-13T00:28:38.371851,36.2,82,151,103,99.1,16,21.0,426,,,,,,,6,30,26,422,7.5,,34.0,
-P-10015,E-10015-01,2025-04-13T17:14:28.707103,36.3,48,143,100,97.5,15,30.8,462,,234,225,0.31,,6,,,,417,8.9,36,34.0,
-P-10015,E-10015-02,2025-04-11T17:27:19.749207,36.4,83,125,90,99.1,19,21.0,521,41.2,311,143,,,,7,35,,473,9.2,,34.0,1
-P-10015,E-10015-02,2025-04-11T19:16:59.953815,37.1,74,143,79,96.9,12,21.0,451,,253,171,,,,4,26,,427,8.0,,34.0,
-P-10015,E-10015-02,2025-04-11T19:55:47.931018,36.1,65,138,91,98.6,14,21.0,472,37.4,,,,,,5,,,461,8.4,,34.0,1
-P-10015,E-10015-02,2025-04-11T20:22:50.385396,36.4,103,132,77,96.7,14,21.0,523,37.3,101,88,,1.3,,,25,25,502,10.1,,34.0,
-P-10015,E-10015-02,2025-04-11T19:47:19.972733,36.4,94,142,87,98.5,16,21.0,478,41.1,,,,,,,,,448,9.2,,34.0,
-P-10015,E-10015-02,2025-04-11T22:24:48.434931,37.0,80,138,95,98.2,20,21.0,380,41.3,,,,,,,,,347,6.7,,34.0,
-P-10015,E-10015-02,2025-04-12T04:41:35.454831,36.5,74,134,87,97.1,13,21.0,421,,,,,,,8,30,25,418,8.1,51,34.0,
-P-10015,E-10015-02,2025-04-11T23:22:55.362584,37.0,73,130,80,99.0,12,21.0,354,39.2,,,,1.4,,4,27,22,337,6.3,,34.0,1
-P-10015,E-10015-02,2025-04-12T05:15:56.878496,37.2,97,133,85,96.2,14,21.0,471,40.7,,,,1.2,,,34,25,430,9.1,,34.0,
-P-10015,E-10015-02,2025-04-11T22:02:28.752946,36.2,84,138,83,96.9,16,21.0,538,,,,,,,8,27,22,533,10.3,,34.0,
-P-10015,E-10015-02,2025-04-12T02:10:03.481920,37.3,69,162,103,97.3,16,21.0,417,,,,,1.2,,,,,404,7.4,,34.0,1
-P-10016,E-10016-01,2025-04-15T17:27:19.750190,37.0,45,115,79,96.9,19,21.0,466,,135,,,1.1,,7,,,426,9.3,39,24.5,1
-P-10016,E-10016-01,2025-04-15T18:22:22.279233,36.4,68,110,73,99.3,19,21.0,476,,472,231,,,,,,,447,8.7,49,24.5,1
-P-10016,E-10016-01,2025-04-15T20:07:35.370341,37.1,73,119,78,99.0,12,21.0,355,38.5,,,,0.8,,,,,353,6.5,,24.5,
-P-10016,E-10016-01,2025-04-15T19:37:29.431495,36.6,67,113,75,97.6,14,21.0,377,,,,,,,4,,,372,7.5,57,24.5,
-P-10016,E-10016-01,2025-04-15T21:53:50.285307,37.1,69,111,81,98.8,20,21.0,450,,,,,,,8,29,20,443,8.2,,24.5,1
-P-10016,E-10016-01,2025-04-16T00:13:21.030228,37.2,77,124,72,97.8,16,21.0,545,,,,,1.5,,,,,526,9.9,,24.5,1
-P-10016,E-10016-01,2025-04-15T22:20:26.629572,36.1,72,120,78,97.5,13,44.3,397,36.5,,,0.44,,6,,34,30,361,7.9,44,24.5,1
-P-10016,E-10016-01,2025-04-16T01:07:27.235805,36.9,102,116,70,96.2,16,21.0,480,35.7,199,102,,1.3,,5,30,,478,8.8,,24.5,
-P-10016,E-10016-01,2025-04-15T22:48:09.977800,37.1,70,140,81,91.9,14,21.0,409,38.5,,,,,,,27,23,380,8.1,,24.5,
-P-10016,E-10016-01,2025-04-16T08:54:28.627214,36.7,85,120,72,96.8,20,21.0,407,37.4,,,,,,6,31,,373,8.1,48,24.5,
-P-10016,E-10016-01,2025-04-16T00:32:05.114928,36.9,77,141,91,98.9,13,40.5,510,39.3,,,0.41,1.2,9,8,,,492,10.1,,24.5,
-P-10016,E-10016-01,2025-04-16T05:36:48.157303,36.7,80,121,79,97.8,20,21.0,407,,,,,1.3,,,32,,367,8.1,,24.5,
-P-10016,E-10016-02,2025-04-16T17:27:19.750190,36.8,71,114,76,98.7,14,45.7,532,36.8,,,0.46,1.5,2,7,31,,489,10.6,21,24.5,
-P-10016,E-10016-02,2025-04-16T18:14:53.996825,36.3,76,112,76,96.3,12,21.0,367,,291,235,,,,,,,348,7.3,48,24.5,
-P-10016,E-10016-02,2025-04-16T21:18:15.388436,36.1,79,122,75,97.4,13,21.0,453,38.3,393,306,,1.4,,,,,427,8.3,33,24.5,1
-P-10016,E-10016-02,2025-04-16T20:57:22.580803,36.8,70,122,77,99.2,12,21.0,371,,483,193,,1.0,,6,,,353,7.4,22,24.5,1
-P-10016,E-10016-02,2025-04-16T20:50:42.325469,36.4,76,134,92,97.3,19,21.0,371,,,,,,,7,,,367,7.4,37,24.5,1
-P-10016,E-10016-02,2025-04-17T00:31:08.635473,36.0,52,122,70,98.6,17,21.0,542,,134,132,,,,5,35,25,505,9.9,,24.5,1
-P-10017,E-10017-01,2025-04-13T17:27:19.750190,37.2,94,130,90,96.0,18,21.0,363,,140,110,,1.4,,,,,332,5.3,,16.7,
-P-10017,E-10017-01,2025-04-13T17:59:00.236870,36.7,64,134,83,92.7,16,21.0,449,,,,,1.2,,8,,,409,6.5,,16.7,1
-P-10017,E-10017-01,2025-04-13T19:16:38.414170,37.1,112,149,80,98.8,14,21.0,351,,,,,,,,,,333,4.8,,16.7,
-P-10017,E-10017-01,2025-04-13T21:35:16.521403,37.1,88,146,93,97.7,21,21.0,528,40.3,,,,,,6,30,,494,7.2,70,16.7,1
-P-10017,E-10017-01,2025-04-14T00:47:35.121170,37.1,89,138,78,98.7,16,26.8,396,38.6,,,0.27,,4,,27,,393,5.8,,16.7,
-P-10017,E-10017-02,2025-04-15T17:27:19.750190,36.3,100,128,94,96.1,15,42.8,436,38.9,,,0.43,1.4,10,,25,21,393,6.0,,16.7,
-P-10017,E-10017-02,2025-04-15T19:12:12.436817,36.8,87,130,87,99.1,17,21.0,372,38.2,,,,1.2,,4,,,365,5.4,75,16.7,1
-P-10017,E-10017-02,2025-04-15T19:50:44.822517,36.8,84,135,85,96.7,12,58.6,493,,,,0.59,1.3,10,8,,,464,7.2,,16.7,1
-P-10017,E-10017-02,2025-04-15T20:29:30.443754,36.9,85,153,92,96.2,13,21.0,464,,164,126,,,,6,31,,445,6.3,,16.7,1
-P-10017,E-10017-02,2025-04-16T01:25:00.868633,36.3,89,138,95,97.5,20,21.0,408,35.8,,,,1.4,,7,25,25,399,5.9,73,16.7,
-P-10017,E-10017-02,2025-04-16T02:39:10.157545,36.3,90,138,83,98.5,13,21.0,365,39.9,,,,,,,32,30,340,5.3,,16.7,
-P-10017,E-10017-02,2025-04-16T02:44:06.183544,36.1,85,150,89,97.9,17,21.0,368,,406,263,,1.3,,,,,334,5.0,,16.7,
-P-10018,E-10018-01,2025-04-16T17:27:19.750190,36.0,58,137,75,92.3,20,21.0,518,40.5,,,,,,5,,,478,7.1,63,17.2,
-P-10018,E-10018-01,2025-04-16T19:06:49.929686,36.3,85,131,86,97.3,14,21.0,449,,,,,0.8,,8,25,22,414,6.1,,17.2,
-P-10018,E-10018-01,2025-04-16T21:02:52.395807,36.5,91,141,90,99.4,13,21.0,549,,,,,1.3,,,,,534,7.5,,17.2,
-P-10018,E-10018-01,2025-04-16T20:44:29.478544,36.6,78,138,89,97.3,18,21.0,482,38.8,183,173,,1.4,,6,,,440,7.0,,17.2,
-P-10018,E-10018-01,2025-04-16T23:33:01.654979,37.1,81,131,80,96.3,18,21.0,492,,308,302,,1.4,,,28,,443,7.1,,17.2,
-P-10018,E-10018-01,2025-04-16T20:44:55.945217,36.6,79,144,97,98.2,15,21.0,405,,169,158,,,,,33,29,382,5.5,73,17.2,
-P-10018,E-10018-01,2025-04-17T02:37:42.152990,36.1,95,137,92,98.7,20,21.0,443,,,,,,,,,,434,6.0,37,17.2,
-P-10018,E-10018-01,2025-04-17T04:55:48.537240,36.5,88,133,95,97.5,20,21.0,367,41.0,,,,,,,,,334,5.3,68,17.2,1
-P-10018,E-10018-01,2025-04-16T22:24:11.256383,36.2,94,127,82,98.4,17,21.0,451,,,,,,,6,,,440,6.6,,17.2,
-P-10018,E-10018-01,2025-04-17T09:25:45.988371,36.5,73,146,83,98.7,14,21.0,487,,492,405,,1.1,,5,30,30,444,6.6,73,17.2,
-P-10018,E-10018-02,2025-04-12T17:27:19.750190,36.7,88,136,84,96.8,13,21.0,526,37.6,299,180,,,,,,,473,7.2,,17.2,1
-P-10018,E-10018-02,2025-04-12T18:57:35.569213,37.0,82,148,89,99.4,20,49.6,521,,,,0.5,1.2,3,,,,488,7.6,,17.2,1
-P-10018,E-10018-02,2025-04-12T20:54:54.302933,36.8,58,135,88,94.1,20,21.0,449,40.6,470,,,1.0,,7,,,434,6.1,,17.2,1
-P-10018,E-10018-02,2025-04-12T22:51:30.030655,36.2,92,138,91,97.0,14,21.0,487,42.9,,,,0.9,,7,,,444,6.6,,17.2,
-P-10018,E-10018-02,2025-04-13T00:37:34.853349,36.8,69,143,92,97.2,15,50.2,377,,,,0.5,,3,5,33,,349,5.1,,17.2,1
-P-10018,E-10018-02,2025-04-12T21:29:49.574771,37.1,108,150,84,98.2,13,24.1,536,40.2,348,168,0.24,1.2,6,,33,,520,7.3,,17.2,
-P-10018,E-10018-02,2025-04-13T04:37:02.898349,37.0,95,146,79,98.7,16,21.0,544,,,,,,,,,,532,7.4,,17.2,
-P-10018,E-10018-03,2025-04-11T17:27:19.750190,36.1,64,137,103,97.8,19,33.9,396,,,,0.34,,3,,,,367,5.4,,17.2,
-P-10018,E-10018-03,2025-04-11T18:48:01.814405,37.0,81,125,89,97.4,14,21.0,403,42.5,,,,1.4,,6,34,30,399,5.9,33,17.2,1
-P-10018,E-10018-03,2025-04-11T19:30:00.098602,36.5,82,146,87,98.2,19,21.0,378,,,,,1.1,,5,30,24,364,5.2,,17.2,
-P-10018,E-10018-03,2025-04-11T20:57:43.824857,36.5,83,146,84,97.4,12,21.0,374,,,,,1.3,,,35,35,341,5.4,,17.2,
-P-10018,E-10018-03,2025-04-11T21:30:19.927411,36.7,74,138,85,97.8,13,21.0,351,,,,,0.9,,,,,326,4.8,,17.2,
-P-10018,E-10018-03,2025-04-12T02:43:58.199012,36.1,111,132,82,96.9,13,21.0,437,,,,,1.3,,,,,404,6.0,,17.2,
-P-10018,E-10018-03,2025-04-12T01:44:37.818316,36.8,72,132,89,99.2,20,21.0,472,,351,149,,1.4,,,,,443,6.9,,17.2,
-P-10018,E-10018-03,2025-04-12T03:12:40.101296,36.2,88,138,91,96.6,13,21.0,457,40.6,,,,0.9,,7,33,31,457,6.6,41,17.2,
-P-10018,E-10018-03,2025-04-12T02:42:11.499545,36.5,100,150,85,99.4,19,21.0,439,,,,,1.4,,6,,,411,6.0,,17.2,
-P-10018,E-10018-03,2025-04-12T06:03:54.778240,36.6,73,131,92,96.6,23,21.0,490,,375,269,,,,,,,467,7.1,,17.2,
-P-10018,E-10018-03,2025-04-12T11:32:49.977191,36.6,91,147,100,99.4,13,21.0,450,37.2,,,,0.8,,8,34,20,421,6.5,44,17.2,
-P-10018,E-10018-03,2025-04-12T11:59:28.532971,37.2,79,127,84,96.8,13,42.3,416,36.8,152,121,0.42,,8,,32,26,400,6.0,,17.2,
-P-10018,E-10018-03,2025-04-12T10:16:57.509157,36.1,97,143,79,98.4,19,42.7,387,44.1,,,0.43,1.0,10,4,,,360,5.3,,17.2,
-P-10019,E-10019-01,2025-04-13T17:27:19.750190,37.1,72,149,91,97.7,12,21.0,376,44.5,469,,,1.4,,,,,339,5.5,,20.7,1
-P-10019,E-10019-01,2025-04-13T18:53:23.312759,36.9,55,137,86,98.3,17,21.0,395,,208,183,,,,7,30,25,369,5.8,,20.7,
-P-10019,E-10019-01,2025-04-13T19:39:18.811491,36.4,77,124,88,99.3,20,21.0,422,,,,,,,,,,398,5.8,70,20.7,
-P-10019,E-10019-01,2025-04-13T19:06:33.698904,36.8,66,135,89,97.9,14,21.0,537,42.7,,,,0.9,,,29,29,506,7.4,,20.7,
-P-10019,E-10019-01,2025-04-13T22:50:26.736911,36.8,71,124,90,98.8,13,21.0,400,37.5,417,311,,,,7,26,,368,5.5,,20.7,
-P-10019,E-10019-01,2025-04-13T21:57:36.274622,36.7,53,135,77,96.2,12,21.0,400,44.0,,,,,,,,,380,5.5,28,20.7,
-P-10019,E-10019-01,2025-04-14T01:22:13.372445,36.2,80,137,83,97.9,13,21.0,445,,,,,,,,,,413,6.1,,20.7,
-P-10019,E-10019-01,2025-04-14T00:44:48.040465,36.8,65,148,90,96.8,15,21.0,384,37.5,,,,,,,,,380,5.6,,20.7,
-P-10019,E-10019-01,2025-04-14T02:47:12.370980,36.9,72,142,97,98.6,19,21.0,535,,,,,1.4,,,,,532,7.4,29,20.7,1
-P-10019,E-10019-01,2025-04-14T02:52:54.244928,36.8,82,128,90,96.1,15,21.0,370,37.9,,,,0.9,,,,,347,5.1,,20.7,
-P-10019,E-10019-01,2025-04-14T09:06:08.028122,36.8,76,132,95,98.9,12,21.0,539,,278,,,1.2,,8,,,520,7.9,,20.7,
-P-10019,E-10019-01,2025-04-13T23:10:36.831236,36.9,70,137,80,94.6,19,21.0,397,40.2,,,,,,,29,,397,5.5,,20.7,
-P-10019,E-10019-01,2025-04-14T06:39:11.806655,37.5,72,142,89,97.4,16,21.0,537,41.4,,,,0.9,,8,,,517,7.9,,20.7,
-P-10019,E-10019-01,2025-04-14T08:00:34.113118,36.5,82,132,97,97.7,14,35.7,505,,334,216,0.36,,6,,,,477,7.0,,20.7,
-P-10019,E-10019-01,2025-04-14T20:24:23.053607,36.8,75,153,96,96.5,16,21.0,452,40.5,277,112,,1.0,,,,,445,6.2,60,20.7,
-P-10020,E-10020-01,2025-04-15T17:27:19.750190,36.3,47,128,86,96.9,19,21.0,516,,347,,,1.0,,,29,,499,8.2,,33.8,
-P-10020,E-10020-01,2025-04-15T18:23:22.609006,36.3,70,120,79,98.5,20,37.3,400,39.2,,,0.37,0.9,9,,26,25,369,6.8,,33.8,
-P-10020,E-10020-01,2025-04-15T19:23:41.995775,36.9,78,116,80,97.7,17,21.0,385,,110,101,,,,4,33,,374,6.6,51,33.8,1
-P-10020,E-10020-01,2025-04-15T20:43:04.388126,36.2,80,140,88,98.1,19,21.0,506,,,,,,,,26,21,492,8.0,,33.8,
-P-10020,E-10020-01,2025-04-15T22:57:23.499681,36.6,77,118,72,99.0,19,21.0,362,,,,,1.1,,,,,332,6.2,,33.8,
-P-10020,E-10020-01,2025-04-15T22:24:57.781352,36.5,71,136,82,98.4,18,21.0,432,35.4,,,,1.0,,6,,,416,7.4,,33.8,
-P-10020,E-10020-01,2025-04-16T04:38:31.209774,36.3,67,115,80,93.3,17,21.0,549,,,,,0.8,,4,,,494,8.7,,33.8,
-P-10020,E-10020-02,2025-04-07T17:27:19.750190,36.1,107,124,80,98.7,19,46.3,509,43.3,321,209,0.46,0.9,10,,,,473,8.1,,33.8,
-P-10020,E-10020-02,2025-04-07T18:02:19.821299,36.4,78,113,82,97.7,12,21.0,446,,323,,,1.1,,,28,,411,7.6,,33.8,
-P-10020,E-10020-02,2025-04-07T19:11:47.946886,36.9,67,122,81,94.5,15,41.9,381,,,,0.42,,2,,33,29,365,6.5,,33.8,
-P-10020,E-10020-02,2025-04-07T21:14:15.954584,36.7,104,110,82,96.1,20,21.0,462,,,,,1.1,,6,,,441,7.3,,33.8,
-P-10020,E-10020-02,2025-04-07T23:57:13.953946,36.3,85,123,84,96.8,14,21.0,450,,247,218,,0.8,,7,,,422,7.1,27,33.8,
-P-10020,E-10020-02,2025-04-07T22:04:50.758523,36.2,78,118,71,96.5,20,21.0,351,,385,233,,0.9,,,,,342,6.0,57,33.8,
-P-10020,E-10020-02,2025-04-08T02:58:23.167947,37.4,80,132,86,96.5,20,21.0,432,38.4,182,150,,1.3,,,29,25,398,6.9,,33.8,
-P-10020,E-10020-02,2025-04-08T04:22:06.679032,37.4,69,123,77,97.5,12,21.0,413,44.3,,,,1.3,,,,,398,6.6,,33.8,1
-P-10020,E-10020-02,2025-04-08T07:53:21.430617,36.7,68,125,78,99.3,14,21.0,404,35.0,,,,1.3,,,30,27,401,6.9,20,33.8,
-P-10020,E-10020-02,2025-04-07T23:55:08.294885,36.6,78,115,84,98.6,12,21.0,460,44.4,,,,,,7,25,24,423,7.3,,33.8,
-P-10020,E-10020-03,2025-04-14T17:27:19.750190,37.2,67,113,70,98.4,15,21.0,478,43.5,166,122,,,,,,,441,8.2,77,33.8,
-P-10020,E-10020-03,2025-04-14T19:16:37.541635,36.7,80,122,81,99.1,15,21.0,533,,,,,1.5,,4,34,30,505,8.5,,33.8,
-P-10020,E-10020-03,2025-04-14T19:12:31.026449,36.5,67,138,81,99.2,14,29.3,365,35.2,392,360,0.29,,6,4,33,28,353,5.8,23,33.8,1
-P-10020,E-10020-03,2025-04-14T21:17:30.183289,36.6,74,116,79,96.6,12,21.0,541,,,,,1.0,,,,,494,9.2,42,33.8,
-P-10020,E-10020-03,2025-04-15T00:07:16.469530,36.8,66,113,76,98.2,16,21.0,372,,,,,1.4,,7,,,344,5.9,,33.8,1
-P-10020,E-10020-03,2025-04-15T03:09:20.028347,36.9,74,123,75,98.5,19,55.4,412,39.8,,,0.55,,7,,,,371,6.5,57,33.8,
-P-10020,E-10020-03,2025-04-15T01:39:59.525793,37.5,80,114,82,95.9,18,58.7,442,,,,0.59,1.2,3,,33,32,407,7.6,,33.8,
-P-10020,E-10020-03,2025-04-14T23:48:06.887355,37.1,108,141,83,98.3,16,21.0,463,,,,,1.2,,5,,,453,7.3,,33.8,1
-P-10020,E-10020-03,2025-04-15T00:48:56.360422,37.1,72,120,76,98.4,14,21.0,447,42.3,329,275,,,,,,,424,7.6,,33.8,
-P-10020,E-10020-03,2025-04-15T09:46:42.901826,36.4,84,113,79,99.3,20,21.0,387,40.4,,,,1.2,,5,,,358,6.1,,33.8,
-P-10020,E-10020-03,2025-04-15T11:37:59.185573,36.4,78,120,73,98.2,18,21.0,488,44.4,,,,,,,,,485,7.7,,33.8,
-P-10020,E-10020-03,2025-04-15T04:32:20.452829,36.6,69,113,75,97.4,20,34.8,485,35.7,424,127,0.35,,5,4,,,482,8.3,,33.8,
-P-10020,E-10020-03,2025-04-15T12:01:24.882129,36.1,66,115,79,99.1,18,40.6,508,,,,0.41,,7,4,,,495,8.1,,33.8,
-P-10021,E-10021-01,2025-04-15T17:27:19.751196,37.2,65,136,88,99.5,19,21.0,470,38.7,217,90,,1.5,,4,26,24,448,9.3,,32.9,1
-P-10021,E-10021-01,2025-04-15T18:55:34.030933,37.2,108,126,82,96.2,12,21.0,508,44.4,301,,,1.3,,,,,463,10.1,56,32.9,
-P-10021,E-10021-01,2025-04-15T20:16:08.728405,37.8,78,137,91,95.0,17,36.8,506,,187,124,0.37,1.3,8,,,,493,11.1,,32.9,
-P-10021,E-10021-01,2025-04-15T22:55:40.041013,36.8,74,133,92,98.4,15,21.0,376,40.2,,,,1.0,,,,,374,8.2,,32.9,
-P-10021,E-10021-01,2025-04-16T01:02:50.280751,36.7,76,128,98,94.2,15,21.0,539,,,,,1.1,,,27,,501,10.7,,32.9,
-P-10021,E-10021-01,2025-04-16T00:47:09.623773,37.5,100,150,93,98.4,16,21.0,380,44.3,372,370,,,,6,25,22,361,8.3,61,32.9,
-P-10021,E-10021-01,2025-04-16T00:28:37.190415,37.6,98,131,86,96.0,19,46.3,477,41.4,252,134,0.46,,2,,31,,452,9.5,,32.9,
-P-10021,E-10021-01,2025-04-16T04:11:56.127420,37.4,57,134,89,98.3,20,21.0,460,36.4,375,145,,,,8,26,,434,9.2,,32.9,
-P-10021,E-10021-01,2025-04-16T05:15:37.811481,37.2,80,139,95,98.4,16,21.0,362,38.3,,,,,,,,,352,7.9,,32.9,
-P-10021,E-10021-01,2025-04-15T22:34:43.219258,37.6,108,142,97,96.1,20,21.0,508,36.5,,,,,,5,,,506,11.1,,32.9,
-P-10021,E-10021-01,2025-04-16T07:50:51.980472,37.9,83,127,80,96.6,15,34.1,376,,,,0.34,1.2,8,,,,355,7.5,57,32.9,1
-P-10021,E-10021-02,2025-04-07T17:27:19.751196,38.1,103,137,84,97.8,13,21.0,423,35.0,,,,1.1,,4,27,25,409,8.4,,32.9,
-P-10021,E-10021-02,2025-04-07T18:19:54.402507,37.0,97,124,93,96.5,19,21.0,386,42.7,,,,1.4,,,,,359,7.7,,32.9,1
-P-10021,E-10021-02,2025-04-07T21:02:26.689271,36.8,58,134,83,96.7,13,21.0,547,42.6,,,,,,,29,26,540,12.0,,32.9,
-P-10021,E-10021-02,2025-04-07T20:45:17.584472,36.5,91,131,81,96.2,14,21.0,473,,,,,1.0,,7,28,27,446,9.4,,32.9,
-P-10021,E-10021-02,2025-04-07T20:59:36.247564,37.5,90,131,86,94.7,19,21.0,496,,485,431,,1.5,,4,29,,496,10.8,,32.9,1
-P-10021,E-10021-02,2025-04-07T23:48:26.636261,36.6,88,141,90,97.5,17,21.0,457,,,,,0.9,,,,,430,9.1,53,32.9,1
-P-10021,E-10021-02,2025-04-07T21:35:01.167699,36.8,91,134,85,98.5,16,21.0,429,37.5,,,,0.9,,,,,416,9.4,,32.9,1
-P-10021,E-10021-02,2025-04-07T22:42:54.170048,37.2,85,133,86,98.3,16,21.0,518,40.6,,,,,,5,,,482,11.3,54,32.9,
-P-10021,E-10021-02,2025-04-08T01:43:44.169025,37.6,85,132,84,97.2,18,21.0,382,42.7,,,,0.9,,,,,374,7.6,,32.9,
-P-10021,E-10021-02,2025-04-08T03:42:05.607220,37.3,81,148,79,97.0,19,21.0,461,,,,,1.1,,5,34,,433,9.2,,32.9,
-P-10021,E-10021-02,2025-04-07T23:17:23.636900,37.3,100,135,96,97.4,19,21.0,418,41.0,336,314,,,,,,,390,8.3,20,32.9,
-P-10021,E-10021-02,2025-04-08T08:15:07.470707,37.3,84,139,97,98.0,15,21.0,499,,,,,1.3,,,,,493,10.9,,32.9,
-P-10021,E-10021-02,2025-04-08T15:53:42.849709,37.4,80,128,96,97.4,20,24.7,358,39.5,421,,0.25,,9,5,26,22,334,7.8,72,32.9,
-P-10021,E-10021-02,2025-04-08T18:08:57.849231,37.6,77,152,91,98.1,18,21.0,514,41.7,,,,,,4,,,482,10.2,31,32.9,
-P-10022,E-10022-01,2025-04-12T17:27:19.751196,36.5,65,120,86,98.6,14,21.0,537,42.2,,,,1.0,,4,,,521,9.2,,34.9,
-P-10022,E-10022-01,2025-04-12T18:20:10.716718,37.1,94,138,97,98.3,13,21.0,401,,,,,1.2,,6,34,22,395,6.4,,34.9,1
-P-10022,E-10022-01,2025-04-12T19:04:06.291992,36.3,58,140,93,98.4,14,21.0,550,,,,,,,6,31,31,504,9.4,,34.9,
-P-10022,E-10022-01,2025-04-12T22:38:14.472483,36.7,68,135,84,96.3,13,21.0,453,39.9,392,338,,1.4,,,34,34,411,7.2,61,34.9,
-P-10022,E-10022-01,2025-04-13T00:02:30.694196,37.0,69,133,90,97.8,16,21.0,543,44.7,,,,,,7,32,32,523,9.3,,34.9,
-P-10022,E-10022-01,2025-04-12T22:22:40.554211,36.1,72,146,83,96.2,18,21.0,412,38.3,,,,,,8,,,412,7.1,,34.9,1
-P-10023,E-10023-01,2025-04-12T17:27:19.751196,36.6,73,124,84,92.2,19,28.2,504,40.3,493,300,0.28,1.1,2,6,26,26,464,9.8,,21.2,1
-P-10023,E-10023-01,2025-04-12T19:26:25.835639,36.6,48,126,78,98.7,16,21.0,359,37.2,158,114,,,,5,,,356,7.0,,21.2,
-P-10023,E-10023-01,2025-04-12T21:11:17.028126,36.5,65,124,79,97.2,12,21.0,424,,,,,1.4,,,29,20,414,8.3,,21.2,1
-P-10023,E-10023-01,2025-04-12T21:40:41.400407,36.0,84,125,85,99.0,19,21.0,517,,,,,1.4,,,32,23,473,10.1,,21.2,1
-P-10023,E-10023-01,2025-04-12T20:05:39.961568,36.5,77,136,83,96.3,20,21.0,535,,,,,,,4,33,,518,11.5,75,21.2,
-P-10023,E-10023-01,2025-04-12T20:50:00.696754,37.1,82,111,75,96.4,20,21.0,433,40.0,,,,1.4,,5,35,34,401,9.3,38,21.2,
-P-10024,E-10024-01,2025-04-13T17:27:19.751196,36.5,74,137,91,97.3,17,38.1,485,,,,0.38,1.0,3,,28,,447,8.9,,25.7,
-P-10024,E-10024-01,2025-04-13T19:23:24.994585,36.8,96,131,89,94.4,19,21.0,402,35.7,238,94,,1.0,,8,26,,376,6.8,,25.7,
-P-10024,E-10024-01,2025-04-13T20:03:08.170544,36.2,65,128,85,96.2,17,21.0,474,,,,,,,,29,21,455,8.0,,25.7,
-P-10024,E-10024-01,2025-04-13T21:13:29.204422,36.3,85,133,87,98.7,12,21.0,372,41.9,,,,,,,,,363,6.3,,25.7,1
-P-10024,E-10024-01,2025-04-13T22:36:52.142433,36.7,65,141,81,98.4,12,21.0,484,,299,153,,0.8,,,,,480,8.2,,25.7,
-P-10024,E-10024-01,2025-04-14T01:33:53.146956,37.2,77,142,94,98.2,15,21.0,526,,,,,,,,,,522,8.9,,25.7,
-P-10024,E-10024-01,2025-04-13T21:13:04.670941,37.0,53,135,92,97.0,16,21.0,374,,,,,1.0,,4,30,30,358,6.3,,25.7,
-P-10024,E-10024-01,2025-04-14T03:31:16.693393,37.1,82,127,92,97.3,15,21.0,538,44.0,,,,1.3,,,,,486,9.9,,25.7,1
-P-10024,E-10024-01,2025-04-14T05:41:30.557298,37.1,83,161,94,96.9,17,37.6,388,40.1,222,213,0.38,1.5,3,5,,,378,6.6,,25.7,
-P-10024,E-10024-01,2025-04-14T08:16:47.356752,36.9,66,153,83,99.0,15,21.0,484,,153,96,,1.1,,,,,462,8.9,79,25.7,1
-P-10024,E-10024-01,2025-04-14T00:49:49.184595,36.6,80,131,92,96.4,13,21.0,457,40.6,,,,,,8,,,442,8.4,,25.7,
-P-10024,E-10024-02,2025-04-16T17:27:19.751196,36.4,90,136,89,97.7,22,21.0,403,42.8,,,,0.9,,6,,,368,7.4,,25.7,
-P-10024,E-10024-02,2025-04-16T18:32:01.858225,36.8,78,140,89,98.0,19,21.0,429,,,,,1.1,,,,,399,7.9,,25.7,
-P-10024,E-10024-02,2025-04-16T21:23:00.877940,37.1,77,131,77,98.4,19,21.0,490,,497,280,,1.3,,6,35,20,454,8.3,,25.7,
-P-10024,E-10024-02,2025-04-16T21:57:29.037218,37.1,82,136,96,97.6,14,21.0,514,,,,,,,,,,473,9.4,,25.7,1
-P-10024,E-10024-02,2025-04-16T23:00:32.123355,36.3,112,124,76,99.5,17,21.0,392,39.4,,,,,,,34,30,355,7.2,,25.7,
-P-10024,E-10024-02,2025-04-17T01:24:58.593021,36.6,64,134,84,96.2,13,21.0,500,,,,,0.9,,,33,29,474,8.5,,25.7,
-P-10024,E-10024-02,2025-04-16T22:44:09.955515,37.1,84,134,94,98.1,18,21.0,390,37.3,,,,1.2,,6,,,368,6.6,69,25.7,
-P-10024,E-10024-02,2025-04-16T23:05:53.674590,36.1,83,126,88,99.3,12,21.0,446,43.9,,,,0.8,,,33,31,432,8.2,,25.7,
-P-10024,E-10024-02,2025-04-17T03:56:52.432679,36.4,81,145,88,92.5,18,21.0,367,41.2,,,,1.0,,,30,,333,6.2,,25.7,1
-P-10024,E-10024-02,2025-04-17T00:15:05.321208,36.8,79,136,80,99.3,19,21.0,374,42.8,,,,1.0,,,,,361,6.3,42,25.7,
-P-10024,E-10024-02,2025-04-17T00:48:20.519453,36.5,104,154,96,96.5,15,26.1,447,37.9,,,0.26,,4,,,,414,7.6,66,25.7,
-P-10024,E-10024-02,2025-04-17T08:35:48.975521,36.4,73,136,77,96.3,16,21.0,518,41.8,,,,1.2,,6,30,28,471,9.5,,25.7,
-P-10024,E-10024-02,2025-04-17T14:59:50.435543,37.7,85,132,91,99.2,19,21.0,432,,,,,0.9,,,,,406,7.3,,25.7,
-P-10024,E-10024-03,2025-04-11T17:27:19.751196,36.8,71,139,94,98.2,19,21.0,477,,,,,,,,,,475,8.1,,25.7,
-P-10024,E-10024-03,2025-04-11T18:45:00.791271,36.9,76,162,89,92.4,12,24.0,439,,339,155,0.24,1.0,7,,28,22,433,8.0,,25.7,
-P-10024,E-10024-03,2025-04-11T19:25:50.082980,36.5,80,133,85,96.6,18,21.0,396,,,,,,,7,29,26,356,6.7,,25.7,
-P-10024,E-10024-03,2025-04-11T22:35:43.487975,36.7,70,158,103,97.4,18,21.0,418,,,,,1.2,,,,,388,7.1,,25.7,
-P-10024,E-10024-03,2025-04-11T21:26:22.359458,36.7,78,131,93,99.4,13,21.0,409,,205,94,,1.0,,6,26,23,371,6.9,,25.7,1
-P-10024,E-10024-03,2025-04-11T23:04:00.434198,36.8,78,134,84,98.7,16,47.9,430,38.4,,,0.48,,9,,25,24,414,7.9,,25.7,
-P-10025,E-10025-01,2025-04-15T17:27:19.751196,37.6,88,129,87,96.1,20,21.0,525,,432,362,,0.8,,,,,521,8.7,,31.6,
-P-10025,E-10025-01,2025-04-15T19:20:25.232062,36.4,82,131,90,99.5,15,21.0,540,,,,,,,,35,25,530,8.9,,31.6,
-P-10025,E-10025-01,2025-04-15T19:41:06.619047,37.4,82,135,93,97.0,14,40.7,506,35.6,346,144,0.41,1.1,6,,33,27,489,8.4,,31.6,
-P-10025,E-10025-01,2025-04-15T23:13:40.169488,37.9,78,125,93,96.3,15,21.0,398,,,,,,,6,,,366,6.6,,31.6,1
-P-10025,E-10025-01,2025-04-15T20:57:33.833596,37.6,52,132,88,96.0,16,21.0,508,39.4,402,143,,,,,28,20,473,8.4,,31.6,
-P-10025,E-10025-01,2025-04-16T02:20:56.709700,37.3,81,127,92,97.4,20,21.0,358,42.9,,,,1.1,,,34,26,327,6.4,,31.6,1
-P-10025,E-10025-01,2025-04-15T21:25:57.089457,37.1,91,155,87,97.2,20,21.0,372,,,,,1.3,,,30,22,354,6.6,,31.6,
-P-10025,E-10025-01,2025-04-15T22:56:52.953007,38.0,85,132,75,96.8,18,21.0,458,,,,,0.9,,,29,25,414,8.2,,31.6,1
-P-10025,E-10025-01,2025-04-16T08:26:53.986804,37.3,86,149,96,96.8,12,21.0,368,35.3,,,,1.4,,7,,,338,6.6,,31.6,
-P-10025,E-10025-01,2025-04-16T09:04:51.965007,37.4,95,145,98,93.2,15,43.5,475,36.7,,,0.43,1.1,2,,34,32,466,8.5,,31.6,
-P-10025,E-10025-01,2025-04-16T03:40:32.613850,36.6,115,134,85,97.1,16,21.0,431,,183,86,,,,,,,417,7.7,43,31.6,
-P-10025,E-10025-01,2025-04-16T12:32:01.584276,36.7,49,141,89,97.6,20,21.0,380,41.1,397,292,,1.3,,,,,343,6.3,,31.6,1
-P-10025,E-10025-01,2025-04-16T05:30:48.685859,37.5,63,137,86,97.5,18,21.0,468,,,,,1.3,,,,,467,7.7,,31.6,
-P-10025,E-10025-01,2025-04-16T17:48:16.708288,38.0,66,141,94,98.9,20,41.7,449,,,,0.42,0.9,9,7,35,30,425,7.4,55,31.6,
-P-10026,E-10026-01,2025-04-16T17:27:19.751196,36.2,78,152,82,99.2,20,21.0,444,38.9,,,,1.2,,,,,420,6.5,,21.5,
-P-10026,E-10026-01,2025-04-16T18:03:48.439272,36.5,69,126,84,98.8,12,21.0,373,37.5,,,,1.1,,,,,362,5.1,,21.5,
-P-10026,E-10026-01,2025-04-16T20:57:55.528795,36.3,71,130,84,99.1,14,21.0,427,37.5,,,,,,,,,407,5.9,,21.5,
-P-10026,E-10026-01,2025-04-16T22:39:15.079066,36.2,72,131,93,96.5,15,21.0,379,,,,,1.0,,,,,379,5.5,,21.5,1
-P-10026,E-10026-01,2025-04-16T22:32:36.891623,37.6,78,140,94,97.6,15,21.0,501,45.0,,,,1.4,,5,32,20,467,6.9,,21.5,
-P-10026,E-10026-01,2025-04-17T03:18:11.574171,36.0,70,126,88,96.2,15,21.0,518,,275,137,,1.1,,,33,20,476,7.1,,21.5,
-P-10026,E-10026-01,2025-04-17T03:03:05.976210,36.7,74,131,99,99.2,19,21.0,541,42.0,,,,,,,,,524,7.9,,21.5,
-P-10026,E-10026-02,2025-04-07T17:27:19.751196,36.3,66,145,93,97.6,15,21.0,482,42.9,,,,,,,,,478,6.6,,21.5,
-P-10026,E-10026-02,2025-04-07T18:21:11.751663,36.1,91,151,93,99.0,24,21.0,547,40.5,,,,1.3,,7,,,506,8.0,,21.5,
-P-10026,E-10026-02,2025-04-07T20:44:33.174771,36.2,71,134,85,98.5,19,21.0,364,,,,,,,,32,,334,5.0,,21.5,
-P-10026,E-10026-02,2025-04-07T19:00:53.782419,36.5,83,138,97,96.6,21,43.8,488,,,,0.44,1.2,2,6,,,443,6.7,,21.5,
-P-10026,E-10026-02,2025-04-08T00:02:08.979241,36.8,74,136,86,97.4,20,21.0,479,39.9,,,,1.4,,,,,435,7.0,,21.5,
-P-10026,E-10026-02,2025-04-07T23:58:14.763181,36.3,78,133,85,98.0,17,21.0,414,39.9,,,,1.2,,,32,20,380,6.0,80,21.5,
-P-10026,E-10026-03,2025-04-09T17:27:19.751196,36.9,78,137,97,97.9,12,21.0,476,,,,,0.9,,4,29,25,435,6.5,,21.5,1
-P-10026,E-10026-03,2025-04-09T18:45:27.166283,36.3,73,132,81,98.8,16,21.0,390,,102,100,,1.1,,,,,352,5.3,,21.5,
-P-10026,E-10026-03,2025-04-09T21:21:30.973051,36.9,76,135,88,98.5,19,21.0,457,,,,,1.1,,5,26,25,428,6.3,,21.5,
-P-10026,E-10026-03,2025-04-09T22:54:01.500900,37.0,65,133,84,96.0,15,21.0,478,44.9,,,,1.3,,6,28,,471,6.6,,21.5,
-P-10026,E-10026-03,2025-04-09T21:41:55.331649,37.1,76,136,86,97.9,17,21.0,368,36.4,350,243,,1.5,,6,34,32,334,5.0,,21.5,1
-P-10026,E-10026-03,2025-04-09T22:03:56.547894,36.5,98,131,85,99.1,20,21.0,528,43.8,,,,,,,,,517,7.2,68,21.5,1
-P-10026,E-10026-03,2025-04-09T23:47:37.384700,36.9,70,131,83,97.0,17,21.0,500,40.2,,,,1.5,,6,28,,460,6.9,,21.5,
-P-10026,E-10026-03,2025-04-10T01:38:12.399776,36.7,73,145,84,97.5,16,21.0,518,,,,,1.2,,,26,21,479,7.1,59,21.5,
-P-10026,E-10026-03,2025-04-10T06:36:56.501865,37.0,78,129,97,99.3,16,21.0,421,,126,124,,,,,,,388,6.1,,21.5,1
-P-10026,E-10026-03,2025-04-10T02:07:51.985994,37.0,77,127,94,98.8,18,21.0,382,39.3,,,,,,4,34,30,355,5.6,,21.5,
-P-10027,E-10027-01,2025-04-12T17:27:19.752189,36.5,76,111,83,98.6,12,21.0,420,39.8,,,,1.0,,,,,390,8.9,,30.8,
-P-10027,E-10027-01,2025-04-12T18:02:58.494873,37.0,44,111,82,92.0,16,21.0,393,,,,,1.4,,,33,,383,8.3,,30.8,
-P-10027,E-10027-01,2025-04-12T19:15:58.666331,37.2,83,122,83,98.1,16,30.6,369,,303,93,0.31,,7,6,,,349,7.8,63,30.8,
-P-10027,E-10027-01,2025-04-12T22:40:33.285680,37.1,83,115,80,99.1,19,21.0,511,,,,,1.1,,4,,,488,10.8,,30.8,
-P-10027,E-10027-01,2025-04-13T00:16:07.577870,36.2,82,120,72,97.5,19,21.0,449,43.9,414,320,,,,7,27,25,416,9.5,,30.8,
-P-10027,E-10027-01,2025-04-13T01:44:14.242814,36.2,79,118,80,98.2,12,21.0,368,43.1,,,,1.2,,7,27,20,350,7.1,,30.8,1
-P-10027,E-10027-01,2025-04-13T00:38:43.248631,37.0,49,120,81,97.6,20,21.0,518,35.7,,,,1.1,,7,,,474,10.9,,30.8,
-P-10027,E-10027-01,2025-04-13T06:27:48.172949,36.0,66,123,70,97.6,19,44.9,536,,,,0.45,1.1,9,,,,530,10.3,,30.8,
-P-10027,E-10027-01,2025-04-13T04:42:17.593844,37.0,80,119,84,98.6,12,59.1,417,39.0,,,0.59,,7,6,,,404,8.0,,30.8,
-P-10027,E-10027-02,2025-04-11T17:27:19.752189,36.3,83,125,76,98.0,18,21.0,371,43.5,,,,1.5,,,,,340,7.1,61,30.8,
-P-10027,E-10027-02,2025-04-11T18:35:37.310988,36.9,53,120,80,98.5,16,21.0,501,35.5,239,148,,0.8,,,,,451,9.7,58,30.8,
-P-10027,E-10027-02,2025-04-11T19:58:31.069582,36.2,65,121,77,99.0,18,21.0,538,,,,,1.3,,,35,32,524,10.4,,30.8,
-P-10027,E-10027-02,2025-04-11T22:40:15.429260,36.6,72,117,78,97.9,18,21.0,526,,,,,,,,,,494,10.1,,30.8,
-P-10027,E-10027-02,2025-04-11T19:40:25.892841,37.1,67,117,74,97.1,18,21.0,382,,,,,1.1,,,32,20,355,7.4,,30.8,
-P-10027,E-10027-02,2025-04-11T21:37:31.041183,36.9,85,120,71,99.5,18,21.0,363,40.7,,,,1.1,,6,,,341,7.7,71,30.8,
-P-10027,E-10027-02,2025-04-12T04:22:59.832774,37.0,68,121,70,98.8,14,21.0,459,41.8,,,,0.8,,,30,30,454,9.7,64,30.8,
-P-10027,E-10027-02,2025-04-12T00:55:02.719836,36.3,69,110,70,98.2,15,21.0,359,,,,,1.3,,,28,23,329,7.6,,30.8,
-P-10027,E-10027-02,2025-04-12T02:26:41.230631,36.8,68,116,81,97.0,20,42.6,361,41.8,461,430,0.43,1.2,7,,,,343,7.0,,30.8,
-P-10027,E-10027-02,2025-04-12T06:58:59.505925,37.4,74,122,72,96.5,14,21.0,363,,,,,1.3,,,,,330,7.7,,30.8,
-P-10027,E-10027-02,2025-04-12T10:48:20.830448,36.4,106,125,72,99.3,19,21.0,523,,111,82,,1.4,,,33,32,484,11.0,,30.8,
-P-10027,E-10027-02,2025-04-12T02:31:45.853027,37.0,67,117,70,98.4,15,21.0,490,35.5,,,,0.9,,,31,24,473,10.3,,30.8,
-P-10027,E-10027-02,2025-04-12T07:17:22.980145,36.1,74,116,73,99.5,20,21.0,540,,272,92,,,,7,,,489,10.4,,30.8,1
-P-10027,E-10027-02,2025-04-12T19:06:28.947958,36.7,68,110,72,96.6,12,21.0,398,,,,,,,,,,377,7.7,,30.8,
-P-10027,E-10027-02,2025-04-12T01:34:34.616674,36.4,70,115,78,98.2,14,21.0,362,,188,100,,,,,,,327,7.6,,30.8,1
-P-10028,E-10028-01,2025-04-13T17:27:19.752189,36.4,78,162,88,97.6,19,21.0,518,,,,,0.8,,5,35,21,486,10.4,,37.2,
-P-10028,E-10028-01,2025-04-13T19:19:14.584942,36.1,95,130,89,97.9,13,21.0,417,,395,287,,0.9,,,,,416,9.2,,37.2,
-P-10028,E-10028-01,2025-04-13T21:13:29.900145,36.2,84,138,90,97.5,13,21.0,405,,,,,,,8,,,394,8.2,,37.2,1
-P-10028,E-10028-01,2025-04-13T22:28:02.420309,36.6,78,142,88,97.5,12,32.3,413,,,,0.32,,4,,,,382,8.3,,37.2,
-P-10028,E-10028-01,2025-04-14T01:01:32.711851,36.5,66,132,84,98.3,19,21.0,546,40.1,,,,1.3,,4,,,525,12.1,,37.2,
-P-10028,E-10028-01,2025-04-14T02:30:18.069319,37.1,67,129,77,97.0,18,21.0,494,35.5,,,,,,4,,,462,10.9,,37.2,1
-P-10028,E-10028-01,2025-04-14T04:00:25.344094,36.5,74,142,94,96.3,16,21.0,405,38.6,343,290,,0.9,,7,,,399,8.2,,37.2,
-P-10028,E-10028-01,2025-04-14T05:05:01.780360,37.1,69,131,78,99.1,20,21.0,387,,,,,,,,32,28,353,7.8,,37.2,
-P-10028,E-10028-01,2025-04-14T02:23:32.949100,37.1,66,130,92,98.7,19,21.0,380,35.2,,,,0.9,,,34,,351,8.4,,37.2,
-P-10028,E-10028-01,2025-04-14T11:21:54.575035,36.4,81,122,95,98.7,19,21.0,508,44.2,,,,0.8,,7,,,469,10.2,,37.2,
-P-10028,E-10028-01,2025-04-14T02:02:48.387135,36.7,82,127,92,97.2,15,21.0,460,44.5,,,,0.9,,,31,21,446,10.2,,37.2,1
-P-10028,E-10028-01,2025-04-14T12:59:56.549861,36.3,79,136,89,96.8,15,21.0,421,,,,,1.3,,7,,,399,9.3,,37.2,
-P-10028,E-10028-02,2025-04-10T17:27:19.752189,37.0,66,129,98,96.7,15,21.0,500,,,,,1.0,,5,27,21,492,10.1,,37.2,
-P-10028,E-10028-02,2025-04-10T18:01:04.724644,36.5,65,133,90,96.6,19,21.0,492,37.5,,,,,,,34,25,475,9.9,30,37.2,
-P-10028,E-10028-02,2025-04-10T19:30:56.267624,36.6,81,137,88,98.1,13,21.0,540,,,,,0.8,,,27,20,495,12.0,,37.2,1
-P-10028,E-10028-02,2025-04-10T22:06:29.762897,36.2,66,137,91,93.9,18,21.0,515,39.7,253,203,,,,6,30,27,484,10.4,79,37.2,
-P-10028,E-10028-02,2025-04-10T21:17:24.502521,36.1,79,143,96,96.2,15,30.0,545,,,,0.3,,3,8,,,493,11.0,67,37.2,
-P-10028,E-10028-02,2025-04-10T21:15:35.872774,36.3,69,126,87,96.0,14,21.0,478,43.1,330,147,,1.0,,,,,458,10.6,27,37.2,
-P-10028,E-10028-02,2025-04-11T04:16:07.673254,37.1,83,129,87,97.1,17,21.0,375,38.3,,,,,,,,,346,8.3,,37.2,
-P-10028,E-10028-03,2025-04-15T17:27:19.752189,37.1,81,131,94,97.7,20,21.0,387,40.0,,,,1.2,,5,,,351,7.8,,37.2,
-P-10028,E-10028-03,2025-04-15T18:12:00.460754,37.0,80,139,94,97.9,18,21.0,489,42.7,,,,1.2,,7,29,,486,10.8,,37.2,
-P-10028,E-10028-03,2025-04-15T21:22:49.049253,37.0,84,127,80,96.7,13,21.0,526,,,,,1.4,,4,30,,497,10.6,,37.2,
-P-10028,E-10028-03,2025-04-15T23:25:34.569239,36.3,72,135,81,99.4,12,21.0,407,,441,207,,,,7,31,,395,8.2,,37.2,
-P-10028,E-10028-03,2025-04-15T21:04:29.418194,36.1,80,132,80,97.4,14,21.0,395,41.5,,,,0.9,,4,27,22,374,8.0,,37.2,
-P-10028,E-10028-03,2025-04-16T01:21:03.704439,36.2,101,128,86,98.9,16,21.0,387,,,,,1.4,,5,,,364,7.8,,37.2,
-P-10028,E-10028-03,2025-04-16T02:07:23.743829,37.1,66,142,79,97.1,16,42.4,471,35.1,209,137,0.42,,10,,25,23,438,10.4,,37.2,
-P-10028,E-10028-03,2025-04-16T02:19:33.752214,36.5,84,135,93,97.8,14,21.0,480,42.2,,,,,,,26,,452,9.7,,37.2,
-P-10029,E-10029-01,2025-04-14T17:27:19.752189,36.9,75,124,72,97.3,19,31.2,352,38.2,,,0.31,1.0,9,,,,323,5.8,,26.4,
-P-10029,E-10029-01,2025-04-14T18:09:35.605384,36.2,71,125,73,96.8,17,21.0,369,43.4,,,,0.8,,7,,,354,5.6,20,26.4,
-P-10029,E-10029-01,2025-04-14T19:04:27.675627,36.7,82,142,89,96.1,18,21.0,478,,,,,0.8,,,,,460,7.3,,26.4,
-P-10029,E-10029-01,2025-04-14T21:12:59.851892,36.9,84,120,73,96.2,18,21.0,485,41.8,,,,,,5,,,449,8.0,,26.4,
-P-10029,E-10029-01,2025-04-14T23:37:52.824442,37.7,56,117,80,94.0,16,21.0,541,35.3,,,,1.2,,5,,,503,8.9,,26.4,
-P-10029,E-10029-01,2025-04-14T22:48:01.735364,36.4,71,112,78,98.2,18,21.0,499,39.4,,,,,,5,,,482,8.2,,26.4,1
-P-10029,E-10029-01,2025-04-14T21:48:25.598378,36.8,66,115,83,96.7,22,21.0,414,,,,,,,,33,,389,6.8,,26.4,
-P-10029,E-10029-01,2025-04-15T05:40:21.148427,36.5,66,128,80,98.8,20,21.0,526,40.0,327,308,,1.2,,5,,,474,8.0,,26.4,1
-P-10029,E-10029-01,2025-04-14T23:50:25.709797,38.1,46,113,79,98.2,16,21.0,537,39.1,274,187,,,,,,,516,8.2,,26.4,
-P-10029,E-10029-01,2025-04-15T10:32:42.902808,36.6,85,124,80,99.4,20,29.8,447,,,,0.3,,2,,,,408,7.3,,26.4,
-P-10029,E-10029-01,2025-04-15T07:53:12.060234,38.1,74,118,77,98.1,19,25.1,397,43.6,,,0.25,,2,8,27,23,359,6.5,,26.4,
-P-10029,E-10029-01,2025-04-15T05:07:23.093499,36.5,94,111,71,93.1,17,21.0,549,43.2,344,203,,,,,34,21,505,8.4,,26.4,
-P-10029,E-10029-01,2025-04-15T00:49:53.090233,36.1,81,112,79,98.5,12,21.0,404,37.1,287,230,,,,,30,,377,6.2,,26.4,
-P-10029,E-10029-01,2025-04-15T14:49:04.064276,36.7,84,117,82,99.4,19,21.0,532,,,,,1.0,,,29,27,522,8.7,,26.4,
-P-10029,E-10029-01,2025-04-15T01:12:36.704403,36.9,76,112,71,98.9,15,21.0,484,,,,,,,,,,450,7.4,,26.4,
-P-10029,E-10029-02,2025-04-15T17:27:19.752189,36.6,79,139,84,98.5,13,21.0,546,44.1,,,,0.9,,,27,,500,8.3,,26.4,
-P-10029,E-10029-02,2025-04-15T18:12:11.562854,36.3,70,113,81,97.0,12,21.0,517,,,,,,,,32,28,465,7.9,,26.4,
-P-10029,E-10029-02,2025-04-15T19:27:36.347890,37.2,79,132,88,96.7,20,21.0,518,,,,,1.4,,,,,516,7.9,,26.4,
-P-10029,E-10029-02,2025-04-15T21:36:16.847512,37.0,74,121,89,98.0,18,21.0,522,37.7,,,,,,,,,512,8.0,,26.4,
-P-10029,E-10029-02,2025-04-15T22:46:38.827449,37.1,72,125,73,96.1,15,21.0,355,,,,,,,5,28,,324,5.8,,26.4,1
-P-10029,E-10029-02,2025-04-15T23:13:54.031940,36.6,77,125,74,96.5,18,21.0,532,,336,309,,0.9,,,30,27,487,8.1,68,26.4,
-P-10029,E-10029-02,2025-04-16T02:56:59.137745,36.4,73,125,83,97.5,12,26.3,390,40.7,,,0.26,1.5,9,4,35,,378,6.0,,26.4,1
-P-10029,E-10029-02,2025-04-16T04:47:45.589534,36.1,53,111,70,98.8,16,21.0,515,,,,,,,5,33,,509,8.4,,26.4,
-P-10029,E-10029-02,2025-04-16T03:25:25.596839,36.5,77,121,73,98.0,14,21.0,550,,,,,,,,32,20,506,8.4,,26.4,
-P-10029,E-10029-02,2025-04-16T06:38:29.319293,36.8,97,112,73,99.0,19,21.0,469,40.3,,,,1.5,,5,,,435,7.7,,26.4,
-P-10029,E-10029-02,2025-04-16T08:18:10.652236,36.2,80,121,77,96.2,17,21.0,430,,,,,1.1,,,,,409,7.0,,26.4,1
-P-10029,E-10029-02,2025-04-16T02:58:45.918224,36.8,72,111,73,96.7,17,21.0,414,,193,95,,,,,,,377,6.3,,26.4,
-P-10029,E-10029-02,2025-04-16T14:48:42.028050,37.1,46,114,76,98.9,15,21.0,389,,,,,,,,,,383,6.4,,26.4,
-P-10029,E-10029-02,2025-04-16T01:29:45.904376,36.9,70,124,85,99.0,19,21.0,457,,,,,1.3,,,,,417,7.0,,26.4,
-P-10030,E-10030-01,2025-04-12T17:27:19.752189,36.4,67,140,99,97.0,20,21.0,410,37.0,,,,1.1,,,,,370,6.0,,18.2,
-P-10030,E-10030-01,2025-04-12T19:09:07.422640,36.3,75,139,90,99.5,12,21.0,421,,,,,,,5,,,389,6.6,41,18.2,
-P-10030,E-10030-01,2025-04-12T20:43:08.163367,37.1,78,140,80,98.3,14,31.1,417,38.8,481,441,0.31,,4,8,32,24,417,6.1,,18.2,
-P-10030,E-10030-01,2025-04-12T20:31:42.094432,36.2,84,140,77,97.5,19,21.0,373,38.0,306,287,,1.1,,5,,,357,5.8,,18.2,
-P-10030,E-10030-01,2025-04-13T01:11:16.039705,37.1,75,138,91,98.9,20,21.0,537,,112,98,,1.3,,,,,504,7.8,,18.2,
-P-10031,E-10031-01,2025-04-13T17:27:19.752189,37.2,67,110,83,95.8,20,21.0,514,35.3,,,,,,8,,,509,9.9,,30.9,
-P-10031,E-10031-01,2025-04-13T18:32:53.451301,37.1,45,118,77,98.8,19,21.0,418,38.0,,,,,,7,,,407,7.4,,30.9,
-P-10031,E-10031-01,2025-04-13T20:33:50.659105,36.9,71,127,91,99.2,18,21.0,461,38.2,268,127,,1.3,,,,,449,8.9,,30.9,1
-P-10031,E-10031-01,2025-04-13T23:20:16.506544,36.9,65,124,83,96.9,12,21.0,508,,,,,,,6,30,22,469,9.0,,30.9,
-P-10031,E-10031-01,2025-04-13T20:41:39.790650,37.1,80,133,84,96.8,20,21.0,525,38.9,,,,1.2,,,,,478,10.1,32,30.9,
-P-10031,E-10031-01,2025-04-13T20:45:53.951701,36.6,75,120,75,97.3,19,43.9,366,40.8,,,0.44,,4,5,,,364,7.0,,30.9,1
-P-10031,E-10031-01,2025-04-13T20:35:33.581029,36.4,68,118,76,98.4,14,21.0,511,44.3,,,,0.9,,5,25,21,487,9.8,,30.9,
-P-10031,E-10031-01,2025-04-13T23:25:02.360027,37.0,69,129,78,97.9,18,21.0,438,36.0,,,,0.9,,4,35,27,408,8.4,,30.9,
-P-10031,E-10031-01,2025-04-14T05:13:56.906167,37.2,71,112,74,96.0,15,21.0,387,,,,,1.0,,,,,372,7.5,,30.9,
-P-10031,E-10031-01,2025-04-14T02:28:59.062311,36.3,69,125,83,99.3,14,21.0,544,,242,,,1.0,,8,34,31,525,10.5,,30.9,
-P-10031,E-10031-01,2025-04-14T03:35:25.081840,36.3,71,134,76,98.9,18,21.0,530,38.7,422,276,,1.4,,,34,29,524,10.2,,30.9,
-P-10031,E-10031-01,2025-04-14T09:21:14.146873,37.1,73,125,85,98.9,12,21.0,493,44.5,,,,1.0,,7,25,22,469,9.5,,30.9,
-P-10031,E-10031-01,2025-04-14T07:36:30.137304,37.0,43,112,75,97.9,17,21.0,540,44.9,,,,,,7,,,499,9.6,23,30.9,
-P-10031,E-10031-02,2025-04-12T17:27:19.752189,36.4,76,120,70,97.3,16,21.0,483,,,,,0.9,,6,27,,474,9.3,33,30.9,
-P-10031,E-10031-02,2025-04-12T19:11:53.821308,36.1,84,113,72,91.9,17,21.0,542,39.0,,,,,,,,,497,10.4,,30.9,
-P-10031,E-10031-02,2025-04-12T21:11:08.429864,36.9,65,142,92,97.0,17,21.0,427,37.9,488,423,,,,,,,403,8.2,32,30.9,
-P-10031,E-10031-02,2025-04-12T20:56:01.049005,36.0,76,140,88,98.1,19,21.0,494,,420,105,,,,,33,31,492,9.5,40,30.9,
-P-10031,E-10031-02,2025-04-12T21:25:13.560916,36.2,66,117,76,96.0,12,21.0,448,37.6,186,,,0.8,,,,,404,7.9,,30.9,
-P-10031,E-10031-02,2025-04-12T20:20:41.070191,36.6,76,130,79,93.1,12,21.0,363,43.7,,,,,,,,,340,6.4,,30.9,
-P-10031,E-10031-02,2025-04-12T21:40:54.224393,36.9,66,111,83,99.0,13,21.0,495,,,,,,,,,,452,9.5,26,30.9,1
-P-10031,E-10031-02,2025-04-13T05:40:48.411598,37.5,66,110,80,96.8,19,44.8,419,41.1,,,0.45,0.9,6,,,,409,7.4,,30.9,1
-P-10031,E-10031-03,2025-04-10T17:27:19.752189,36.6,50,116,84,97.4,14,21.0,509,35.3,,,,,,,,,474,9.8,29,30.9,1
-P-10031,E-10031-03,2025-04-10T18:23:49.002378,37.1,79,119,84,96.6,19,21.0,466,37.2,365,332,,,,,29,29,451,9.0,,30.9,
-P-10031,E-10031-03,2025-04-10T20:24:52.840820,36.9,77,138,85,96.9,13,21.0,485,,299,191,,,,4,29,21,469,9.3,,30.9,
-P-10031,E-10031-03,2025-04-10T22:33:22.312407,36.7,97,125,93,97.2,16,21.0,461,35.2,312,,,,,6,30,25,440,8.9,,30.9,
-P-10031,E-10031-03,2025-04-10T19:49:56.178752,36.6,71,111,74,97.2,20,21.0,549,44.8,152,,,1.0,,4,,,495,10.6,,30.9,
-P-10031,E-10031-03,2025-04-10T22:53:57.556315,36.5,67,122,74,96.7,24,21.0,519,,,,,1.1,,,,,504,10.0,,30.9,
-P-10032,E-10032-01,2025-04-15T17:27:19.753192,37.2,68,117,72,98.3,20,21.0,460,,389,198,,1.1,,,,,432,9.3,,22.4,
-P-10032,E-10032-01,2025-04-15T18:40:23.328937,37.0,50,118,71,97.2,20,55.9,404,,386,298,0.56,0.9,8,8,30,20,402,9.0,,22.4,
-P-10032,E-10032-01,2025-04-15T19:08:39.538593,36.0,85,137,79,96.9,17,21.0,420,41.2,,,,1.1,,,32,24,410,9.4,,22.4,1
-P-10032,E-10032-01,2025-04-15T23:02:31.030038,36.2,74,119,71,98.0,18,21.0,526,36.1,257,110,,1.4,,,,,473,10.7,,22.4,
-P-10032,E-10032-01,2025-04-16T01:00:28.841983,37.2,112,125,93,97.5,14,21.0,504,,,,,1.4,,,,,488,10.2,,22.4,
-P-10032,E-10032-01,2025-04-15T23:00:48.123843,36.5,83,125,85,96.0,19,21.0,398,44.0,,,,1.4,,,,,358,8.1,,22.4,
-P-10032,E-10032-01,2025-04-16T03:02:03.510563,37.1,65,121,85,97.0,12,21.0,436,,,,,0.9,,,,,410,8.8,,22.4,
-P-10032,E-10032-01,2025-04-15T22:13:11.363137,36.9,67,120,85,96.4,16,21.0,507,,374,350,,1.4,,6,30,25,476,11.3,74,22.4,
-P-10032,E-10032-02,2025-04-07T17:27:19.753192,36.8,68,116,70,97.3,15,21.0,545,44.6,,,,,,5,26,25,532,12.2,38,22.4,
-P-10032,E-10032-02,2025-04-07T18:40:01.520388,36.6,70,112,83,98.1,16,21.0,466,,445,288,,1.3,,8,35,29,431,10.4,,22.4,
-P-10032,E-10032-02,2025-04-07T20:48:46.436609,36.3,79,111,72,97.2,18,21.0,534,,120,90,,0.9,,,,,492,11.9,,22.4,1
-P-10032,E-10032-02,2025-04-07T21:48:29.646668,36.4,80,125,70,98.0,19,21.0,504,36.9,,,,1.4,,7,32,24,468,10.2,,22.4,
-P-10032,E-10032-02,2025-04-07T20:27:49.880477,37.1,79,116,72,99.5,18,21.0,397,,,,,1.0,,,,,362,8.1,,22.4,1
-P-10032,E-10032-02,2025-04-08T00:22:08.364297,37.1,68,132,89,96.6,17,29.3,366,,199,156,0.29,,4,,,,352,8.2,,22.4,
-P-10032,E-10032-02,2025-04-08T00:19:50.445850,37.4,82,125,74,97.7,15,21.0,475,,,,,1.1,,5,31,,460,9.6,,22.4,
-P-10032,E-10032-02,2025-04-08T01:14:50.281587,36.0,74,118,81,99.1,16,21.0,384,,178,162,,0.8,,5,,,376,7.8,,22.4,
-P-10032,E-10032-02,2025-04-08T07:04:08.378520,36.9,108,136,86,98.9,16,21.0,483,36.2,,,,1.3,,,27,,480,10.8,,22.4,
-P-10032,E-10032-02,2025-04-08T04:18:25.371347,36.3,73,118,78,96.9,19,21.0,412,,,,,,,4,,,407,8.4,,22.4,
-P-10033,E-10033-01,2025-04-13T17:27:19.753192,36.5,79,124,79,97.4,19,21.0,385,42.8,,,,1.4,,,,,366,5.3,41,24.3,1
-P-10033,E-10033-01,2025-04-13T19:04:41.711329,36.3,75,124,70,96.1,14,21.0,457,38.1,,,,1.1,,,27,22,420,6.7,78,24.3,
-P-10033,E-10033-01,2025-04-13T21:02:49.705788,36.7,65,131,82,96.1,14,21.0,474,,,,,,,,,,450,6.9,,24.3,1
-P-10033,E-10033-01,2025-04-13T22:05:25.147156,36.8,105,111,73,98.4,12,37.8,393,40.0,,,0.38,,8,,29,24,360,5.4,29,24.3,
-P-10033,E-10033-01,2025-04-13T21:35:08.200387,37.0,78,124,82,99.2,20,21.0,439,36.0,,,,0.8,,,,,410,6.4,55,24.3,
-P-10033,E-10033-01,2025-04-14T02:57:27.870535,36.8,75,136,93,95.0,14,21.0,405,,,,,,,,34,20,367,5.5,,24.3,
-P-10034,E-10034-01,2025-04-12T17:27:19.753192,36.2,85,113,81,96.2,15,21.0,460,35.2,,,,1.3,,,32,,422,7.6,63,24.4,
-P-10034,E-10034-01,2025-04-12T19:07:17.801061,36.4,84,121,81,98.8,19,21.0,455,39.8,437,405,,,,4,,,414,8.1,,24.4,
-P-10034,E-10034-01,2025-04-12T19:41:59.998864,36.1,74,113,81,96.9,19,21.0,397,,,,,1.4,,,32,29,393,6.5,,24.4,
-P-10034,E-10034-01,2025-04-12T22:07:06.034756,37.0,65,114,70,98.6,13,21.0,423,35.3,,,,,,,32,25,408,7.0,,24.4,
-P-10034,E-10034-01,2025-04-13T01:15:48.175595,36.4,78,116,71,97.0,19,21.0,528,,,,,,,5,,,485,8.7,,24.4,
-P-10034,E-10034-01,2025-04-12T23:06:53.900282,36.0,85,110,77,96.2,13,25.0,526,35.6,197,177,0.25,1.4,2,,28,20,474,8.7,,24.4,1
-P-10034,E-10034-01,2025-04-12T21:17:40.729715,36.2,53,125,89,97.4,13,21.0,390,,,,,1.5,,6,32,32,351,6.9,72,24.4,1
-P-10034,E-10034-02,2025-04-14T17:27:19.753192,36.5,70,118,74,96.0,15,21.0,467,43.0,,,,1.3,,5,,,428,8.3,,24.4,
-P-10034,E-10034-02,2025-04-14T19:05:00.108482,37.0,76,125,84,98.0,16,21.0,522,,155,,,1.5,,6,32,,509,9.3,,24.4,
-P-10034,E-10034-02,2025-04-14T19:03:40.410471,36.7,74,122,88,98.5,16,21.0,408,,131,121,,1.0,,6,,,381,6.7,,24.4,
-P-10034,E-10034-02,2025-04-14T19:56:17.009505,36.8,71,117,83,98.6,18,21.0,364,40.9,,,,1.1,,4,,,333,6.5,,24.4,
-P-10034,E-10034-02,2025-04-15T01:05:46.312296,37.0,80,122,71,95.6,19,21.0,518,,,,,0.8,,6,31,31,485,9.2,,24.4,
-P-10034,E-10034-02,2025-04-14T23:31:00.398266,36.8,82,121,76,97.0,13,21.0,527,,,,,1.0,,,35,26,499,9.4,,24.4,
-P-10034,E-10034-02,2025-04-15T01:03:30.525516,36.7,67,122,79,96.4,17,21.0,401,,,,,1.3,,6,25,,372,6.6,,24.4,
-P-10034,E-10034-02,2025-04-14T22:52:00.875145,36.7,62,133,86,97.7,20,21.0,534,36.5,257,,,1.1,,,,,526,9.5,,24.4,
-P-10034,E-10034-03,2025-04-07T17:27:19.753192,37.3,81,130,85,96.7,14,21.0,531,40.6,,,,1.3,,7,,,478,8.8,,24.4,1
-P-10034,E-10034-03,2025-04-07T18:17:05.502845,36.2,82,121,78,99.0,15,21.0,426,,,,,,,7,26,25,401,7.6,33,24.4,
-P-10034,E-10034-03,2025-04-07T20:34:33.315553,36.4,71,114,83,99.5,20,21.0,399,42.0,,,,1.4,,8,,,396,7.1,,24.4,1
-P-10034,E-10034-03,2025-04-07T22:29:34.429972,36.5,80,135,93,97.8,18,21.0,449,41.3,328,169,,1.0,,5,28,24,446,7.4,,24.4,
-P-10034,E-10034-03,2025-04-07T22:33:22.648169,36.6,76,119,71,97.0,13,21.0,497,,364,220,,,,,32,22,456,8.2,,24.4,
-P-10034,E-10034-03,2025-04-08T00:37:56.293811,37.1,79,133,90,97.8,15,21.0,358,43.1,,,,1.2,,6,,,356,6.4,,24.4,
-P-10034,E-10034-03,2025-04-08T01:12:48.113136,36.0,83,114,79,96.4,16,21.0,412,,194,138,,,,8,29,26,384,7.3,,24.4,1
-P-10034,E-10034-03,2025-04-08T06:16:16.444319,37.0,68,115,80,94.4,16,21.0,369,,,,,,,5,,,364,6.1,34,24.4,
-P-10034,E-10034-03,2025-04-08T07:06:17.990851,36.1,81,114,72,97.8,18,44.4,509,,,,0.44,,5,5,,,495,9.1,,24.4,
-P-10034,E-10034-03,2025-04-08T01:56:30.703876,36.4,45,125,82,97.4,16,33.1,502,36.8,,,0.33,,2,,,,499,8.3,,24.4,
-P-10034,E-10034-03,2025-04-08T02:43:30.542837,36.5,77,123,73,97.7,17,21.0,398,42.9,,,,1.3,,7,,,388,6.6,,24.4,1
-P-10034,E-10034-03,2025-04-08T00:21:21.933629,37.6,83,115,71,96.8,13,21.0,535,42.6,228,118,,1.1,,,,,508,8.8,,24.4,1
-P-10035,E-10035-01,2025-04-12T17:27:19.753192,36.7,69,142,79,97.9,12,21.0,468,,,,,1.3,,,,,457,6.5,,19.4,
-P-10035,E-10035-01,2025-04-12T19:22:19.620117,36.5,69,150,99,98.3,18,56.0,426,36.9,,,0.56,1.2,2,7,27,27,408,5.9,,19.4,
-P-10035,E-10035-01,2025-04-12T19:40:42.186314,36.9,85,132,96,98.3,15,51.6,359,,,,0.52,0.9,6,,29,26,343,5.3,68,19.4,
-P-10035,E-10035-01,2025-04-12T19:04:59.873819,37.5,81,141,85,99.5,18,21.0,437,,,,,,,4,,,436,6.5,,19.4,
-P-10035,E-10035-01,2025-04-12T23:03:04.364018,37.7,77,140,93,98.9,20,36.5,397,42.7,,,0.36,1.1,9,,29,25,373,5.5,,19.4,
-P-10035,E-10035-01,2025-04-13T02:48:42.814990,36.9,60,135,96,96.4,13,21.0,397,,,,,1.3,,,,,394,5.5,,19.4,
-P-10035,E-10035-01,2025-04-12T23:25:00.867295,36.8,79,131,94,97.8,16,21.0,503,38.2,213,137,,,,7,,,484,7.4,,19.4,
-P-10035,E-10035-01,2025-04-13T02:35:20.918475,36.4,70,138,82,98.4,18,21.0,451,38.8,406,102,,,,,28,26,438,6.3,,19.4,
-P-10035,E-10035-01,2025-04-13T00:00:30.165587,36.2,79,145,88,99.0,14,21.0,496,,,,,1.4,,4,,,460,7.3,68,19.4,
-P-10035,E-10035-01,2025-04-12T23:42:08.086226,36.9,82,128,95,96.0,16,21.0,371,,,,,1.2,,6,,,343,5.1,48,19.4,
-P-10035,E-10035-01,2025-04-13T10:24:55.557881,36.0,63,142,95,94.5,15,21.0,540,43.6,,,,1.2,,,,,515,7.5,,19.4,
-P-10035,E-10035-01,2025-04-13T13:32:23.912850,37.4,71,128,95,98.1,17,21.0,392,39.0,,,,1.1,,,,,352,5.8,44,19.4,
-P-10035,E-10035-02,2025-04-12T17:27:19.753192,36.1,50,152,92,98.0,20,21.0,380,36.5,,,,1.0,,,,,355,5.6,,19.4,
-P-10035,E-10035-02,2025-04-12T18:01:17.291180,37.0,65,121,88,97.2,20,21.0,407,43.0,410,163,,1.1,,,32,,374,5.6,,19.4,
-P-10035,E-10035-02,2025-04-12T18:38:12.040450,37.1,83,131,94,98.3,16,21.0,390,,380,280,,1.2,,,30,26,373,5.4,37,19.4,
-P-10035,E-10035-02,2025-04-12T21:19:58.060536,36.2,67,152,95,96.5,12,21.0,507,44.0,337,297,,,,,25,25,473,7.5,,19.4,
-P-10035,E-10035-02,2025-04-12T22:37:02.490023,36.3,83,139,82,97.4,20,21.0,434,43.4,,,,0.9,,4,,,412,6.0,,19.4,
-P-10035,E-10035-02,2025-04-13T02:24:19.815876,37.0,67,129,89,96.3,18,21.0,467,,,,,0.8,,,35,32,449,6.9,,19.4,
-P-10035,E-10035-02,2025-04-13T01:16:55.835763,37.1,68,136,76,97.6,18,21.0,527,38.7,,,,,,,,,490,7.3,,19.4,1
-P-10035,E-10035-02,2025-04-13T02:44:46.146325,37.4,88,132,88,98.7,16,21.0,423,,,,,,,,,,416,6.3,,19.4,1
-P-10035,E-10035-02,2025-04-12T22:59:18.594728,36.3,82,134,95,98.6,14,21.0,424,,365,224,,1.1,,,,,411,5.9,,19.4,
-P-10035,E-10035-02,2025-04-13T00:10:20.418403,36.2,66,146,86,98.8,16,21.0,525,,456,354,,,,,,,523,7.3,,19.4,
-P-10035,E-10035-02,2025-04-13T10:07:40.235962,36.9,78,135,93,97.7,17,21.0,504,38.3,,,,,,,,,481,7.0,59,19.4,1
-P-10035,E-10035-02,2025-04-12T23:55:14.095272,37.1,58,133,96,93.7,20,48.5,376,,,,0.48,1.1,4,8,,,367,5.2,,19.4,1
-P-10035,E-10035-03,2025-04-15T17:27:19.753192,36.9,83,136,89,96.5,19,21.0,426,,367,269,,1.2,,,,,393,6.3,52,19.4,
-P-10035,E-10035-03,2025-04-15T18:05:37.024091,36.8,53,149,90,96.8,12,21.0,503,,389,,,0.8,,5,,,500,7.0,,19.4,1
-P-10035,E-10035-03,2025-04-15T19:28:51.557133,36.8,71,160,91,97.4,19,21.0,396,36.1,,,,1.4,,,29,22,371,5.9,,19.4,
-P-10035,E-10035-03,2025-04-15T19:10:43.108022,36.3,79,133,88,98.7,19,21.0,383,43.0,,,,1.2,,,,,344,5.3,42,19.4,1
-P-10035,E-10035-03,2025-04-15T20:15:31.650657,36.1,85,136,97,97.9,13,47.5,548,40.5,131,107,0.47,,2,5,,,495,8.1,,19.4,1
-P-10035,E-10035-03,2025-04-16T02:03:51.510598,36.0,75,139,95,96.7,20,21.0,393,,,,,1.5,,,,,393,5.8,,19.4,
-P-10035,E-10035-03,2025-04-15T23:32:48.808448,36.7,73,152,102,98.2,19,21.0,370,43.9,,,,,,8,,,335,5.1,,19.4,
-P-10035,E-10035-03,2025-04-15T23:35:06.797812,36.1,68,128,83,99.0,20,21.0,358,,,,,,,,,,336,5.0,,19.4,1
-P-10035,E-10035-03,2025-04-15T21:38:35.678633,36.5,84,128,88,97.4,16,21.0,406,39.2,,,,,,,34,,402,6.0,,19.4,
-P-10035,E-10035-03,2025-04-16T02:10:39.411782,37.1,77,142,100,96.9,17,21.0,350,44.2,297,283,,1.4,,,,,317,4.9,,19.4,
-P-10036,E-10036-01,2025-04-14T17:27:19.753192,36.9,77,123,83,97.5,19,21.0,492,,276,272,,,,8,,,450,9.9,62,27.7,
-P-10036,E-10036-01,2025-04-14T19:05:00.534254,36.4,67,124,73,97.0,17,21.0,529,,342,137,,1.2,,,,,508,10.6,,27.7,
-P-10036,E-10036-01,2025-04-14T20:19:02.259263,36.7,85,126,91,97.2,18,21.0,418,40.2,,,,1.3,,6,,,406,8.4,,27.7,
-P-10036,E-10036-01,2025-04-14T21:59:15.487418,37.6,71,117,71,96.6,15,21.0,364,,,,,1.1,,,,,339,6.7,,27.7,
-P-10036,E-10036-01,2025-04-15T00:55:10.850008,37.2,67,124,78,97.4,19,21.0,408,,,,,0.9,,,,,391,7.5,24,27.7,
-P-10036,E-10036-01,2025-04-15T00:11:59.745773,36.7,77,130,86,98.5,16,21.0,368,,,,,0.9,,8,,,359,6.8,,27.7,1
-P-10036,E-10036-01,2025-04-15T00:35:03.886474,36.8,66,113,74,93.7,16,21.0,419,41.9,407,,,1.3,,4,,,402,8.4,,27.7,
-P-10036,E-10036-01,2025-04-15T01:13:09.282158,36.3,68,110,74,98.2,14,45.0,382,42.9,,,0.45,,6,7,31,,347,7.0,74,27.7,
-P-10036,E-10036-01,2025-04-15T00:18:45.615144,36.3,72,124,81,98.0,20,21.0,377,43.0,,,,1.2,,,25,,354,7.6,,27.7,
-P-10036,E-10036-01,2025-04-15T06:35:00.171551,37.3,73,112,76,99.0,14,21.0,504,40.9,303,130,,1.3,,8,,,459,10.1,,27.7,
-P-10036,E-10036-01,2025-04-15T09:58:15.672107,36.4,75,135,91,99.2,18,21.0,437,,242,132,,1.0,,5,28,28,434,8.0,,27.7,
-P-10036,E-10036-01,2025-04-15T06:28:52.241061,36.1,71,115,72,96.3,15,21.0,537,44.5,,,,,,,26,,502,10.8,,27.7,1
-P-10036,E-10036-01,2025-04-15T16:50:19.770970,36.4,84,124,72,95.7,14,21.0,461,,237,177,,,,,,,425,8.5,,27.7,1
-P-10036,E-10036-01,2025-04-15T04:30:41.302630,37.1,77,115,80,96.4,20,21.0,363,,,,,1.2,,5,,,330,6.7,,27.7,
-P-10036,E-10036-02,2025-04-09T17:27:19.753192,36.3,65,130,86,97.8,16,21.0,512,44.4,,,,0.8,,4,,,462,10.3,60,27.7,
-P-10036,E-10036-02,2025-04-09T19:23:43.691534,36.4,84,121,73,97.5,17,21.0,391,36.4,428,337,,,,,30,30,375,7.9,,27.7,
-P-10036,E-10036-02,2025-04-09T18:53:24.101072,36.9,47,118,76,98.5,14,21.0,428,39.0,,,,,,7,,,396,8.6,,27.7,
-P-10036,E-10036-02,2025-04-09T22:24:40.502062,36.4,101,115,82,96.5,15,21.0,390,,,,,,,7,,,384,7.2,,27.7,
-P-10036,E-10036-02,2025-04-09T19:36:36.713874,36.1,40,114,85,95.4,18,21.0,486,,228,81,,1.2,,4,,,476,9.0,,27.7,1
-P-10036,E-10036-02,2025-04-10T01:43:21.492868,36.2,83,120,77,98.2,19,21.0,514,,,,,,,,26,20,497,9.5,,27.7,1
-P-10036,E-10036-02,2025-04-10T01:40:18.309479,37.0,56,123,81,97.3,13,21.0,413,,,,,1.5,,8,,,387,8.3,,27.7,
-P-10036,E-10036-02,2025-04-09T21:26:59.053415,36.8,65,114,76,98.2,17,35.9,537,,,,0.36,,10,,,,501,9.9,,27.7,
-P-10036,E-10036-03,2025-04-07T17:27:19.753192,37.1,74,112,82,97.2,19,21.0,473,,,,,1.4,,,,,430,9.5,69,27.7,1
-P-10036,E-10036-03,2025-04-07T18:04:45.021773,37.0,66,138,78,98.0,17,21.0,494,43.4,,,,,,,,,472,9.1,,27.7,
-P-10036,E-10036-03,2025-04-07T19:46:15.288532,37.2,60,124,76,96.7,22,50.3,545,44.3,,,0.5,,2,,,,499,10.9,,27.7,
-P-10036,E-10036-03,2025-04-07T19:16:27.073097,36.8,73,139,88,97.1,14,21.0,370,44.5,,,,,,,25,21,339,6.8,,27.7,
-P-10036,E-10036-03,2025-04-07T23:03:30.064341,36.9,73,120,80,97.6,17,21.0,448,,,,,,,,,,444,9.0,66,27.7,
-P-10036,E-10036-03,2025-04-07T20:53:42.610527,36.6,85,115,80,94.5,12,21.0,389,38.7,,,,0.9,,,,,381,7.2,,27.7,
-P-10036,E-10036-03,2025-04-07T22:23:08.514785,36.7,85,122,70,98.4,20,21.0,412,40.3,,,,1.0,,,28,23,412,8.3,,27.7,
-P-10036,E-10036-03,2025-04-08T05:13:35.400819,36.3,102,112,76,98.7,20,27.8,384,,,,0.28,1.4,9,6,33,23,357,7.7,,27.7,
-P-10036,E-10036-03,2025-04-08T02:19:19.227236,37.1,78,139,86,96.7,12,21.0,377,,,,,1.3,,6,33,,344,6.9,29,27.7,1
-P-10036,E-10036-03,2025-04-08T02:52:23.846543,36.5,68,119,70,98.7,15,21.0,546,,448,325,,0.9,,4,,,506,10.1,,27.7,
-P-10037,E-10037-01,2025-04-15T17:27:19.754410,37.0,103,132,89,96.7,14,21.0,443,40.5,111,90,,,,,,,404,7.8,,36.6,1
-P-10037,E-10037-01,2025-04-15T18:14:32.400058,36.9,83,128,84,97.4,15,21.0,467,,395,,,,,7,33,25,445,8.2,77,36.6,
-P-10037,E-10037-01,2025-04-15T18:47:52.267994,37.6,101,149,96,97.0,12,32.7,491,,,,0.33,0.9,10,7,,,484,9.4,,36.6,
-P-10037,E-10037-01,2025-04-15T19:17:21.049260,37.3,78,126,86,97.6,20,21.0,519,,,,,1.5,,,,,502,9.2,,36.6,1
-P-10037,E-10037-01,2025-04-16T00:25:51.617456,37.1,87,153,96,97.5,17,21.0,363,39.3,,,,1.4,,6,,,352,7.0,,36.6,
-P-10037,E-10037-01,2025-04-16T00:01:31.746831,37.9,90,152,102,97.4,14,35.4,526,,180,125,0.35,1.2,9,7,,,518,10.1,,36.6,1
-P-10037,E-10037-02,2025-04-13T17:27:19.754410,37.1,83,144,83,96.5,22,21.0,510,39.8,,,,1.0,,,,,506,9.8,,36.6,
-P-10037,E-10037-02,2025-04-13T18:08:52.220768,36.8,76,138,90,98.3,16,21.0,537,,366,126,,1.2,,,33,,511,10.3,,36.6,
-P-10037,E-10037-02,2025-04-13T19:56:47.052721,37.1,80,140,92,97.7,15,21.0,489,,,,,,,,,,455,8.6,,36.6,
-P-10037,E-10037-02,2025-04-13T19:20:36.520914,37.6,96,136,88,97.5,13,21.0,449,,128,108,,1.2,,,,,409,8.6,,36.6,
-P-10037,E-10037-02,2025-04-13T21:35:39.600602,37.4,86,135,84,99.1,17,21.0,537,40.7,469,446,,1.2,,6,29,27,499,9.5,,36.6,1
-P-10037,E-10037-02,2025-04-13T22:21:35.601498,36.8,91,130,86,98.2,13,59.0,395,40.7,,,0.59,0.9,8,,,,357,7.0,,36.6,
-P-10037,E-10037-02,2025-04-14T00:06:41.675929,37.6,102,145,86,97.9,17,58.8,517,,,,0.59,1.4,3,,,,485,9.9,,36.6,1
-P-10037,E-10037-02,2025-04-14T00:24:53.469900,36.8,97,138,94,97.9,15,24.5,508,,353,,0.24,,3,,,,491,9.0,44,36.6,1
-P-10037,E-10037-02,2025-04-14T08:59:24.629141,36.7,90,143,79,96.6,15,33.4,421,,377,264,0.33,1.5,9,,,,398,7.4,,36.6,
-P-10037,E-10037-02,2025-04-14T08:32:29.380294,36.4,101,142,91,99.1,17,21.0,421,,,,,0.9,,,,,389,8.1,,36.6,
-P-10037,E-10037-02,2025-04-13T22:59:18.044853,37.9,82,146,77,98.1,13,21.0,496,,,,,0.9,,8,,,482,9.5,40,36.6,
-P-10037,E-10037-02,2025-04-13T23:05:38.730370,37.5,88,141,79,95.8,16,21.0,512,,,,,,,,26,26,493,9.0,,36.6,
-P-10037,E-10037-02,2025-04-14T15:25:50.440754,37.0,110,132,86,97.9,20,21.0,531,,,,,,,6,35,,507,9.4,,36.6,
-P-10037,E-10037-02,2025-04-14T17:51:31.882414,36.9,100,153,86,97.5,12,21.0,445,42.4,106,83,,1.0,,,31,30,432,8.5,,36.6,
-P-10037,E-10037-02,2025-04-14T09:35:53.757980,37.8,92,138,83,98.7,13,21.0,355,44.6,,,,0.8,,,25,21,327,6.8,77,36.6,
-P-10037,E-10037-03,2025-04-16T17:27:19.754410,37.5,81,144,102,96.5,13,21.0,389,,,,,1.1,,8,,,381,7.5,,36.6,1
-P-10037,E-10037-03,2025-04-16T18:54:39.002160,37.5,79,142,89,97.3,17,21.0,530,,,,,,,6,31,29,518,10.2,,36.6,1
-P-10037,E-10037-03,2025-04-16T20:16:15.974576,37.5,82,135,90,98.0,14,21.0,436,44.6,,,,1.4,,,26,25,436,7.7,,36.6,
-P-10037,E-10037-03,2025-04-16T23:09:05.704481,37.3,118,126,96,97.7,12,21.0,538,,123,90,,1.4,,,28,,532,9.5,,36.6,
-P-10037,E-10037-03,2025-04-16T19:54:34.971063,37.4,89,132,81,96.2,17,21.0,439,38.6,,,,1.1,,,,,397,8.4,38,36.6,1
-P-10037,E-10037-03,2025-04-16T20:24:12.184293,37.2,80,135,89,97.4,17,21.0,379,,398,340,,1.3,,,,,352,7.3,,36.6,1
-P-10037,E-10037-03,2025-04-17T00:42:29.648369,37.4,83,138,93,97.6,20,21.0,519,40.9,,,,0.9,,,,,486,10.0,,36.6,
-P-10037,E-10037-03,2025-04-16T23:11:24.930966,36.5,81,124,83,96.8,12,21.0,350,,488,136,,0.9,,,,,328,6.2,58,36.6,
-P-10037,E-10037-03,2025-04-16T22:31:33.014746,36.7,122,148,97,95.0,22,49.5,505,,,,0.49,,7,7,,,469,9.7,,36.6,
-P-10037,E-10037-03,2025-04-17T09:35:18.810943,36.8,87,132,90,98.4,15,21.0,444,43.1,291,279,,1.4,,4,27,,438,7.8,49,36.6,
-P-10038,E-10038-01,2025-04-15T17:27:19.754410,36.1,82,144,90,92.6,12,21.0,425,43.8,,,,1.1,,,26,20,425,6.9,,28.3,
-P-10038,E-10038-01,2025-04-15T18:00:37.915450,36.4,81,134,84,96.4,18,21.0,375,44.2,,,,1.2,,,,,368,5.7,51,28.3,
-P-10038,E-10038-01,2025-04-15T20:16:14.938769,37.5,74,138,95,96.4,12,21.0,546,39.2,,,,,,,,,536,8.3,,28.3,
-P-10038,E-10038-01,2025-04-15T20:19:46.783377,37.5,71,128,85,96.0,18,21.0,381,,,,,1.0,,,,,360,5.8,,28.3,1
-P-10038,E-10038-01,2025-04-15T23:58:38.760443,36.5,85,136,81,97.8,18,21.0,474,,373,364,,1.0,,4,,,473,7.2,,28.3,
-P-10038,E-10038-01,2025-04-16T01:53:25.267234,36.2,84,140,95,97.4,16,21.0,438,37.7,,,,,,,,,436,7.1,,28.3,1
-P-10038,E-10038-01,2025-04-15T22:20:52.523666,37.0,89,149,91,97.8,12,28.5,510,,,,0.28,,10,,,,478,8.3,42,28.3,1
-P-10038,E-10038-01,2025-04-16T05:21:36.162174,36.3,42,125,91,99.2,15,21.0,495,42.4,180,119,,0.9,,5,27,27,478,7.5,,28.3,
-P-10038,E-10038-01,2025-04-16T06:38:39.986531,36.3,76,136,90,98.9,12,21.0,414,,137,107,,,,,,,393,6.3,56,28.3,1
-P-10038,E-10038-01,2025-04-16T05:40:50.018229,36.1,71,145,89,97.6,16,21.0,524,40.5,,,,,,7,,,493,7.9,62,28.3,
-P-10038,E-10038-01,2025-04-16T13:20:01.330562,36.1,80,132,85,97.7,15,21.0,387,44.5,168,124,,,,,35,,352,5.9,77,28.3,
-P-10038,E-10038-01,2025-04-15T23:10:03.470020,37.0,75,129,89,99.3,19,21.0,425,,,,,1.4,,,29,24,412,6.9,63,28.3,
-P-10038,E-10038-02,2025-04-13T17:27:19.754410,37.9,58,136,104,98.0,13,21.0,390,,188,125,,0.8,,6,,,352,5.9,,28.3,
-P-10038,E-10038-02,2025-04-13T18:23:24.079661,36.9,83,121,88,98.4,14,21.0,491,41.5,,,,,,,,,471,8.0,,28.3,1
-P-10038,E-10038-02,2025-04-13T18:34:44.620167,36.3,83,147,90,98.0,15,41.4,543,,498,140,0.41,1.3,2,,,,540,8.2,,28.3,1
-P-10038,E-10038-02,2025-04-13T23:09:11.245734,37.1,92,130,76,97.4,19,21.0,512,,115,,,,,4,,,509,7.7,,28.3,1
-P-10038,E-10038-02,2025-04-13T20:52:40.886939,36.4,71,139,93,99.0,17,21.0,422,43.5,,,,1.5,,,31,,408,6.9,53,28.3,1
-P-10038,E-10038-02,2025-04-13T21:37:04.116369,36.3,72,131,88,97.2,17,21.0,361,38.5,,,,1.3,,,,,325,5.9,,28.3,
-P-10038,E-10038-02,2025-04-14T05:26:30.048268,36.2,79,141,91,97.0,14,40.2,468,,,,0.4,,7,,32,24,465,7.6,,28.3,
-P-10038,E-10038-02,2025-04-14T02:58:14.672395,36.1,71,141,99,99.2,20,21.0,500,,,,,0.8,,,34,,473,7.6,,28.3,
-P-10038,E-10038-02,2025-04-14T01:55:37.899183,36.3,66,137,80,97.0,17,21.0,383,39.8,,,,,,,33,27,359,6.2,,28.3,
-P-10038,E-10038-02,2025-04-14T00:21:08.894488,37.3,83,163,91,96.5,19,21.0,452,,,,,1.3,,7,28,25,442,7.3,,28.3,
-P-10038,E-10038-02,2025-04-14T05:12:12.531932,36.2,70,132,79,98.8,20,21.0,453,,,,,1.1,,,,,419,6.9,,28.3,
-P-10039,E-10039-01,2025-04-13T17:27:19.754410,36.8,66,115,81,97.0,18,21.0,540,35.1,,,,,,,,,496,10.6,80,39.0,
-P-10039,E-10039-01,2025-04-13T18:16:21.206080,36.6,66,120,75,96.4,16,21.0,436,36.2,,,,,,,30,25,395,9.4,,39.0,1
-P-10039,E-10039-01,2025-04-13T20:25:54.324158,36.5,79,121,73,96.6,12,21.0,492,,446,282,,1.4,,7,,,456,9.7,,39.0,1
-P-10039,E-10039-01,2025-04-13T22:49:52.420304,36.5,70,115,70,98.9,13,21.0,534,,,,,1.1,,,,,511,10.5,,39.0,
-P-10039,E-10039-01,2025-04-13T20:32:20.129028,37.0,72,115,79,99.2,14,21.0,415,,343,210,,,,,,,406,8.2,,39.0,
-P-10039,E-10039-01,2025-04-13T22:43:13.865054,36.5,87,110,73,96.2,13,21.0,532,40.9,441,379,,,,,30,29,520,10.5,,39.0,1
-P-10039,E-10039-01,2025-04-14T02:12:13.398508,37.2,75,130,89,97.6,15,21.0,483,,243,,,1.3,,,,,448,9.5,47,39.0,
-P-10039,E-10039-01,2025-04-14T02:29:57.747523,36.4,68,126,88,96.3,18,21.0,423,,424,231,,1.4,,8,,,386,9.1,,39.0,
-P-10039,E-10039-01,2025-04-14T01:10:43.983137,36.5,73,127,82,98.7,14,21.0,458,,,,,,,4,,,444,9.9,,39.0,
-P-10039,E-10039-01,2025-04-14T04:55:42.360304,36.2,79,117,79,97.9,19,21.0,404,,,,,,,7,,,396,8.7,,39.0,1
-P-10039,E-10039-01,2025-04-14T06:52:45.717502,36.9,54,118,84,92.3,13,56.2,438,40.8,,,0.56,,4,8,31,22,413,8.6,,39.0,
-P-10039,E-10039-02,2025-04-09T17:27:19.754410,37.5,85,118,74,97.2,19,21.0,417,38.6,,,,,,7,35,,395,9.0,,39.0,
-P-10039,E-10039-02,2025-04-09T18:00:28.575420,37.9,46,114,76,97.0,17,58.1,486,,252,243,0.58,1.3,3,4,33,,477,10.5,,39.0,
-P-10039,E-10039-02,2025-04-09T20:19:36.028543,37.1,70,114,80,96.8,18,21.0,418,37.6,,,,1.0,,5,,,386,9.0,,39.0,
-P-10039,E-10039-02,2025-04-09T21:13:32.014087,37.3,72,119,78,97.5,17,21.0,449,,,,,1.2,,,,,416,8.8,,39.0,
-P-10039,E-10039-02,2025-04-09T21:13:39.510270,37.1,80,121,72,96.2,18,21.0,388,,144,,,,,,,,354,7.6,,39.0,
-P-10039,E-10039-02,2025-04-10T00:59:30.002814,36.2,82,123,73,97.1,16,21.0,474,35.6,,,,,,,,,454,9.3,,39.0,1
-P-10039,E-10039-02,2025-04-09T21:48:31.189474,37.0,72,111,82,97.3,14,21.0,414,35.2,,,,0.9,,,,,372,8.1,77,39.0,
-P-10039,E-10039-02,2025-04-10T02:08:36.243544,36.8,76,120,75,96.9,13,21.0,528,37.6,,,,,,5,,,502,11.4,79,39.0,
-P-10039,E-10039-02,2025-04-10T05:44:49.766159,36.4,84,112,74,99.4,15,21.0,503,,,,,,,,,,456,9.9,,39.0,
-P-10039,E-10039-02,2025-04-10T03:08:19.959992,36.8,65,119,82,96.3,17,21.0,535,38.4,,,,,,,,,524,10.5,,39.0,1
-P-10039,E-10039-02,2025-04-10T04:23:06.890425,36.4,112,121,78,96.3,13,21.0,535,,492,326,,0.9,,,35,20,516,11.5,33,39.0,
-P-10039,E-10039-03,2025-04-09T17:27:19.754410,36.2,85,137,92,95.2,16,21.0,410,40.8,161,95,,1.2,,4,,,398,8.1,,39.0,
-P-10039,E-10039-03,2025-04-09T18:39:20.853407,36.2,67,120,78,98.6,18,21.0,445,,228,223,,,,,31,22,440,8.8,,39.0,
-P-10039,E-10039-03,2025-04-09T19:47:45.824678,37.6,91,112,75,96.6,18,33.5,435,,,,0.34,1.1,5,6,33,21,397,8.6,,39.0,
-P-10039,E-10039-03,2025-04-09T20:04:50.818597,36.0,75,131,82,98.1,20,21.0,534,37.2,352,122,,,,,28,21,513,11.5,,39.0,
-P-10039,E-10039-03,2025-04-09T20:54:46.179140,36.9,75,121,81,97.0,16,21.0,451,35.2,,,,,,,,,448,8.9,,39.0,
-P-10040,E-10040-01,2025-04-12T17:27:19.754410,36.4,69,145,88,96.5,18,21.0,521,37.8,422,365,,0.9,,4,,,484,8.3,38,23.8,1
-P-10040,E-10040-01,2025-04-12T18:47:21.504758,37.1,53,158,102,97.4,13,21.0,447,,,,,,,6,,,415,6.7,,23.8,1
-P-10040,E-10040-01,2025-04-12T20:05:53.947249,37.1,77,148,84,97.0,16,21.0,495,36.7,,,,,,6,26,20,451,7.4,,23.8,
-P-10040,E-10040-01,2025-04-12T22:57:28.679010,36.5,77,125,91,96.9,15,26.4,396,38.3,,,0.26,1.2,9,4,28,27,383,6.3,,23.8,
-P-10040,E-10040-01,2025-04-12T21:11:09.901372,37.0,79,130,93,97.3,12,51.0,463,,,,0.51,1.2,3,,,,445,6.9,,23.8,
-P-10040,E-10040-01,2025-04-13T02:07:46.970444,37.2,68,125,81,94.6,20,21.0,410,,,,,1.0,,,,,379,6.1,,23.8,
-P-10040,E-10040-01,2025-04-13T04:54:21.146457,36.4,54,127,90,97.0,16,21.0,463,,,,,0.9,,,32,27,446,7.4,,23.8,1
-P-10041,E-10041-01,2025-04-15T17:27:19.754410,36.6,77,124,80,97.8,15,21.0,391,41.2,,,,0.8,,,26,,357,6.2,,24.4,
-P-10041,E-10041-01,2025-04-15T18:08:31.689935,36.6,80,117,78,96.2,14,21.0,461,38.3,,,,1.3,,5,,,421,6.8,,24.4,
-P-10041,E-10041-01,2025-04-15T20:26:51.622632,36.8,72,110,71,98.5,15,21.0,527,42.3,,,,1.4,,,,,519,7.8,,24.4,
-P-10041,E-10041-01,2025-04-15T21:54:13.247710,37.0,103,119,70,99.4,13,21.0,390,,,,,1.1,,5,33,,380,6.2,,24.4,
-P-10041,E-10041-01,2025-04-15T19:53:49.349029,37.1,69,115,80,97.3,12,21.0,493,,,,,,,,,,486,7.3,,24.4,
-P-10041,E-10041-01,2025-04-15T21:02:28.984830,36.4,96,120,76,99.2,18,21.0,376,,434,279,,1.0,,8,,,339,5.6,,24.4,
-P-10041,E-10041-01,2025-04-15T20:27:45.118304,36.5,65,115,82,96.5,14,21.0,397,39.4,457,,,,,5,,,383,5.9,,24.4,
-P-10041,E-10041-01,2025-04-15T22:54:17.646524,37.1,74,124,84,96.3,17,21.0,515,40.9,,,,,,8,,,513,7.7,,24.4,
-P-10041,E-10041-01,2025-04-15T23:45:25.137244,36.1,66,115,77,99.2,14,48.7,513,39.5,143,90,0.49,,3,4,25,20,503,8.2,,24.4,
-P-10041,E-10041-01,2025-04-16T06:38:09.555704,36.8,43,124,82,97.8,20,21.0,431,36.4,,,,,,5,,,416,6.9,,24.4,
-P-10041,E-10041-01,2025-04-16T00:28:06.857694,37.2,75,124,79,96.9,19,21.0,375,,150,131,,,,5,,,362,5.6,,24.4,
-P-10041,E-10041-02,2025-04-09T17:27:19.754410,36.9,71,118,79,96.9,17,21.0,446,36.6,,,,,,4,33,,432,6.6,,24.4,1
-P-10041,E-10041-02,2025-04-09T18:42:59.373446,36.2,69,115,76,96.5,19,21.0,391,,259,145,,1.4,,,,,359,6.2,,24.4,
-P-10041,E-10041-02,2025-04-09T18:50:34.295856,36.4,82,131,77,96.5,20,21.0,382,35.4,,,,1.0,,6,29,21,370,6.1,,24.4,
-P-10041,E-10041-02,2025-04-09T21:22:19.331337,36.9,69,111,85,92.4,16,21.0,538,,270,183,,1.2,,8,33,,503,8.0,26,24.4,
-P-10041,E-10041-02,2025-04-09T23:38:18.701170,37.5,84,137,89,97.4,17,21.0,368,,382,194,,1.3,,4,34,,362,5.5,,24.4,
-P-10041,E-10041-02,2025-04-09T23:43:15.323762,36.2,67,113,83,96.6,20,24.4,474,,,,0.24,1.4,6,6,,,437,7.5,,24.4,
-P-10041,E-10041-02,2025-04-10T00:55:11.632042,36.7,70,110,80,98.3,17,58.5,472,44.0,,,0.58,,6,8,34,20,453,7.5,78,24.4,
-P-10042,E-10042-01,2025-04-16T17:27:19.755409,37.5,99,121,89,94.9,15,21.0,518,,391,173,,,,,26,,483,9.0,,20.3,
-P-10042,E-10042-01,2025-04-16T18:57:51.208105,37.7,86,137,96,98.4,17,21.0,516,41.8,176,,,1.0,,,,,467,8.3,71,20.3,
-P-10042,E-10042-01,2025-04-16T20:32:01.951223,36.7,88,141,80,96.2,12,21.0,358,41.9,,,,1.1,,,30,20,330,5.7,,20.3,
-P-10042,E-10042-01,2025-04-16T19:07:39.661575,36.6,86,124,82,97.8,15,21.0,374,,,,,,,7,,,362,6.5,,20.3,
-P-10042,E-10042-01,2025-04-16T23:09:45.091127,37.5,67,155,94,99.4,19,21.0,402,41.8,226,98,,1.4,,8,,,402,6.9,,20.3,
-P-10042,E-10042-01,2025-04-17T01:10:48.251794,37.5,87,160,96,98.2,18,21.0,432,35.7,,,,1.3,,8,,,412,6.9,,20.3,
-P-10042,E-10042-01,2025-04-17T05:26:32.132249,37.9,79,144,96,96.7,17,21.0,427,,,,,1.1,,,29,25,414,6.8,,20.3,
-P-10042,E-10042-01,2025-04-17T04:03:05.058234,37.1,95,134,81,98.5,15,21.0,523,,,,,0.9,,,35,29,481,8.4,,20.3,
-P-10042,E-10042-02,2025-04-16T17:27:19.755409,37.2,78,137,90,92.6,17,21.0,540,39.2,,,,1.4,,6,,,511,9.3,,20.3,
-P-10042,E-10042-02,2025-04-16T19:18:43.481964,37.7,78,135,95,99.3,22,21.0,374,40.3,,,,,,5,29,,363,6.5,,20.3,
-P-10042,E-10042-02,2025-04-16T20:35:46.060798,37.5,75,163,97,96.2,14,21.0,356,43.3,,,,1.0,,,28,,342,6.2,,20.3,1
-P-10042,E-10042-02,2025-04-16T19:52:03.383915,36.7,72,134,87,97.2,16,21.0,500,42.4,299,278,,,,,,,476,8.6,,20.3,
-P-10042,E-10042-02,2025-04-16T22:19:56.806031,37.1,78,137,90,95.9,13,21.0,350,40.4,,,,,,,32,28,335,5.6,,20.3,
-P-10042,E-10042-02,2025-04-16T21:57:53.915212,37.3,94,142,97,96.1,20,21.0,408,,160,147,,,,5,,,371,6.5,,20.3,
-P-10042,E-10042-02,2025-04-17T04:08:00.742800,37.1,71,138,91,96.8,14,21.0,547,,,,,0.8,,,30,30,547,9.5,43,20.3,1
-P-10042,E-10042-02,2025-04-17T06:24:44.423416,37.4,79,140,77,96.6,15,21.0,467,,,,,,,8,,,462,8.1,,20.3,
-P-10042,E-10042-02,2025-04-16T22:07:00.305440,37.2,100,137,89,98.0,18,21.0,392,,275,142,,0.8,,,,,367,6.3,,20.3,
-P-10042,E-10042-02,2025-04-17T03:58:51.831903,37.4,82,135,96,99.2,16,21.0,364,,,,,0.9,,6,25,22,343,5.8,,20.3,
-P-10042,E-10042-02,2025-04-17T03:50:52.250757,36.5,82,151,99,96.8,17,21.0,429,40.3,,,,1.4,,,,,409,6.9,,20.3,
-P-10042,E-10042-02,2025-04-17T11:32:24.696274,37.2,78,129,83,94.3,17,21.0,462,,,,,,,,,,462,7.4,,20.3,
-P-10042,E-10042-03,2025-04-13T17:27:19.755409,37.4,106,136,86,97.9,12,21.0,359,,,,,1.0,,,,,337,5.8,43,20.3,1
-P-10042,E-10042-03,2025-04-13T18:06:27.673119,36.9,92,140,100,98.4,17,21.0,386,40.2,,,,,,,,,381,6.2,,20.3,1
-P-10042,E-10042-03,2025-04-13T18:43:57.350051,36.8,88,129,86,96.1,20,21.0,439,,,,,1.1,,,34,20,437,7.6,,20.3,
-P-10042,E-10042-03,2025-04-13T19:55:07.861902,37.0,47,141,84,93.3,21,21.0,477,35.3,494,171,,0.9,,7,34,23,469,8.2,,20.3,
-P-10042,E-10042-03,2025-04-13T23:06:50.795569,38.0,85,134,80,96.0,18,21.0,360,41.7,,,,0.8,,,34,,352,6.2,,20.3,
-P-10042,E-10042-03,2025-04-14T01:41:45.922226,37.7,111,158,96,97.9,19,21.0,456,35.5,,,,,,5,,,433,7.9,,20.3,1
-P-10042,E-10042-03,2025-04-14T03:34:18.019155,37.2,95,125,89,97.7,19,21.0,461,39.3,461,,,0.9,,5,,,415,7.4,,20.3,
-P-10042,E-10042-03,2025-04-13T22:10:06.002741,37.5,85,148,86,97.4,19,21.0,400,37.5,119,107,,1.4,,8,,,363,6.9,,20.3,
-P-10042,E-10042-03,2025-04-14T07:04:11.041565,37.2,94,141,91,96.8,13,21.0,538,,,,,1.3,,,26,25,504,9.3,66,20.3,
-P-10042,E-10042-03,2025-04-14T02:28:11.250970,37.1,77,133,86,99.4,14,21.0,354,,,,,1.3,,5,35,28,354,6.1,45,20.3,1
-P-10042,E-10042-03,2025-04-14T07:45:26.121624,37.1,121,137,88,98.0,20,21.0,355,,122,83,,,,4,,,344,6.1,,20.3,
-P-10042,E-10042-03,2025-04-14T04:45:32.292306,37.1,91,139,91,96.5,20,34.9,367,,,,0.35,,6,,,,349,6.3,79,20.3,
-P-10042,E-10042-03,2025-04-14T02:25:30.590940,37.3,103,145,100,98.0,20,21.0,429,,400,128,,1.4,,4,31,,429,7.4,,20.3,
-P-10043,E-10043-01,2025-04-12T17:27:19.755409,36.9,69,112,79,97.8,18,21.0,450,35.6,,,,1.4,,6,,,432,8.5,,35.9,
-P-10043,E-10043-01,2025-04-12T19:06:33.731562,37.3,96,114,80,96.0,12,21.0,403,,,,,,,4,,,380,7.6,,35.9,
-P-10043,E-10043-01,2025-04-12T19:02:53.123502,37.0,77,119,77,97.7,18,58.1,515,36.8,,,0.58,0.9,5,,33,,492,9.7,34,35.9,
-P-10043,E-10043-01,2025-04-12T22:02:19.197379,37.0,76,116,79,96.2,13,21.0,506,44.9,450,391,,,,,31,21,458,10.4,,35.9,
-P-10043,E-10043-01,2025-04-12T20:57:26.719568,36.3,76,125,70,98.8,15,21.0,363,35.6,,,,,,,30,22,331,6.8,,35.9,1
-P-10043,E-10043-01,2025-04-13T02:53:42.646467,37.1,77,136,91,97.4,14,46.6,362,35.2,343,87,0.47,1.1,6,,,,342,6.8,,35.9,
-P-10043,E-10043-01,2025-04-13T02:01:17.765939,36.5,83,125,74,97.2,14,21.0,467,38.4,175,82,,1.3,,5,,,438,9.6,,35.9,
-P-10043,E-10043-01,2025-04-13T06:35:27.589582,36.1,56,114,83,98.8,20,57.3,369,,383,345,0.57,,2,5,,,362,7.6,32,35.9,
-P-10043,E-10043-01,2025-04-12T22:24:24.446871,36.9,74,115,76,97.2,17,21.0,502,,,,,1.3,,7,31,23,501,9.4,50,35.9,
-P-10043,E-10043-01,2025-04-13T03:24:10.768258,37.0,76,110,76,97.7,18,28.7,455,,,,0.29,,10,,25,,416,8.5,,35.9,
-P-10043,E-10043-01,2025-04-13T01:49:35.575856,36.9,77,115,79,97.2,14,21.0,401,,,,,1.1,,,25,20,392,7.5,,35.9,
-P-10043,E-10043-02,2025-04-07T17:27:19.755409,36.8,84,111,84,98.4,12,21.0,484,37.6,398,154,,1.1,,7,,,460,9.9,,35.9,1
-P-10043,E-10043-02,2025-04-07T19:13:28.868499,36.1,74,116,76,99.3,19,21.0,474,42.1,,,,1.0,,,34,31,457,8.9,,35.9,
-P-10043,E-10043-02,2025-04-07T18:44:53.134386,36.3,72,126,88,97.2,17,21.0,527,,441,299,,1.2,,,30,21,480,10.8,,35.9,
-P-10043,E-10043-02,2025-04-07T19:03:32.968967,36.1,83,116,80,99.0,17,21.0,412,40.1,,,,1.0,,5,,,395,7.7,,35.9,
-P-10043,E-10043-02,2025-04-07T20:13:25.973204,36.0,77,128,78,98.3,19,21.0,409,37.6,,,,1.5,,,,,392,7.7,23,35.9,
-P-10043,E-10043-02,2025-04-08T00:05:15.007218,37.6,66,117,81,98.5,13,21.0,521,,108,86,,1.4,,8,25,20,491,9.8,,35.9,
-P-10043,E-10043-02,2025-04-07T23:57:58.225571,36.8,71,130,91,97.1,12,21.0,522,,,,,1.2,,6,31,24,500,9.8,,35.9,
-P-10043,E-10043-02,2025-04-07T21:37:43.870582,36.1,65,124,84,99.1,18,54.3,441,,,,0.54,,4,,,,403,9.0,,35.9,
-P-10043,E-10043-02,2025-04-08T08:35:08.034079,36.9,69,125,74,96.2,15,21.0,403,,,,,1.0,,7,26,,394,7.6,,35.9,
-P-10044,E-10044-01,2025-04-15T17:27:19.755409,36.5,82,155,88,97.3,18,21.0,423,43.7,,,,1.0,,,33,,406,8.1,,28.8,
-P-10044,E-10044-01,2025-04-15T18:38:32.129588,37.1,81,161,92,98.6,19,21.0,426,,222,194,,1.3,,,,,409,7.5,,28.8,1
-P-10044,E-10044-01,2025-04-15T19:37:07.542568,36.8,74,141,102,96.4,20,21.0,508,,,,,,,7,,,495,9.0,27,28.8,1
-P-10044,E-10044-01,2025-04-15T20:22:08.220878,37.0,74,158,89,96.3,19,21.0,406,44.3,,,,1.3,,,,,390,7.8,69,28.8,1
-P-10044,E-10044-01,2025-04-15T22:00:46.986945,37.6,95,138,92,96.6,12,21.0,440,35.5,,,,,,,29,26,398,8.5,43,28.8,
-P-10044,E-10044-01,2025-04-16T03:14:12.547042,36.8,79,142,90,99.2,19,34.3,517,,,,0.34,,9,,,,470,9.2,,28.8,
-P-10044,E-10044-01,2025-04-16T01:23:03.581838,36.8,72,154,94,99.5,20,21.0,528,42.1,,,,,,,,,500,10.2,,28.8,1
-P-10044,E-10044-01,2025-04-16T06:03:43.481917,37.0,95,145,87,92.4,18,21.0,539,,428,134,,1.1,,,35,23,523,10.4,,28.8,
-P-10044,E-10044-01,2025-04-15T22:45:41.004358,36.1,89,155,98,99.3,15,57.4,417,,294,237,0.57,1.2,2,5,35,,377,7.4,,28.8,
-P-10044,E-10044-01,2025-04-16T00:25:07.088526,36.2,97,127,84,99.0,16,21.0,498,35.2,,,,1.4,,,,,479,8.8,,28.8,1
-P-10044,E-10044-01,2025-04-16T13:14:25.382481,36.9,102,127,89,99.3,18,21.0,421,,,,,1.5,,7,,,382,8.1,68,28.8,
-P-10044,E-10044-01,2025-04-16T12:47:18.296633,37.0,72,159,96,97.5,17,21.0,500,,337,304,,1.3,,4,,,455,8.9,,28.8,
-P-10044,E-10044-01,2025-04-16T10:50:00.144147,37.2,114,142,98,98.6,20,21.0,449,44.8,,,,1.1,,,,,421,8.6,,28.8,1
-P-10044,E-10044-01,2025-04-16T11:11:04.873950,36.1,105,123,89,98.9,18,21.0,433,36.2,131,97,,,,7,34,,410,8.3,,28.8,
-P-10044,E-10044-01,2025-04-16T02:19:46.582088,36.9,118,136,93,92.4,12,42.5,474,41.4,479,272,0.42,1.5,5,,,,461,8.4,,28.8,
-P-10044,E-10044-02,2025-04-11T17:27:19.755409,36.8,81,123,92,99.0,13,21.0,544,41.2,360,154,,1.3,,8,,,513,9.6,54,28.8,
-P-10044,E-10044-02,2025-04-11T18:22:50.148848,36.6,85,121,77,92.9,17,21.0,437,,,,,1.2,,,,,418,8.4,,28.8,
-P-10044,E-10044-02,2025-04-11T21:19:21.819036,37.6,84,135,89,99.0,17,21.0,438,,,,,1.2,,,,,435,8.4,,28.8,1
-P-10044,E-10044-02,2025-04-11T21:20:05.506029,36.8,89,131,96,97.8,20,56.8,418,40.4,349,240,0.57,,7,5,,,400,7.4,,28.8,1
-P-10044,E-10044-02,2025-04-11T23:49:12.038444,36.1,94,124,94,97.3,15,21.0,472,37.1,,,,,,,,,466,9.1,,28.8,
-P-10044,E-10044-02,2025-04-11T22:31:08.125022,36.2,96,125,88,96.9,15,21.0,532,,318,,,1.4,,,29,29,487,10.2,68,28.8,
-P-10044,E-10044-02,2025-04-12T03:44:44.542831,37.0,80,137,84,99.1,12,21.0,431,,,,,,,,32,32,425,7.6,,28.8,
-P-10044,E-10044-02,2025-04-11T21:37:04.705562,36.1,81,162,93,99.1,15,21.0,479,40.8,240,,,0.9,,,,,467,8.5,,28.8,
-P-10044,E-10044-02,2025-04-12T04:11:38.263104,36.6,99,154,94,97.9,14,21.0,443,44.7,327,,,,,,,,432,7.9,,28.8,
-P-10044,E-10044-02,2025-04-12T07:35:40.279926,36.5,76,138,92,99.3,13,47.8,474,37.5,,,0.48,,5,8,,,430,8.4,,28.8,
-P-10044,E-10044-02,2025-04-12T00:59:37.145528,36.4,93,133,84,99.5,19,21.0,507,40.7,237,202,,,,,,,484,9.8,,28.8,
-P-10044,E-10044-02,2025-04-12T00:27:57.589855,36.2,87,128,84,97.1,20,21.0,446,44.1,,,,1.3,,,,,406,7.9,,28.8,
-P-10044,E-10044-02,2025-04-12T10:13:59.341455,36.7,85,124,91,98.8,15,21.0,523,,,,,1.3,,,,,512,10.1,,28.8,
-P-10044,E-10044-02,2025-04-12T19:18:36.308284,37.2,107,129,85,98.4,18,21.0,465,,194,,,,,,,,462,9.0,,28.8,
-P-10045,E-10045-01,2025-04-13T17:27:19.755409,36.3,84,140,95,97.4,16,21.0,391,,236,,,1.5,,,27,,365,6.8,,22.1,
-P-10045,E-10045-01,2025-04-13T19:21:13.294996,36.8,85,144,92,95.3,12,21.0,537,,,,,0.8,,,,,489,8.7,,22.1,
-P-10045,E-10045-01,2025-04-13T18:56:55.454125,36.9,73,141,83,97.4,17,21.0,358,,,,,1.3,,,31,26,328,5.8,,22.1,
-P-10045,E-10045-01,2025-04-13T22:18:50.911999,36.5,98,137,93,98.2,15,47.9,433,,,,0.48,0.8,8,,,,403,7.0,,22.1,
-P-10045,E-10045-01,2025-04-13T22:51:08.108372,36.7,100,130,84,96.4,20,21.0,419,36.3,,,,1.3,,,,,417,6.8,,22.1,
-P-10045,E-10045-01,2025-04-14T02:04:26.014522,36.7,98,131,88,91.7,14,21.0,350,,321,303,,0.8,,7,35,35,332,6.1,,22.1,1
-P-10045,E-10045-01,2025-04-13T22:29:11.172190,36.2,80,137,89,97.5,19,40.3,407,,,,0.4,1.1,6,,25,,386,6.6,,22.1,
-P-10045,E-10045-01,2025-04-14T04:52:13.203650,36.9,92,138,90,98.5,19,21.0,467,,333,132,,1.2,,,,,463,8.2,,22.1,1
-P-10045,E-10045-01,2025-04-13T23:31:26.471587,36.0,88,135,87,97.4,13,29.5,377,35.6,,,0.29,1.3,10,,31,29,359,6.1,,22.1,
-P-10045,E-10045-01,2025-04-14T07:40:04.693106,36.8,81,141,80,96.5,17,21.0,372,,,,,,,,,,357,6.0,,22.1,
-P-10045,E-10045-01,2025-04-14T07:51:37.257554,36.7,88,138,86,97.9,15,21.0,524,37.1,,,,0.9,,8,,,505,8.5,,22.1,
-P-10045,E-10045-01,2025-04-13T23:41:50.246971,37.1,75,128,89,97.8,12,21.0,532,,,,,,,,28,26,486,8.6,,22.1,
-P-10045,E-10045-01,2025-04-14T10:05:14.219024,37.1,83,130,91,98.8,16,21.0,507,,205,,,1.0,,,31,30,477,8.9,,22.1,
-P-10045,E-10045-01,2025-04-14T19:01:05.143919,36.9,76,130,78,99.0,13,21.0,366,42.3,,,,,,7,,,363,5.9,,22.1,
-P-10046,E-10046-01,2025-04-13T17:27:19.756409,36.2,93,135,92,96.2,20,48.4,474,39.4,,,0.48,1.3,6,6,25,,462,7.2,,16.5,
-P-10046,E-10046-01,2025-04-13T18:47:16.297265,37.2,89,147,93,99.1,20,24.2,424,39.6,,,0.24,1.1,2,,,,417,6.0,66,16.5,1
-P-10046,E-10046-01,2025-04-13T18:28:01.288440,36.4,86,157,90,96.3,16,37.5,371,41.7,,,0.38,,8,7,,,368,5.6,,16.5,
-P-10046,E-10046-01,2025-04-13T19:50:37.631456,36.3,105,147,103,98.2,19,21.0,409,,210,190,,1.3,,,,,397,6.2,,16.5,1
-P-10046,E-10046-01,2025-04-14T01:20:49.135493,37.1,77,136,91,96.2,19,21.0,456,,,,,,,,,,449,6.5,48,16.5,
-P-10046,E-10046-01,2025-04-14T02:14:31.979744,36.1,87,140,104,96.3,17,21.0,396,,,,,0.9,,,25,21,389,5.6,,16.5,1
-P-10046,E-10046-02,2025-04-14T17:27:19.756409,36.4,72,125,86,99.4,19,21.0,426,,,,,1.2,,,,,423,6.1,,16.5,
-P-10046,E-10046-02,2025-04-14T19:15:54.778518,36.6,99,137,85,96.1,13,21.0,446,,327,,,1.3,,,31,,438,6.4,,16.5,
-P-10046,E-10046-02,2025-04-14T21:26:30.560148,36.2,85,135,96,98.9,17,21.0,416,,,,,1.0,,8,,,403,5.9,,16.5,1
-P-10046,E-10046-02,2025-04-14T19:38:28.778039,36.4,50,128,88,98.7,19,21.0,526,35.9,,,,,,5,,,500,7.5,,16.5,
-P-10046,E-10046-02,2025-04-14T20:19:03.577627,36.1,79,148,78,92.5,12,21.0,455,42.1,,,,,,,31,31,422,6.9,,16.5,1
-P-10046,E-10046-02,2025-04-14T23:57:19.276196,36.9,84,139,80,96.3,18,21.0,383,,125,124,,1.5,,,31,29,370,5.5,,16.5,
-P-10046,E-10046-02,2025-04-15T00:26:09.142811,36.9,86,132,90,97.9,13,21.0,383,42.7,,,,1.2,,4,,,371,5.5,,16.5,
-P-10046,E-10046-02,2025-04-15T04:43:41.380680,36.3,115,142,90,97.3,20,21.0,523,39.4,,,,,,,,,501,7.4,28,16.5,
-P-10046,E-10046-02,2025-04-15T08:34:18.609578,37.1,74,137,86,98.8,12,21.0,470,44.3,,,,,,,,,423,7.2,,16.5,
-P-10046,E-10046-02,2025-04-15T08:57:22.515609,36.1,85,133,96,99.2,13,21.0,504,,,,,,,6,35,26,465,7.2,79,16.5,
-P-10046,E-10046-02,2025-04-14T23:45:30.219162,37.0,84,139,86,97.5,20,21.0,522,43.5,,,,1.1,,,,,519,7.9,,16.5,1
-P-10046,E-10046-02,2025-04-15T01:25:13.827384,36.2,81,123,82,97.7,16,21.0,509,38.2,,,,,,7,35,34,479,7.7,77,16.5,1
-P-10046,E-10046-02,2025-04-15T11:16:45.629222,36.7,59,127,89,98.9,17,28.1,449,44.1,,,0.28,1.5,5,6,,,432,6.4,,16.5,
-P-10046,E-10046-02,2025-04-15T15:05:01.152516,37.1,86,139,102,98.2,18,21.0,490,44.6,360,183,,,,,26,25,445,7.5,,16.5,
-P-10046,E-10046-02,2025-04-15T07:45:20.315012,37.5,96,133,93,98.8,13,21.0,366,39.7,,,,,,,,,335,5.2,74,16.5,
-P-10046,E-10046-03,2025-04-05T17:27:19.756409,36.0,99,126,93,99.0,12,21.0,379,36.7,233,210,,,,,35,,362,5.4,,16.5,1
-P-10046,E-10046-03,2025-04-05T19:01:53.643112,37.6,90,144,91,98.8,16,21.0,360,,264,138,,1.5,,,,,337,5.1,,16.5,
-P-10046,E-10046-03,2025-04-05T20:11:54.788485,36.7,99,146,84,92.3,20,21.0,474,,,,,1.0,,,,,463,6.7,,16.5,
-P-10046,E-10046-03,2025-04-05T19:19:02.018935,36.8,86,142,77,93.9,17,21.0,480,,286,173,,1.0,,,28,26,457,6.8,,16.5,1
-P-10046,E-10046-03,2025-04-05T20:18:54.564017,36.7,75,123,84,96.1,19,21.0,381,,451,133,,,,,25,,350,5.8,,16.5,
-P-10046,E-10046-03,2025-04-05T21:20:37.460581,37.1,105,138,76,96.3,17,40.2,372,36.2,,,0.4,,5,,35,24,346,5.7,,16.5,
-P-10046,E-10046-03,2025-04-05T20:43:35.438607,37.1,81,132,88,92.4,17,21.0,422,42.7,,,,1.5,,,,,414,6.4,,16.5,1
-P-10046,E-10046-03,2025-04-06T05:11:57.588895,37.1,77,126,89,96.8,18,21.0,443,,270,121,,,,5,30,25,439,6.3,33,16.5,
-P-10046,E-10046-03,2025-04-06T05:01:21.351436,36.6,93,152,98,99.0,19,21.0,390,39.3,,,,,,,26,,378,5.9,50,16.5,
-P-10046,E-10046-03,2025-04-06T08:06:23.265156,36.3,74,134,85,98.0,18,21.0,364,44.1,,,,,,8,25,25,352,5.2,,16.5,
-P-10046,E-10046-03,2025-04-06T12:46:25.199035,36.9,90,135,94,98.9,17,21.0,384,,,,,,,5,,,345,5.8,52,16.5,
-P-10046,E-10046-03,2025-04-06T06:18:56.839601,36.6,85,148,96,99.4,13,21.0,478,,,,,1.3,,,,,473,6.8,,16.5,1
-P-10046,E-10046-03,2025-04-06T07:19:29.573933,36.1,78,140,93,98.3,15,21.0,399,36.4,,,,1.0,,8,,,384,6.1,69,16.5,
-P-10046,E-10046-03,2025-04-06T14:28:52.253703,37.1,95,137,81,97.0,12,21.0,544,44.9,,,,,,5,,,537,7.7,46,16.5,1
-P-10047,E-10047-01,2025-04-15T17:27:19.756409,37.1,78,117,85,98.0,16,21.0,452,,157,92,,0.8,,5,,,426,10.3,,28.5,
-P-10047,E-10047-01,2025-04-15T18:23:25.153899,37.0,68,117,78,98.0,17,21.0,365,,,,,1.3,,,,,351,7.5,,28.5,1
-P-10047,E-10047-01,2025-04-15T19:50:03.729428,36.0,74,122,83,96.4,18,21.0,422,,,,,0.9,,,26,23,415,9.6,37,28.5,
-P-10047,E-10047-01,2025-04-15T21:59:02.021188,36.9,75,118,79,98.7,14,36.2,516,,335,309,0.36,,8,6,,,482,11.7,,28.5,
-P-10047,E-10047-01,2025-04-15T23:20:17.289356,36.0,81,110,75,96.5,18,21.0,353,,234,233,,,,,35,29,341,8.0,,28.5,
-P-10047,E-10047-01,2025-04-15T21:22:48.709640,37.0,76,118,71,96.3,14,21.0,454,37.8,,,,1.0,,6,25,25,426,9.3,,28.5,
-P-10047,E-10047-01,2025-04-15T21:23:50.078434,37.1,66,115,71,96.4,15,37.3,477,,197,120,0.37,,2,,,,453,9.8,30,28.5,
-P-10047,E-10047-01,2025-04-15T23:06:31.032132,36.4,74,111,80,98.9,18,21.0,531,,317,210,,1.4,,,,,519,12.0,71,28.5,
-P-10047,E-10047-01,2025-04-15T21:50:32.014787,36.2,82,114,72,99.0,19,21.0,370,38.5,,,,,,6,,,362,8.4,52,28.5,
-P-10047,E-10047-01,2025-04-15T23:53:15.251495,36.1,83,116,70,96.9,20,21.0,454,38.8,308,166,,1.0,,7,,,454,9.3,,28.5,
-P-10047,E-10047-01,2025-04-16T11:23:18.022355,36.6,70,115,70,96.5,19,21.0,456,,477,422,,1.4,,,,,428,9.4,,28.5,
-P-10048,E-10048-01,2025-04-16T17:27:19.756409,36.7,74,129,98,97.7,19,21.0,494,,418,,,1.4,,6,,,479,8.8,,31.2,
-P-10048,E-10048-01,2025-04-16T18:15:56.673906,36.7,71,164,101,96.6,13,21.0,464,35.9,,,,1.5,,8,,,436,7.7,,31.2,
-P-10048,E-10048-01,2025-04-16T20:26:22.878767,36.7,103,130,91,97.9,19,21.0,480,,278,232,,1.2,,,31,21,439,8.6,44,31.2,
-P-10048,E-10048-01,2025-04-16T22:19:02.317582,36.1,72,141,86,96.5,18,21.0,524,,203,,,1.0,,,,,477,9.4,,31.2,
-P-10048,E-10048-01,2025-04-16T21:36:59.982927,36.4,85,159,97,98.4,20,21.0,454,35.8,,,,1.0,,6,32,28,431,7.5,69,31.2,
-P-10048,E-10048-01,2025-04-16T22:01:48.977643,36.2,86,134,90,97.4,13,21.0,424,,,,,1.4,,,,,424,7.0,29,31.2,
-P-10049,E-10049-01,2025-04-15T17:27:19.756409,36.9,84,125,87,97.2,19,29.4,540,,353,80,0.29,1.1,10,8,,,489,11.4,,22.0,
-P-10049,E-10049-01,2025-04-15T19:21:08.896623,36.7,71,136,85,96.9,19,21.0,515,,175,135,,1.1,,,29,22,472,10.8,27,22.0,
-P-10049,E-10049-01,2025-04-15T20:46:50.993000,37.0,84,156,89,96.3,16,21.0,363,43.8,,,,,,,,,335,7.0,50,22.0,1
-P-10049,E-10049-01,2025-04-15T22:23:00.436601,36.0,75,129,90,99.1,20,21.0,418,39.9,,,,0.9,,,30,27,381,8.0,,22.0,
-P-10049,E-10049-01,2025-04-16T00:38:56.060053,36.1,70,128,94,99.5,19,21.0,428,36.3,224,181,,,,6,,,394,9.0,47,22.0,
-P-10049,E-10049-01,2025-04-15T22:08:26.869261,37.1,75,132,94,99.1,20,21.0,471,,,,,,,6,,,425,9.9,,22.0,
-P-10049,E-10049-02,2025-04-11T17:27:19.756409,36.5,81,144,87,96.6,12,30.8,456,37.2,,,0.31,,5,,,,432,8.8,,22.0,
-P-10049,E-10049-02,2025-04-11T17:59:32.465482,36.9,83,142,86,98.7,12,21.0,438,44.6,402,352,,,,4,,,429,9.2,,22.0,1
-P-10049,E-10049-02,2025-04-11T18:43:09.177832,37.0,81,129,96,99.0,16,21.0,416,,,,,0.8,,,,,380,8.7,,22.0,
-P-10049,E-10049-02,2025-04-11T22:03:54.681589,36.9,78,138,85,98.9,14,21.0,420,,,,,1.2,,5,32,21,381,8.8,48,22.0,1
-P-10049,E-10049-02,2025-04-11T21:43:49.007104,36.5,80,158,98,97.7,18,21.0,500,,,,,1.0,,5,,,460,9.6,,22.0,1
-P-10049,E-10049-02,2025-04-12T00:21:12.016920,36.6,65,133,84,96.4,13,21.0,496,39.5,150,129,,,,4,,,494,10.4,,22.0,
-P-10049,E-10049-02,2025-04-11T22:36:35.791168,36.3,65,145,95,98.0,15,21.0,439,41.0,475,,,1.4,,8,,,427,9.2,,22.0,
-P-10049,E-10049-02,2025-04-11T23:14:54.212843,36.6,83,143,91,99.1,20,21.0,399,39.6,,,,0.9,,,,,369,7.7,,22.0,
-P-10049,E-10049-02,2025-04-12T08:54:33.886339,37.6,83,142,84,99.2,12,21.0,427,36.5,,,,1.0,,,,,424,9.0,,22.0,
-P-10049,E-10049-02,2025-04-11T22:12:45.446807,36.5,111,154,100,99.4,18,49.1,408,,364,229,0.49,1.1,5,,,,401,7.8,,22.0,
-P-10049,E-10049-02,2025-04-12T06:41:15.888266,37.1,66,155,97,97.2,17,21.0,401,41.9,,,,1.1,,8,,,398,8.4,,22.0,
-P-10050,E-10050-01,2025-04-12T17:27:19.756409,36.1,76,134,82,92.7,12,56.6,492,,,,0.57,0.8,6,,27,22,463,7.4,,18.1,
-P-10050,E-10050-01,2025-04-12T18:45:46.130869,36.6,83,130,85,96.5,14,21.0,415,44.5,,,,1.3,,,,,393,6.7,65,18.1,
-P-10050,E-10050-01,2025-04-12T18:42:08.714914,36.1,74,119,77,98.5,14,21.0,496,35.2,,,,1.2,,,27,,474,8.1,,18.1,1
-P-10050,E-10050-01,2025-04-12T22:16:13.814296,36.1,77,112,80,96.7,15,21.0,487,,,,,,,7,,,454,7.4,26,18.1,
-P-10050,E-10050-01,2025-04-12T23:11:34.546531,36.9,73,117,74,96.7,19,42.7,528,,,,0.43,1.3,4,,,,479,8.6,53,18.1,
-P-10050,E-10050-01,2025-04-12T23:31:17.863378,36.4,71,130,90,96.6,19,44.9,493,,117,92,0.45,0.9,4,,,,488,7.5,,18.1,1
-P-10050,E-10050-01,2025-04-13T00:17:07.905047,36.6,78,132,81,97.3,17,21.0,376,38.1,321,147,,1.1,,5,27,,356,5.7,,18.1,
-P-10050,E-10050-01,2025-04-13T00:22:23.368560,36.6,43,120,85,96.4,12,21.0,353,41.6,,,,0.9,,,,,338,5.7,,18.1,
-P-10050,E-10050-01,2025-04-12T23:17:53.094328,36.8,81,123,75,96.0,20,21.0,457,,,,,,,,30,27,431,7.4,68,18.1,
-P-10050,E-10050-01,2025-04-13T06:00:52.925135,37.0,83,112,82,96.5,14,21.0,381,36.6,,,,,,5,,,378,6.2,,18.1,
-P-10050,E-10050-01,2025-04-13T09:17:50.787463,36.0,75,140,80,96.9,14,21.0,387,43.5,,,,1.1,,,33,26,387,5.9,,18.1,
-P-10050,E-10050-01,2025-04-13T00:02:24.713092,37.9,78,120,83,99.3,15,21.0,455,39.6,,,,,,4,,,436,7.4,,18.1,
-P-10050,E-10050-01,2025-04-13T09:40:45.315421,36.3,75,114,81,99.2,16,21.0,431,35.1,210,144,,,,,27,23,400,7.0,69,18.1,
-P-10050,E-10050-01,2025-04-13T09:37:40.982467,36.9,66,131,76,98.9,18,21.0,355,43.4,,,,1.0,,6,26,20,331,5.8,,18.1,
-P-10050,E-10050-02,2025-04-14T17:27:19.756409,36.0,70,134,85,98.2,19,21.0,392,,,,,1.5,,8,34,,368,5.9,27,18.1,1
-P-10050,E-10050-02,2025-04-14T19:11:06.736715,36.8,85,112,80,97.6,19,21.0,513,38.3,196,137,,0.9,,,,,466,8.3,55,18.1,1
-P-10050,E-10050-02,2025-04-14T19:42:53.928151,36.5,73,119,72,92.3,19,21.0,456,,443,436,,1.4,,7,,,447,6.9,,18.1,
-P-10050,E-10050-02,2025-04-14T19:55:12.157542,36.9,52,135,87,98.7,15,21.0,510,,127,111,,,,,34,,500,7.7,45,18.1,
-P-10050,E-10050-02,2025-04-14T21:10:14.961959,37.2,78,125,82,98.9,12,42.8,519,,,,0.43,1.0,3,6,,,476,8.4,51,18.1,
-P-10050,E-10050-02,2025-04-15T00:55:32.738461,36.9,70,125,82,98.1,18,21.0,542,,,,,,,,,,510,8.2,,18.1,
-P-10050,E-10050-02,2025-04-14T23:23:08.853697,37.1,84,117,78,94.1,16,21.0,534,,258,249,,,,6,30,26,521,8.7,,18.1,
-P-10050,E-10050-02,2025-04-14T22:02:34.956920,36.8,83,119,78,99.0,20,21.0,449,,,,,,,,32,29,449,7.3,,18.1,
-P-10050,E-10050-03,2025-04-11T17:27:19.756409,36.1,73,119,75,99.3,14,21.0,426,,269,241,,1.2,,,26,,391,6.9,,18.1,
-P-10050,E-10050-03,2025-04-11T18:19:57.951234,36.9,75,130,79,92.3,16,21.0,391,,,,,1.2,,,27,,353,6.3,,18.1,1
-P-10050,E-10050-03,2025-04-11T20:52:03.710132,37.0,79,129,90,97.1,19,21.0,380,44.8,,,,1.1,,7,27,,354,5.7,,18.1,
-P-10050,E-10050-03,2025-04-11T22:32:21.148940,36.5,81,120,83,99.0,12,21.0,478,44.9,,,,,,,29,,464,7.2,,18.1,1
-P-10050,E-10050-03,2025-04-11T19:57:31.859392,36.5,66,113,81,97.5,13,21.0,474,,,,,,,8,34,34,457,7.2,,18.1,1
-P-10050,E-10050-03,2025-04-11T21:33:42.305602,37.1,85,122,75,96.8,12,21.0,365,35.1,159,,,,,,29,21,337,5.9,75,18.1,
-P-10050,E-10050-03,2025-04-12T05:17:09.407181,36.5,83,113,81,96.0,13,21.0,525,39.3,,,,1.5,,,,,480,8.5,,18.1,
-P-10050,E-10050-03,2025-04-12T01:32:09.593991,36.2,81,123,90,99.3,20,21.0,468,39.6,106,80,,1.4,,7,,,465,7.1,,18.1,
-P-10050,E-10050-03,2025-04-12T01:00:12.260038,36.5,82,124,74,93.8,20,45.5,491,,,,0.46,0.9,2,,26,21,484,7.4,,18.1,1
-P-10050,E-10050-03,2025-04-12T02:19:41.907356,36.5,79,125,83,98.7,18,42.2,391,,,,0.42,1.1,7,,26,26,353,6.3,63,18.1,
-P-10050,E-10050-03,2025-04-11T23:08:27.745643,36.3,78,114,83,98.4,16,21.0,380,,,,,1.3,,,,,365,6.2,,18.1,
-P-10050,E-10050-03,2025-04-12T03:03:32.252722,37.9,72,122,73,93.3,19,21.0,369,,,,,,,7,,,365,6.0,,18.1,
+P-10001,E-10001-01,2025-04-16T16:25:23.475721,36.3,74,117,83,96.3,20,21.0,475,,170,151,,1.5,,,,,429,6.3,72,21.6,
+P-10001,E-10001-01,2025-04-16T18:22:09.354656,36.8,68,110,82,97.0,17,21.0,435,43.4,424,394,,1.2,,7,,,433,6.2,,21.6,
+P-10001,E-10001-01,2025-04-16T18:28:54.578876,37.0,85,116,75,96.7,18,21.0,488,,,,,1.3,,,,,461,6.5,,21.6,
+P-10001,E-10001-01,2025-04-16T20:03:32.864718,37.1,78,133,80,98.9,18,21.0,428,40.2,198,192,,1.0,,4,,,414,6.1,27,21.6,
+P-10001,E-10001-01,2025-04-16T21:02:04.130438,37.1,78,110,81,99.4,18,21.0,479,,,,,,,7,,,456,6.8,,21.6,
+P-10001,E-10001-01,2025-04-16T22:42:04.658673,37.1,94,137,85,98.7,14,21.0,400,38.7,,,,1.4,,,,,385,5.7,76,21.6,1
+P-10001,E-10001-01,2025-04-16T21:40:30.537589,36.9,83,113,70,96.2,14,21.0,513,,,,,1.1,,,,,480,7.3,,21.6,1
+P-10001,E-10001-01,2025-04-17T01:40:27.806151,36.3,49,115,75,99.5,15,21.0,384,43.9,,,,,,6,28,22,354,5.5,,21.6,
+P-10001,E-10001-02,2025-04-14T16:25:23.475721,36.9,68,122,70,97.8,12,21.0,463,,,,,,,6,33,,449,6.2,30,21.6,
+P-10001,E-10001-02,2025-04-14T17:19:06.061487,36.9,81,115,82,96.6,14,21.0,445,36.6,228,144,,,,6,,,427,6.3,,21.6,1
+P-10001,E-10001-02,2025-04-14T20:22:42.742865,36.8,66,117,74,99.4,20,21.0,471,,269,124,,,,5,35,28,457,6.7,,21.6,1
+P-10001,E-10001-02,2025-04-14T19:35:12.857126,36.9,73,123,85,96.6,21,21.0,531,,395,306,,0.9,,5,,,499,7.5,,21.6,
+P-10001,E-10001-02,2025-04-14T18:41:35.310770,36.1,75,121,77,97.6,17,36.3,476,41.0,,,0.36,,5,5,33,27,448,6.4,,21.6,
+P-10001,E-10001-02,2025-04-15T00:07:33.261746,37.1,66,121,75,98.0,13,21.0,540,38.1,,,,1.4,,,,,490,7.7,55,21.6,1
+P-10002,E-10002-01,2025-04-15T16:25:23.475721,36.7,94,134,81,97.4,14,21.0,546,36.6,,,,,,,,,528,7.3,,26.1,1
+P-10002,E-10002-01,2025-04-15T17:07:31.852205,36.9,92,142,82,97.7,15,21.0,438,,,,,1.0,,,,,415,5.8,21,26.1,
+P-10002,E-10002-01,2025-04-15T19:25:19.626716,37.2,83,137,96,97.0,16,21.0,478,43.4,,,,1.2,,,,,444,6.4,,26.1,
+P-10002,E-10002-01,2025-04-15T21:30:16.268099,36.7,74,157,102,97.4,18,21.0,386,42.7,,,,,,,,,347,5.1,,26.1,
+P-10002,E-10002-01,2025-04-15T22:31:19.624842,37.4,99,135,80,97.2,14,21.0,423,35.1,,,,,,,25,23,419,6.0,76,26.1,
+P-10002,E-10002-01,2025-04-15T20:18:31.196727,36.4,84,130,81,96.1,12,21.0,544,43.4,,,,1.1,,,,,509,7.3,,26.1,
+P-10002,E-10002-01,2025-04-16T02:26:25.014537,36.4,75,132,96,97.0,17,21.0,369,,476,320,,,,,,,332,4.9,,26.1,1
+P-10002,E-10002-01,2025-04-15T23:38:10.294478,36.7,84,142,97,98.2,12,21.0,506,,492,,,1.3,,,27,24,458,6.7,,26.1,
+P-10002,E-10002-01,2025-04-16T00:52:57.813469,36.4,73,140,98,96.5,18,21.0,513,36.2,,,,,,5,,,481,7.3,,26.1,1
+P-10002,E-10002-01,2025-04-15T23:58:55.114451,36.5,94,124,97,97.1,22,21.0,464,,,,,,,6,,,419,6.6,48,26.1,
+P-10002,E-10002-01,2025-04-16T02:25:55.215440,37.1,85,134,90,96.6,19,21.0,393,,,,,1.2,,7,,,380,5.6,43,26.1,1
+P-10002,E-10002-01,2025-04-15T23:06:49.350809,36.1,86,121,84,99.0,14,21.0,474,40.8,,,,1.4,,,,,427,6.3,,26.1,
+P-10002,E-10002-02,2025-04-17T16:25:23.475721,36.7,80,141,83,97.3,16,21.0,406,44.9,,,,1.2,,,29,22,385,5.4,,26.1,
+P-10002,E-10002-02,2025-04-17T16:58:30.511029,37.1,84,134,83,97.3,18,56.9,361,38.5,279,80,0.57,1.1,9,,,,337,4.8,,26.1,1
+P-10002,E-10002-02,2025-04-17T19:17:08.401738,36.0,84,144,85,96.5,20,21.0,404,,,,,,,,,,395,5.7,,26.1,
+P-10002,E-10002-02,2025-04-17T18:36:40.560856,36.7,86,138,91,96.3,14,21.0,474,43.0,,,,1.2,,7,33,29,439,6.7,,26.1,1
+P-10002,E-10002-02,2025-04-17T21:56:50.466133,37.0,73,137,86,96.5,20,21.0,441,43.2,146,,,,,5,,,402,5.9,,26.1,
+P-10002,E-10002-02,2025-04-17T23:39:43.992637,36.8,87,134,79,98.5,19,21.0,485,42.4,358,121,,1.2,,,27,27,472,6.5,,26.1,
+P-10002,E-10002-02,2025-04-18T01:52:02.493882,37.0,91,124,75,98.9,20,21.0,355,44.3,,,,1.3,,,,,338,5.0,,26.1,
+P-10002,E-10002-02,2025-04-17T23:17:17.492875,36.8,95,132,81,96.0,13,21.0,370,,,,,,,8,30,27,352,4.9,,26.1,1
+P-10002,E-10002-02,2025-04-18T01:36:12.138976,36.6,80,141,108,98.6,18,48.5,533,39.5,,,0.48,,9,,,,501,7.6,,26.1,
+P-10002,E-10002-02,2025-04-18T01:58:25.045484,36.5,95,143,94,97.3,12,21.0,382,41.7,,,,1.2,,8,25,21,368,5.4,,26.1,
+P-10002,E-10002-02,2025-04-18T05:31:12.436165,36.1,71,133,96,96.7,19,21.0,518,45.0,,,,1.3,,,35,,498,7.3,,26.1,
+P-10002,E-10002-02,2025-04-18T14:01:08.588137,36.3,85,143,97,98.6,18,21.0,363,35.6,,,,1.2,,5,29,,327,5.1,,26.1,1
+P-10002,E-10002-02,2025-04-18T13:23:14.448771,36.2,79,145,80,96.2,20,21.0,409,36.2,,,,,,4,,,397,5.8,,26.1,
+P-10002,E-10002-02,2025-04-18T01:24:28.900228,37.0,90,133,81,98.3,15,21.0,488,,,,,,,,,,463,6.5,,26.1,
+P-10002,E-10002-02,2025-04-17T23:54:07.384969,37.4,84,126,81,99.3,15,21.0,500,,,,,,,,,,485,7.1,,26.1,
+P-10002,E-10002-03,2025-04-15T16:25:23.475721,36.0,112,142,97,96.7,13,21.0,417,,,,,,,7,,,414,5.9,,26.1,1
+P-10002,E-10002-03,2025-04-15T17:45:31.946017,37.2,105,131,85,98.6,12,21.0,354,37.5,,,,0.8,,,29,24,329,4.7,,26.1,
+P-10002,E-10002-03,2025-04-15T19:38:02.120838,37.0,100,122,97,97.6,12,21.0,407,,,,,,,8,,,367,5.4,28,26.1,1
+P-10002,E-10002-03,2025-04-15T21:48:07.207827,36.8,92,138,88,98.3,16,21.0,382,41.5,,,,1.1,,,,,344,5.4,,26.1,1
+P-10002,E-10002-03,2025-04-15T21:26:26.964766,36.2,99,141,104,98.1,14,21.0,354,36.4,,,,,,,,,326,4.7,,26.1,
+P-10002,E-10002-03,2025-04-15T23:04:09.948301,36.6,96,137,102,98.5,13,21.0,427,44.7,207,135,,,,,,,392,5.7,,26.1,
+P-10002,E-10002-03,2025-04-16T01:51:31.462209,36.6,86,142,79,97.0,20,21.0,431,37.6,121,118,,,,,,,394,5.7,,26.1,1
+P-10002,E-10002-03,2025-04-15T23:55:13.035428,36.7,92,134,83,97.3,18,21.0,471,,314,295,,1.0,,,,,434,6.7,27,26.1,1
+P-10002,E-10002-03,2025-04-16T05:39:06.647717,36.4,110,135,86,99.3,18,21.0,373,,,,,,,,,,360,5.0,,26.1,
+P-10002,E-10002-03,2025-04-16T01:06:31.277076,36.3,85,136,96,98.6,17,43.5,430,,463,,0.43,1.4,3,,,,389,6.1,,26.1,1
+P-10002,E-10002-03,2025-04-16T07:40:24.035109,36.0,76,138,95,99.1,15,58.2,387,36.1,,,0.58,1.4,10,,,,381,5.2,,26.1,
+P-10002,E-10002-03,2025-04-16T13:12:39.191947,37.5,90,128,90,97.7,19,21.0,483,43.6,,,,,,,35,28,456,6.4,,26.1,1
+P-10002,E-10002-03,2025-04-16T03:39:59.235372,36.5,72,149,97,96.6,12,21.0,510,,288,102,,1.3,,6,28,,493,6.8,,26.1,
+P-10002,E-10002-03,2025-04-16T09:32:10.690426,36.9,98,130,86,99.3,12,21.0,362,39.6,,,,1.5,,,30,29,336,5.1,,26.1,
+P-10002,E-10002-03,2025-04-15T23:44:52.291408,36.9,97,143,91,93.5,18,21.0,444,,,,,1.3,,,,,442,6.3,,26.1,
+P-10003,E-10003-01,2025-04-14T16:25:23.475721,37.4,53,133,81,99.5,16,21.0,401,36.7,,,,1.1,,,,,368,7.4,,23.2,
+P-10003,E-10003-01,2025-04-14T18:23:15.881465,37.2,88,137,87,93.5,12,49.3,389,39.6,441,125,0.49,1.2,3,,35,33,351,7.2,,23.2,1
+P-10003,E-10003-01,2025-04-14T18:07:09.119387,37.0,92,132,83,96.0,15,21.0,350,,210,162,,1.3,,6,,,349,5.9,,23.2,1
+P-10003,E-10003-01,2025-04-14T20:53:11.260186,37.4,77,132,98,97.3,22,21.0,414,39.9,,,,1.0,,7,,,403,7.6,,23.2,1
+P-10003,E-10003-01,2025-04-14T21:28:25.221554,36.8,84,147,81,98.2,17,21.0,403,37.5,157,120,,,,,,,372,7.4,,23.2,
+P-10003,E-10003-01,2025-04-14T23:20:37.054532,37.2,76,142,78,98.4,12,21.0,460,,284,126,,1.3,,,,,430,7.8,,23.2,1
+P-10003,E-10003-01,2025-04-14T20:14:22.805044,37.8,87,145,85,97.4,20,33.5,407,40.0,402,,0.34,,3,,,,393,6.9,,23.2,1
+P-10003,E-10003-01,2025-04-14T22:22:05.921774,37.3,96,150,102,96.7,13,31.9,423,,,,0.32,1.4,3,,,,406,7.2,39,23.2,
+P-10003,E-10003-01,2025-04-15T01:42:28.255381,37.3,85,153,98,98.3,17,21.0,448,35.3,,,,,,7,,,416,8.2,46,23.2,
+P-10003,E-10003-01,2025-04-15T07:25:57.427998,37.5,92,137,78,99.3,13,21.0,542,36.7,,,,,,,,,529,9.2,,23.2,
+P-10003,E-10003-01,2025-04-14T21:46:18.338990,37.7,97,139,83,98.0,19,47.7,460,41.7,,,0.48,1.2,5,,32,27,458,7.8,,23.2,
+P-10003,E-10003-01,2025-04-15T11:36:23.458038,37.7,111,129,86,98.1,17,21.0,444,,140,,,1.3,,,25,23,419,7.5,,23.2,
+P-10003,E-10003-01,2025-04-15T10:01:34.341476,36.4,119,134,88,96.8,14,21.0,388,44.5,101,98,,1.0,,,32,22,377,7.1,42,23.2,
+P-10003,E-10003-02,2025-04-12T16:25:23.475721,37.6,97,140,98,97.7,13,21.0,459,35.9,,,,,,7,28,,456,8.4,29,23.2,1
+P-10003,E-10003-02,2025-04-12T17:14:08.485430,37.1,91,144,88,97.6,18,51.7,392,39.3,,,0.52,1.4,9,5,25,20,371,7.2,,23.2,1
+P-10003,E-10003-02,2025-04-12T17:44:03.554853,37.3,86,144,89,97.1,14,56.8,357,39.7,130,90,0.57,,8,,,,351,6.1,,23.2,
+P-10003,E-10003-02,2025-04-12T18:02:03.429083,37.5,61,142,87,99.2,18,21.0,502,39.1,,,,,,,33,30,493,9.2,,23.2,
+P-10003,E-10003-02,2025-04-12T22:49:46.542537,37.8,82,133,88,99.3,15,59.8,517,44.2,187,,0.6,1.2,9,7,,,481,9.5,,23.2,1
+P-10003,E-10003-02,2025-04-12T20:47:50.206118,37.9,83,136,98,98.9,19,41.4,378,41.1,422,372,0.41,1.2,9,8,,,370,6.4,,23.2,
+P-10003,E-10003-03,2025-04-09T16:25:23.475721,37.7,79,144,100,96.3,18,21.0,464,41.3,,,,,,,,,436,7.9,,23.2,1
+P-10003,E-10003-03,2025-04-09T17:35:54.473667,37.1,71,130,78,99.2,14,21.0,505,37.2,,,,1.4,,4,,,477,8.6,,23.2,
+P-10003,E-10003-03,2025-04-09T19:27:52.287589,37.0,79,138,93,96.8,16,21.0,473,43.1,,,,,,,32,,472,8.7,,23.2,1
+P-10003,E-10003-03,2025-04-09T20:38:58.368023,37.1,98,144,87,97.0,20,21.0,385,40.5,,,,,,6,,,374,7.1,,23.2,1
+P-10003,E-10003-03,2025-04-09T22:24:46.495161,37.2,90,132,82,99.1,13,21.0,425,40.1,,,,1.4,,7,,,401,7.2,49,23.2,1
+P-10003,E-10003-03,2025-04-09T19:11:06.383258,37.2,96,144,89,98.4,18,21.0,467,38.5,,,,1.1,,,,,462,8.6,69,23.2,
+P-10003,E-10003-03,2025-04-09T20:47:12.733387,37.2,96,122,85,98.5,16,21.0,370,36.1,242,197,,,,7,26,25,354,6.3,,23.2,
+P-10003,E-10003-03,2025-04-10T00:38:38.491239,37.7,83,157,101,92.9,13,21.0,524,,481,,,,,,,,508,9.6,,23.2,1
+P-10003,E-10003-03,2025-04-10T06:58:52.282004,37.1,83,122,98,98.5,20,41.4,520,38.7,,,0.41,1.4,8,,,,478,9.6,66,23.2,
+P-10004,E-10004-01,2025-04-15T16:25:23.475721,36.9,81,132,87,97.5,17,21.0,487,37.8,,,,0.8,,7,,,461,7.4,,20.4,
+P-10004,E-10004-01,2025-04-15T17:07:01.148769,36.3,84,136,89,98.7,19,21.0,471,42.8,286,,,0.8,,,,,425,7.2,,20.4,
+P-10004,E-10004-01,2025-04-15T18:41:27.567277,36.1,80,139,102,98.4,12,21.0,521,,183,,,0.9,,,35,,483,7.4,,20.4,
+P-10004,E-10004-01,2025-04-15T21:07:28.790026,37.2,76,135,85,99.2,13,21.0,532,37.4,,,,,,,35,34,510,7.6,,20.4,
+P-10004,E-10004-01,2025-04-16T00:13:31.587520,36.1,79,131,90,96.3,14,21.0,444,,,,,1.3,,,,,430,6.8,,20.4,1
+P-10004,E-10004-01,2025-04-15T23:08:51.321214,36.6,78,134,87,96.9,19,21.0,415,,,,,,,,29,20,399,6.3,,20.4,
+P-10004,E-10004-01,2025-04-15T21:22:08.830039,37.0,79,149,94,96.6,18,21.0,436,40.2,346,282,,1.3,,8,,,423,6.2,,20.4,
+P-10004,E-10004-01,2025-04-16T05:17:18.973654,36.7,77,142,90,99.3,18,21.0,358,,,,,1.0,,,,,343,5.1,,20.4,
+P-10004,E-10004-01,2025-04-16T00:25:24.641669,37.0,81,134,92,99.3,17,21.0,493,38.2,183,81,,,,8,30,,447,7.5,38,20.4,
+P-10004,E-10004-01,2025-04-16T08:43:55.743665,36.6,70,144,89,96.8,18,21.0,371,,,,,1.2,,,,,340,5.3,,20.4,
+P-10004,E-10004-01,2025-04-16T04:05:21.733824,36.8,74,135,90,97.2,18,21.0,461,39.8,,,,1.4,,8,33,29,434,7.0,,20.4,
+P-10004,E-10004-01,2025-04-16T04:49:08.145175,36.6,79,150,84,99.2,17,21.0,422,,,,,,,,26,20,416,6.4,,20.4,
+P-10004,E-10004-01,2025-04-16T00:47:45.137850,36.5,65,133,94,95.2,19,21.0,391,39.2,,,,1.4,,,26,23,385,6.0,,20.4,
+P-10004,E-10004-01,2025-04-16T00:47:17.814662,37.0,81,137,90,96.7,14,21.0,410,,317,236,,1.0,,,,,380,5.8,,20.4,
+P-10004,E-10004-01,2025-04-16T03:39:51.301889,36.2,78,148,77,99.5,17,21.0,363,,,,,1.0,,4,26,,341,5.2,,20.4,
+P-10005,E-10005-01,2025-04-17T16:25:23.475721,36.9,66,138,92,98.5,12,21.0,516,40.4,282,280,,,,7,32,,466,11.0,,29.2,
+P-10005,E-10005-01,2025-04-17T18:23:01.778306,37.0,82,111,78,94.1,12,21.0,487,,,,,,,,,,446,10.4,,29.2,1
+P-10005,E-10005-01,2025-04-17T19:50:51.809409,36.3,78,122,78,96.9,16,38.8,446,37.2,247,99,0.39,1.1,6,5,33,20,431,9.5,,29.2,
+P-10005,E-10005-01,2025-04-17T21:32:40.858496,36.7,71,116,74,98.0,20,21.0,435,35.0,264,104,,0.9,,,,,423,8.5,,29.2,
+P-10005,E-10005-01,2025-04-17T20:52:50.628010,36.5,77,121,80,99.2,17,21.0,389,,,,,1.1,,,,,354,7.6,,29.2,
+P-10005,E-10005-01,2025-04-17T19:42:29.220276,37.0,53,113,70,95.7,16,21.0,479,38.2,,,,1.4,,,,,436,9.3,,29.2,
+P-10005,E-10005-01,2025-04-18T02:14:27.878111,36.6,83,115,70,95.0,16,21.0,493,,,,,0.9,,,27,27,463,10.5,,29.2,
+P-10005,E-10005-01,2025-04-18T03:46:52.853473,37.2,53,122,85,97.2,17,21.0,455,41.6,460,250,,,,,35,32,409,8.8,,29.2,
+P-10005,E-10005-02,2025-04-12T16:25:23.475721,36.6,82,125,83,99.4,17,21.0,449,40.0,352,222,,,,6,,,431,8.7,,29.2,1
+P-10005,E-10005-02,2025-04-12T18:05:04.051591,36.7,76,133,90,96.9,22,21.0,374,,391,,,,,,,,367,7.3,,29.2,
+P-10005,E-10005-02,2025-04-12T20:01:00.225887,36.5,75,113,79,96.6,17,21.0,430,,,,,1.2,,,25,20,425,9.2,,29.2,
+P-10005,E-10005-02,2025-04-12T18:26:11.567772,36.5,85,122,79,96.4,15,51.5,425,,,,0.52,1.1,3,,30,29,400,8.3,,29.2,
+P-10005,E-10005-02,2025-04-12T20:26:57.152217,36.3,71,114,76,96.3,12,21.0,413,39.3,,,,1.1,,,,,375,8.0,,29.2,
+P-10005,E-10005-02,2025-04-12T21:17:43.880791,36.8,85,140,79,96.0,16,21.0,403,44.7,,,,1.3,,,,,396,7.8,,29.2,
+P-10005,E-10005-02,2025-04-12T21:49:27.840649,36.2,87,114,74,96.8,17,21.0,415,37.3,189,155,,,,,35,28,385,8.1,,29.2,
+P-10005,E-10005-02,2025-04-12T20:57:21.427802,37.1,105,114,73,97.6,18,46.4,397,,,,0.46,,8,8,28,28,368,8.5,77,29.2,
+P-10005,E-10005-02,2025-04-13T00:32:06.443564,36.0,72,114,74,98.1,20,21.0,382,44.1,164,125,,1.2,,,28,,355,8.1,,29.2,
+P-10005,E-10005-02,2025-04-13T10:00:53.462903,36.3,76,123,76,97.1,14,21.0,520,,,,,,,,29,26,510,11.1,,29.2,
+P-10005,E-10005-02,2025-04-13T09:48:10.672597,36.6,73,122,82,98.4,16,33.1,501,,168,141,0.33,,7,,25,20,450,9.7,,29.2,1
+P-10005,E-10005-03,2025-04-06T16:25:23.475721,37.8,70,121,71,97.8,17,21.0,530,,,,,1.2,,,,,530,11.3,,29.2,
+P-10005,E-10005-03,2025-04-06T18:00:00.913754,36.8,82,112,72,96.8,13,21.0,501,,245,225,,1.0,,,26,,498,10.7,,29.2,
+P-10005,E-10005-03,2025-04-06T17:27:37.896202,36.7,80,116,77,96.7,12,21.0,365,36.0,,,,0.9,,8,30,22,336,7.1,,29.2,
+P-10005,E-10005-03,2025-04-06T18:34:42.307033,36.8,55,118,72,98.9,17,21.0,417,37.5,,,,1.0,,,,,400,8.1,,29.2,
+P-10005,E-10005-03,2025-04-06T22:04:06.027184,36.4,80,123,76,99.1,19,29.4,376,,,,0.29,,6,8,,,340,8.0,,29.2,1
+P-10005,E-10005-03,2025-04-07T00:49:06.871475,36.5,75,111,80,99.4,18,21.0,410,37.6,,,,0.9,,8,32,25,369,8.7,55,29.2,
+P-10006,E-10006-01,2025-04-16T16:25:23.475721,36.6,84,144,84,97.1,14,21.0,390,43.6,,,,,,6,,,390,5.7,59,19.1,1
+P-10006,E-10006-01,2025-04-16T17:47:05.164688,36.3,112,132,86,96.6,14,41.2,375,35.9,,,0.41,,6,8,29,,347,5.9,,19.1,1
+P-10006,E-10006-01,2025-04-16T18:38:34.767900,36.5,71,158,107,98.3,18,21.0,512,42.0,,,,0.9,,,,,484,7.5,,19.1,
+P-10006,E-10006-01,2025-04-16T21:03:02.334946,37.0,84,140,91,92.0,18,21.0,525,37.5,465,,,,,,,,522,7.7,,19.1,1
+P-10006,E-10006-01,2025-04-16T21:54:49.727368,37.1,65,145,91,94.8,17,21.0,384,,,,,1.2,,,,,368,5.6,,19.1,1
+P-10006,E-10006-01,2025-04-16T21:34:10.218256,37.1,70,136,82,96.8,13,21.0,372,,,,,1.4,,5,,,358,5.4,,19.1,
+P-10006,E-10006-01,2025-04-16T21:48:10.277056,36.4,84,139,91,96.3,19,21.0,378,,,,,,,4,,,377,5.5,,19.1,1
+P-10006,E-10006-01,2025-04-17T06:23:39.330119,37.0,80,131,89,97.9,20,21.0,431,,,,,,,,30,25,410,6.3,,19.1,
+P-10006,E-10006-01,2025-04-16T20:27:52.807731,37.2,80,136,88,97.3,15,21.0,382,38.2,,,,1.3,,,29,26,370,6.0,,19.1,
+P-10007,E-10007-01,2025-04-13T16:25:23.475721,37.0,101,115,76,98.6,18,21.0,524,44.1,,,,,,6,,,475,10.8,,37.6,
+P-10007,E-10007-01,2025-04-13T17:33:57.678915,36.6,71,122,70,99.4,20,21.0,356,,,,,1.0,,7,34,31,340,7.4,,37.6,1
+P-10007,E-10007-01,2025-04-13T17:40:48.154610,36.2,82,125,84,97.8,16,21.0,537,44.0,,,,1.4,,6,28,24,499,11.1,60,37.6,
+P-10007,E-10007-01,2025-04-13T18:23:18.314402,36.9,70,110,82,98.1,15,28.8,501,,,,0.29,1.1,8,,32,26,450,10.4,,37.6,1
+P-10007,E-10007-01,2025-04-13T18:43:30.548167,36.7,78,114,74,96.3,19,21.0,490,39.0,187,114,,1.2,,8,25,23,459,11.2,,37.6,1
+P-10007,E-10007-01,2025-04-13T19:35:38.695782,36.1,81,110,80,97.9,18,21.0,538,,374,263,,,,,,,514,12.3,,37.6,
+P-10007,E-10007-01,2025-04-13T22:52:52.132409,36.6,75,119,76,96.0,23,21.0,527,44.3,,,,,,4,35,,494,12.0,,37.6,
+P-10008,E-10008-01,2025-04-16T16:25:23.475721,36.0,89,135,78,96.0,16,21.0,494,40.7,418,219,,1.0,,5,26,26,462,9.6,32,34.4,
+P-10008,E-10008-01,2025-04-16T17:24:51.681338,36.3,96,140,95,98.7,12,26.1,495,38.3,,,0.26,,5,7,,,456,9.6,,34.4,1
+P-10008,E-10008-01,2025-04-16T19:08:24.776792,36.9,100,162,90,98.5,16,21.0,455,35.0,,,,0.9,,,35,22,438,9.7,,34.4,
+P-10008,E-10008-01,2025-04-16T20:13:18.282005,36.1,86,122,89,98.9,13,21.0,423,,,,,,,8,,,388,8.2,76,34.4,1
+P-10008,E-10008-01,2025-04-16T21:29:15.684569,36.9,85,136,87,97.5,15,21.0,447,40.0,,,,1.0,,,,,429,8.7,,34.4,
+P-10008,E-10008-01,2025-04-16T21:57:28.695351,37.2,83,139,85,96.6,15,21.0,520,39.5,,,,,,8,33,27,488,11.1,,34.4,
+P-10008,E-10008-01,2025-04-16T22:15:24.821305,36.3,91,152,92,97.7,12,21.0,361,,,,,1.3,,4,,,360,7.7,,34.4,
+P-10009,E-10009-01,2025-04-16T16:25:23.475721,37.0,67,134,80,97.1,12,51.6,462,39.4,,,0.52,1.1,10,,,,445,6.3,,28.0,
+P-10009,E-10009-01,2025-04-16T17:34:32.086496,37.0,70,138,94,98.5,13,21.0,510,42.4,,,,,,,,,510,7.3,,28.0,
+P-10009,E-10009-01,2025-04-16T17:31:05.385972,37.8,65,122,84,92.9,15,21.0,472,,104,81,,,,,,,442,6.8,47,28.0,
+P-10009,E-10009-01,2025-04-16T21:43:33.488326,37.1,82,132,83,98.6,14,21.0,355,,,,,1.0,,,,,327,5.1,,28.0,
+P-10009,E-10009-01,2025-04-16T18:38:54.255157,36.1,82,150,90,99.2,18,21.0,514,,,,,,,6,29,29,499,7.0,,28.0,
+P-10009,E-10009-01,2025-04-17T01:40:16.132821,36.1,70,136,81,96.3,14,21.0,433,42.4,,,,1.1,,,,,404,6.2,,28.0,
+P-10009,E-10009-01,2025-04-17T03:49:16.789219,36.6,75,139,89,97.9,19,21.0,518,,,,,,,,,,474,7.0,,28.0,
+P-10009,E-10009-01,2025-04-16T23:38:12.669034,36.3,76,147,93,98.4,15,21.0,428,,207,203,,,,,,,406,6.2,,28.0,
+P-10009,E-10009-01,2025-04-17T02:37:56.769096,36.3,73,132,92,99.3,18,21.0,546,43.7,,,,0.9,,,34,,507,7.9,,28.0,1
+P-10009,E-10009-02,2025-04-11T16:25:23.475721,37.0,76,136,88,96.7,17,21.0,508,,,,,1.4,,,,,502,7.3,,28.0,
+P-10009,E-10009-02,2025-04-11T18:19:42.309138,37.1,40,136,91,98.2,18,21.0,450,,,,,1.3,,,,,430,6.1,,28.0,1
+P-10009,E-10009-02,2025-04-11T19:34:13.834779,36.8,68,147,82,98.3,12,21.0,427,,,,,1.3,,,,,427,5.8,,28.0,
+P-10009,E-10009-02,2025-04-11T21:56:20.876612,36.3,83,158,87,97.0,14,21.0,500,35.5,485,,,,,,29,,498,6.8,,28.0,
+P-10009,E-10009-02,2025-04-11T19:39:01.392133,36.7,69,126,80,99.3,19,21.0,376,,,,,,,6,,,354,5.1,,28.0,1
+P-10009,E-10009-02,2025-04-11T19:26:00.933555,36.3,67,136,88,99.1,13,21.0,516,43.7,,,,0.8,,5,28,,479,7.0,,28.0,
+P-10009,E-10009-02,2025-04-12T00:41:11.767946,36.6,93,131,81,97.4,23,21.0,398,,,,,,,,,,394,5.7,,28.0,
+P-10009,E-10009-02,2025-04-12T02:16:04.776785,37.2,71,137,86,97.0,20,31.4,508,,,,0.31,,7,,35,27,464,6.9,24,28.0,
+P-10009,E-10009-02,2025-04-12T02:27:00.799104,36.7,98,136,84,98.5,18,21.0,484,40.3,496,442,,,,,,,435,7.0,59,28.0,
+P-10009,E-10009-02,2025-04-12T04:08:36.480828,36.4,82,137,84,96.5,15,21.0,394,,,,,,,,,,362,5.7,,28.0,
+P-10009,E-10009-03,2025-04-09T16:25:23.475721,36.8,55,143,90,98.1,16,21.0,447,,,,,,,,,,414,6.0,,28.0,1
+P-10009,E-10009-03,2025-04-09T18:10:42.490209,36.1,85,126,89,97.6,13,21.0,378,,,,,1.3,,,35,24,366,5.4,,28.0,1
+P-10009,E-10009-03,2025-04-09T20:16:49.390933,36.7,71,136,95,99.4,16,53.7,517,36.6,123,110,0.54,,6,7,32,26,509,7.0,64,28.0,1
+P-10009,E-10009-03,2025-04-09T19:40:07.725186,36.8,83,144,82,97.7,12,21.0,448,,297,253,,0.8,,,,,415,6.1,,28.0,1
+P-10009,E-10009-03,2025-04-09T21:46:13.241219,36.6,65,134,95,96.8,14,21.0,452,,,,,1.2,,8,,,427,6.1,,28.0,
+P-10009,E-10009-03,2025-04-10T00:12:04.142944,36.3,66,125,85,94.2,19,21.0,350,,,,,1.0,,5,29,25,337,4.7,66,28.0,1
+P-10009,E-10009-03,2025-04-09T22:45:51.976058,36.0,77,135,90,97.1,18,21.0,543,,,,,1.4,,,,,496,7.8,36,28.0,1
+P-10009,E-10009-03,2025-04-10T02:48:51.902951,36.1,65,142,87,99.4,17,21.0,353,41.8,,,,,,,25,,351,5.1,,28.0,
+P-10009,E-10009-03,2025-04-10T08:10:02.429578,36.4,79,155,99,98.5,19,21.0,453,,,,,1.4,,,34,20,453,6.1,,28.0,
+P-10010,E-10010-01,2025-04-14T16:25:23.475721,37.2,80,113,79,96.3,14,21.0,414,36.3,,,,1.0,,,31,24,381,7.5,22,33.9,1
+P-10010,E-10010-01,2025-04-14T17:54:29.517558,36.3,82,125,85,96.2,13,21.0,480,37.2,300,129,,0.9,,,,,460,9.5,,33.9,1
+P-10010,E-10010-01,2025-04-14T17:57:40.933508,37.0,104,123,70,96.4,19,21.0,400,39.1,,,,,,,,,376,7.3,,33.9,
+P-10010,E-10010-01,2025-04-14T18:08:23.370650,36.3,74,110,84,96.0,18,21.0,429,35.0,,,,1.0,,,,,392,7.8,,33.9,
+P-10010,E-10010-01,2025-04-14T21:55:48.369812,36.8,51,117,81,97.6,18,39.0,350,,,,0.39,1.3,7,,33,26,320,6.9,,33.9,
+P-10010,E-10010-01,2025-04-14T23:06:44.830978,36.4,79,122,70,96.4,18,21.0,451,,407,283,,,,,,,417,8.9,,33.9,
+P-10010,E-10010-02,2025-04-12T16:25:23.475721,36.1,83,116,70,94.9,18,21.0,424,,375,360,,1.1,,7,,,422,8.4,,33.9,1
+P-10010,E-10010-02,2025-04-12T17:46:19.582572,37.1,68,133,83,99.4,16,21.0,424,,442,186,,1.4,,4,35,20,418,8.4,,33.9,1
+P-10010,E-10010-02,2025-04-12T17:40:44.289305,37.0,77,116,83,94.0,18,21.0,363,,,,,,,7,,,344,7.2,,33.9,1
+P-10010,E-10010-02,2025-04-12T18:43:32.870869,36.3,75,134,76,98.2,15,21.0,547,,,,,1.0,,8,33,27,494,10.0,67,33.9,1
+P-10010,E-10010-02,2025-04-12T19:39:47.661973,36.0,82,114,76,97.7,20,21.0,425,,,,,,,5,32,32,389,7.7,,33.9,
+P-10010,E-10010-02,2025-04-12T19:29:21.837244,37.0,66,118,74,98.7,18,21.0,524,,121,,,0.8,,,,,499,10.4,44,33.9,
+P-10010,E-10010-02,2025-04-13T01:14:41.234344,36.8,76,116,85,98.0,19,21.0,427,41.8,205,126,,,,6,,,389,8.5,,33.9,
+P-10010,E-10010-02,2025-04-12T22:37:54.124354,36.2,69,124,82,96.2,15,36.5,351,37.5,389,,0.36,1.3,5,5,,,322,6.4,,33.9,
+P-10010,E-10010-02,2025-04-13T06:06:47.933197,36.1,84,131,86,98.0,16,21.0,405,39.2,,,,1.4,,,30,20,402,7.4,,33.9,
+P-10010,E-10010-02,2025-04-12T23:52:43.116811,37.1,71,137,85,93.9,12,21.0,490,39.8,,,,0.8,,,,,463,9.7,,33.9,
+P-10010,E-10010-02,2025-04-13T02:55:26.818706,36.6,75,119,74,97.1,14,21.0,499,,,,,1.2,,,32,,453,9.1,40,33.9,
+P-10011,E-10011-01,2025-04-14T16:25:23.475721,36.9,53,129,80,97.9,12,44.7,364,35.5,,,0.45,1.1,8,5,30,,332,5.2,,19.6,
+P-10011,E-10011-01,2025-04-14T18:12:50.356964,36.4,106,147,87,97.7,12,21.0,414,38.2,,,,,,8,,,413,6.3,,19.6,
+P-10011,E-10011-01,2025-04-14T18:36:18.759122,37.1,81,143,95,98.0,14,48.6,454,,,,0.49,,8,,28,,417,6.5,,19.6,
+P-10011,E-10011-01,2025-04-14T18:41:27.731083,37.0,78,128,87,97.0,16,21.0,442,,,,,0.9,,,,,412,6.3,,19.6,
+P-10011,E-10011-01,2025-04-14T21:39:52.717271,36.4,85,138,90,96.5,16,21.0,481,36.5,,,,1.5,,6,27,,434,6.9,,19.6,
+P-10011,E-10011-01,2025-04-14T18:56:35.394450,36.7,70,150,107,97.1,16,21.0,541,,,,,,,4,31,26,519,7.7,,19.6,
+P-10011,E-10011-01,2025-04-15T00:14:46.620959,36.3,50,142,95,99.2,17,21.0,393,,,,,0.8,,5,28,20,384,6.0,,19.6,
+P-10011,E-10011-01,2025-04-14T22:17:12.086790,36.8,104,138,79,97.6,12,21.0,437,,,,,,,,33,31,401,6.2,,19.6,1
+P-10011,E-10011-01,2025-04-15T00:29:10.251038,36.0,74,150,98,98.5,14,21.0,443,44.9,,,,1.4,,,,,436,6.3,,19.6,
+P-10011,E-10011-01,2025-04-15T08:16:29.455842,36.9,74,138,88,93.6,18,21.0,442,44.7,437,235,,0.8,,,,,439,6.3,,19.6,1
+P-10011,E-10011-01,2025-04-14T22:47:56.072446,36.1,85,142,84,93.3,18,21.0,395,,103,87,,,,6,,,394,6.0,,19.6,
+P-10011,E-10011-01,2025-04-15T12:37:38.741309,36.4,76,142,94,99.4,18,57.7,425,43.2,,,0.58,,10,5,33,32,409,6.1,,19.6,
+P-10011,E-10011-01,2025-04-15T06:19:23.771457,36.2,69,122,93,97.6,15,21.0,486,44.7,305,201,,,,6,34,,468,7.4,67,19.6,
+P-10011,E-10011-02,2025-04-08T16:25:23.475721,36.3,85,149,86,98.0,18,21.0,544,,427,,,0.9,,8,30,27,527,7.8,,19.6,
+P-10011,E-10011-02,2025-04-08T18:10:58.639803,36.2,74,131,88,92.2,16,41.0,433,43.0,,,0.41,1.0,8,,,,392,6.2,,19.6,1
+P-10011,E-10011-02,2025-04-08T20:08:59.102142,36.5,69,135,89,98.4,16,21.0,487,38.1,,,,0.9,,8,25,20,441,7.4,60,19.6,
+P-10011,E-10011-02,2025-04-08T19:44:15.056832,36.4,109,134,97,96.7,15,21.0,483,,,,,,,,,,480,7.4,,19.6,1
+P-10011,E-10011-02,2025-04-08T21:29:08.249863,36.5,85,138,92,99.1,13,21.0,544,,,,,1.0,,4,,,491,7.8,,19.6,1
+P-10011,E-10011-02,2025-04-08T23:14:18.673646,36.1,85,138,95,96.8,12,21.0,365,,,,,,,,,,342,5.2,,19.6,
+P-10011,E-10011-02,2025-04-09T00:40:30.130054,37.1,73,141,91,98.7,17,21.0,418,,,,,,,8,29,26,376,6.0,,19.6,
+P-10011,E-10011-02,2025-04-08T21:08:16.438023,36.1,75,128,76,97.1,17,21.0,548,,231,173,,1.3,,,,,518,7.8,,19.6,
+P-10011,E-10011-02,2025-04-09T04:31:55.703735,36.5,83,139,77,93.3,16,42.2,448,40.6,,,0.42,1.1,5,4,,,443,6.8,,19.6,
+P-10011,E-10011-02,2025-04-09T04:27:15.844420,36.4,85,134,91,94.6,20,50.7,512,41.6,213,186,0.51,1.4,2,,30,21,466,7.3,,19.6,
+P-10011,E-10011-02,2025-04-09T03:53:45.011832,36.9,68,131,91,96.3,16,21.0,418,42.9,,,,1.2,,,,,390,6.4,,19.6,
+P-10011,E-10011-03,2025-04-15T16:25:23.477763,36.6,80,148,84,98.3,14,21.0,466,,,,,1.1,,5,33,24,429,7.1,,19.6,
+P-10011,E-10011-03,2025-04-15T17:28:25.960391,36.6,83,137,94,97.3,21,21.0,534,40.0,220,,,,,7,,,501,8.2,,19.6,
+P-10011,E-10011-03,2025-04-15T17:35:53.429413,36.9,75,141,79,97.2,16,48.6,443,39.8,,,0.49,1.0,2,,,,407,6.8,35,19.6,1
+P-10011,E-10011-03,2025-04-15T20:13:37.432548,36.3,80,159,90,93.2,17,21.0,396,,,,,0.9,,5,28,27,396,5.7,,19.6,1
+P-10011,E-10011-03,2025-04-15T19:05:13.635099,36.5,69,166,99,96.5,18,21.0,429,,,,,0.9,,,,,387,6.1,,19.6,1
+P-10011,E-10011-03,2025-04-15T21:15:25.619176,37.1,81,145,78,98.3,12,21.0,405,38.2,388,154,,1.0,,8,26,24,395,6.2,50,19.6,
+P-10011,E-10011-03,2025-04-15T22:04:15.900952,36.3,50,131,88,98.6,17,21.0,518,,,,,1.4,,,,,504,7.9,,19.6,1
+P-10011,E-10011-03,2025-04-16T01:30:05.893407,36.5,69,138,96,94.1,13,21.0,372,39.7,,,,,,5,,,358,5.7,,19.6,
+P-10011,E-10011-03,2025-04-15T23:40:38.771489,36.1,73,133,81,99.4,20,21.0,435,40.9,,,,0.9,,,,,399,6.6,,19.6,
+P-10011,E-10011-03,2025-04-16T04:56:29.341486,36.1,73,136,84,99.4,12,21.0,403,,,,,,,5,34,24,382,5.8,,19.6,1
+P-10011,E-10011-03,2025-04-16T11:43:43.453617,36.4,81,129,83,96.2,13,21.0,491,44.9,205,122,,0.9,,,,,484,7.0,,19.6,
+P-10011,E-10011-03,2025-04-15T22:21:35.789199,37.0,74,139,90,92.9,15,21.0,369,,,,,1.2,,,,,335,5.3,,19.6,
+P-10011,E-10011-03,2025-04-16T09:44:36.314980,36.2,75,128,86,98.0,14,47.8,380,,,,0.48,1.4,9,,,,344,5.4,,19.6,1
+P-10011,E-10011-03,2025-04-16T06:41:58.850101,36.4,73,134,91,94.0,14,21.0,426,,,,,1.1,,,25,,421,6.5,,19.6,1
+P-10012,E-10012-01,2025-04-17T16:25:23.477763,36.6,79,123,74,97.4,13,21.0,443,43.6,,,,,,,,,412,7.0,41,30.3,
+P-10012,E-10012-01,2025-04-17T18:23:54.779920,37.0,54,122,80,98.0,12,21.0,437,44.1,406,298,,1.4,,8,,,437,6.5,,30.3,
+P-10012,E-10012-01,2025-04-17T17:35:04.432105,36.7,75,116,81,99.0,19,21.0,415,,186,175,,,,5,,,405,6.1,75,30.3,
+P-10012,E-10012-01,2025-04-17T19:10:51.739204,36.7,70,132,76,96.2,12,21.0,510,39.8,261,97,,,,,,,463,8.1,,30.3,
+P-10012,E-10012-01,2025-04-17T20:06:31.897224,37.8,103,116,79,98.9,17,21.0,458,40.8,,,,,,,,,451,7.3,61,30.3,
+P-10012,E-10012-01,2025-04-18T00:45:25.283103,37.1,77,111,83,97.3,19,48.2,409,,,,0.48,,3,,,,407,6.5,54,30.3,
+P-10012,E-10012-01,2025-04-17T21:04:19.748409,36.0,73,112,78,96.5,16,21.0,453,,,,,,,,26,,413,6.7,62,30.3,
+P-10012,E-10012-01,2025-04-18T03:57:42.187084,36.8,82,113,72,97.0,13,21.0,416,40.3,,,,1.0,,,,,402,6.6,62,30.3,
+P-10012,E-10012-01,2025-04-18T07:14:06.274600,37.0,78,125,77,99.2,13,21.0,455,,,,,1.1,,,32,25,435,6.7,,30.3,
+P-10012,E-10012-01,2025-04-18T00:07:55.129119,36.4,66,123,82,92.9,19,21.0,487,42.6,,,,1.1,,7,25,25,442,7.2,,30.3,
+P-10012,E-10012-01,2025-04-18T09:15:34.568495,37.2,68,122,80,98.7,18,21.0,528,,263,229,,,,4,,,486,7.8,,30.3,
+P-10012,E-10012-01,2025-04-18T00:35:34.288492,36.1,67,111,74,99.3,20,27.1,479,,,,0.27,0.9,10,8,29,,431,7.6,,30.3,
+P-10013,E-10013-01,2025-04-14T16:25:23.477763,36.4,65,136,85,97.2,20,21.0,443,,,,,,,6,25,25,432,6.1,20,27.4,1
+P-10013,E-10013-01,2025-04-14T17:53:32.428432,36.8,80,117,81,98.2,12,21.0,412,,,,,1.4,,,32,22,408,5.7,,27.4,
+P-10013,E-10013-01,2025-04-14T19:30:06.080257,37.1,85,132,83,97.2,12,21.0,367,,,,,1.1,,6,,,340,5.4,43,27.4,1
+P-10013,E-10013-01,2025-04-14T22:16:00.379296,36.9,69,138,87,93.9,19,21.0,430,37.1,166,158,,1.3,,,,,406,6.0,,27.4,
+P-10013,E-10013-01,2025-04-14T19:31:56.544512,36.5,71,118,73,99.3,16,21.0,434,,,,,1.3,,,31,22,390,6.4,,27.4,
+P-10013,E-10013-01,2025-04-14T23:41:03.864795,36.8,84,117,80,98.9,13,21.0,421,43.0,,,,1.4,,,,,385,6.2,,27.4,
+P-10013,E-10013-01,2025-04-14T23:50:05.381695,36.4,102,110,74,97.0,12,21.0,357,36.5,,,,,,,31,26,333,5.3,,27.4,1
+P-10013,E-10013-01,2025-04-14T21:02:34.696467,36.5,69,121,71,97.9,13,21.0,463,,269,182,,,,,,,427,6.4,,27.4,
+P-10013,E-10013-01,2025-04-14T20:57:47.970658,37.0,84,119,80,99.0,19,21.0,549,37.8,,,,0.9,,,34,,513,7.6,20,27.4,
+P-10013,E-10013-01,2025-04-15T07:16:46.805356,36.2,77,134,79,98.7,17,31.3,495,,235,136,0.31,1.0,4,,,,455,7.3,,27.4,
+P-10013,E-10013-01,2025-04-15T11:12:07.189672,37.0,84,112,74,99.5,12,21.0,544,,,,,0.8,,,,,540,8.0,,27.4,
+P-10013,E-10013-01,2025-04-15T09:32:26.026854,37.0,84,123,71,93.7,12,21.0,442,,457,,,1.1,,6,,,441,6.1,56,27.4,
+P-10013,E-10013-01,2025-04-15T05:02:07.360353,36.7,84,117,72,93.5,20,21.0,528,38.4,,,,,,,,,499,7.3,,27.4,
+P-10014,E-10014-01,2025-04-15T16:25:23.477763,36.2,92,136,82,98.5,20,21.0,540,42.9,,,,,,,,,499,9.0,,33.4,
+P-10014,E-10014-01,2025-04-15T17:54:56.154201,37.0,86,120,86,96.7,16,21.0,450,36.9,,,,,,,,,412,7.0,,33.4,
+P-10014,E-10014-01,2025-04-15T17:37:37.507597,36.8,82,139,90,96.4,16,21.0,386,,,,,0.9,,7,,,383,6.5,,33.4,
+P-10014,E-10014-01,2025-04-15T17:59:28.380034,36.4,103,127,83,97.7,14,21.0,448,,156,99,,0.9,,,,,403,7.5,36,33.4,1
+P-10014,E-10014-01,2025-04-15T18:29:36.520450,36.9,90,130,90,98.0,14,21.0,416,,,,,,,5,,,375,6.5,76,33.4,1
+P-10014,E-10014-01,2025-04-16T01:01:34.369377,37.5,86,141,98,97.4,12,21.0,419,38.6,477,,,1.3,,,31,23,377,6.5,41,33.4,
+P-10014,E-10014-01,2025-04-15T20:50:37.060034,36.2,115,163,104,97.0,16,21.0,380,41.8,,,,1.5,,,,,373,6.4,,33.4,
+P-10014,E-10014-01,2025-04-16T02:43:53.704617,36.8,86,134,88,97.5,17,21.0,422,,,,,1.1,,4,,,401,7.1,,33.4,
+P-10014,E-10014-01,2025-04-16T04:34:36.504856,36.8,95,133,81,99.1,18,21.0,435,44.5,,,,,,,,,403,7.3,,33.4,
+P-10014,E-10014-01,2025-04-16T02:43:39.832004,36.7,83,136,88,97.0,14,21.0,442,,281,155,,1.0,,,25,,430,7.4,,33.4,
+P-10014,E-10014-01,2025-04-16T09:43:46.749899,36.4,84,126,92,98.3,13,21.0,424,43.6,,,,,,8,27,26,408,7.1,63,33.4,1
+P-10014,E-10014-01,2025-04-16T08:56:07.902987,36.5,70,161,88,97.4,19,54.5,496,39.8,338,150,0.55,,9,,26,24,487,7.7,,33.4,
+P-10014,E-10014-01,2025-04-16T15:12:28.980307,36.8,73,148,97,97.0,16,21.0,431,36.8,102,,,0.9,,,,,397,7.2,,33.4,
+P-10014,E-10014-01,2025-04-15T23:17:03.242047,37.0,93,128,92,99.4,17,21.0,512,41.2,,,,,,,,,492,8.0,,33.4,
+P-10014,E-10014-01,2025-04-16T04:38:39.181940,37.7,91,153,103,98.7,17,21.0,406,38.6,,,,,,7,35,30,388,6.8,,33.4,1
+P-10015,E-10015-01,2025-04-13T16:25:23.477763,36.9,74,113,71,97.4,12,21.0,459,35.2,,,,,,,,,442,6.4,,25.2,
+P-10015,E-10015-01,2025-04-13T17:23:54.160093,36.6,70,124,70,96.6,12,21.0,416,,,,,1.1,,,,,388,5.8,54,25.2,
+P-10015,E-10015-01,2025-04-13T18:52:25.977243,36.4,75,115,76,98.5,19,21.0,401,,,,,1.5,,,,,381,5.6,,25.2,
+P-10015,E-10015-01,2025-04-13T20:49:30.330436,36.9,69,127,91,98.0,17,21.0,375,44.4,,,,1.0,,,,,339,5.2,,25.2,1
+P-10015,E-10015-01,2025-04-13T20:36:51.679135,36.8,67,122,83,98.6,14,21.0,476,36.9,,,,0.9,,4,,,437,7.0,45,25.2,
+P-10015,E-10015-01,2025-04-13T19:51:01.974085,38.0,73,120,85,97.4,20,44.3,414,39.7,116,100,0.44,1.2,5,,,,386,5.7,,25.2,
+P-10015,E-10015-01,2025-04-14T01:01:05.852219,37.0,77,126,88,97.5,13,21.0,395,36.9,,,,,,4,,,376,5.8,,25.2,1
+P-10015,E-10015-01,2025-04-13T22:58:38.478815,36.9,85,116,71,96.3,12,21.0,493,37.0,,,,1.2,,,26,,487,6.8,,25.2,
+P-10015,E-10015-01,2025-04-14T06:03:05.500758,36.6,66,130,91,97.4,12,21.0,484,39.9,442,233,,1.3,,5,28,27,444,7.2,62,25.2,
+P-10015,E-10015-01,2025-04-14T01:58:02.050006,36.0,76,125,75,96.7,14,21.0,459,40.6,,,,0.9,,,25,,455,6.4,,25.2,
+P-10015,E-10015-01,2025-04-14T07:11:53.368188,38.1,74,119,75,95.8,19,27.0,545,38.5,,,0.27,,7,,,,513,8.1,,25.2,
+P-10015,E-10015-01,2025-04-14T03:04:56.218812,36.4,68,112,74,97.9,13,21.0,489,,,,,1.2,,,,,456,6.8,,25.2,
+P-10015,E-10015-01,2025-04-14T00:05:03.937632,36.9,70,129,83,96.0,17,21.0,406,,186,124,,1.4,,,,,399,5.6,,25.2,
+P-10015,E-10015-01,2025-04-14T04:22:00.979785,37.1,49,133,93,99.1,13,52.9,446,,,,0.53,,9,4,,,423,6.2,,25.2,
+P-10015,E-10015-02,2025-04-16T16:25:23.477763,36.5,87,135,85,94.6,18,21.0,525,,,,,1.2,,,,,502,7.3,,25.2,
+P-10015,E-10015-02,2025-04-16T17:03:03.021058,36.1,72,132,82,97.1,15,21.0,363,44.0,475,127,,,,,,,353,5.0,,25.2,
+P-10015,E-10015-02,2025-04-16T20:06:02.707198,36.7,80,122,77,97.1,14,21.0,420,,,,,0.9,,7,30,27,409,5.8,,25.2,1
+P-10015,E-10015-02,2025-04-16T21:05:25.176397,36.9,78,121,86,98.9,14,21.0,536,,,,,1.1,,4,,,506,7.4,,25.2,1
+P-10015,E-10015-02,2025-04-16T18:30:18.202952,36.6,83,115,73,93.6,18,21.0,482,,130,82,,1.0,,5,31,28,444,7.1,,25.2,
+P-10015,E-10015-02,2025-04-17T00:59:23.377006,37.2,67,124,83,99.3,13,21.0,392,,,,,0.8,,,33,33,379,5.8,,25.2,
+P-10015,E-10015-02,2025-04-16T23:43:52.061907,36.4,79,120,84,98.5,20,21.0,350,,,,,0.9,,7,32,,315,4.9,,25.2,
+P-10015,E-10015-02,2025-04-17T01:31:11.603761,36.6,67,118,74,97.5,13,21.0,422,,,,,1.1,,4,33,30,392,6.2,,25.2,1
+P-10015,E-10015-02,2025-04-17T02:45:35.450159,36.9,82,123,73,96.4,12,21.0,518,36.2,,,,,,,35,,510,7.7,,25.2,
+P-10015,E-10015-02,2025-04-16T23:28:07.237723,36.9,80,113,85,99.3,13,21.0,479,40.2,,,,,,,,,438,7.1,,25.2,
+P-10015,E-10015-02,2025-04-17T12:10:40.807649,36.2,73,113,85,97.9,15,37.2,507,,185,93,0.37,0.8,8,8,,,486,7.0,,25.2,
+P-10016,E-10016-01,2025-04-16T16:25:23.477763,36.5,67,121,79,97.2,15,21.0,386,,428,241,,,,8,32,30,376,6.2,,30.8,1
+P-10016,E-10016-01,2025-04-16T17:56:39.315469,37.2,71,118,81,99.0,16,21.0,471,,,,,1.0,,,,,447,7.6,,30.8,
+P-10016,E-10016-01,2025-04-16T19:53:06.382530,36.4,53,116,82,96.8,18,21.0,540,,,,,,,,30,21,531,8.1,70,30.8,
+P-10016,E-10016-01,2025-04-16T20:08:03.508713,36.9,79,121,83,98.7,20,21.0,455,35.7,,,,,,4,,,439,7.3,,30.8,
+P-10016,E-10016-01,2025-04-16T22:37:59.357944,37.2,84,114,83,94.8,19,21.0,366,44.9,,,,1.2,,,,,335,5.5,,30.8,
+P-10016,E-10016-01,2025-04-17T01:58:43.474207,36.9,80,134,83,98.2,13,21.0,439,39.5,317,312,,1.4,,,33,30,431,7.1,,30.8,
+P-10016,E-10016-01,2025-04-16T21:12:52.848039,37.0,78,117,74,97.0,15,21.0,453,37.6,,,,,,,,,446,6.8,,30.8,
+P-10016,E-10016-02,2025-04-13T16:25:23.477763,36.8,64,110,70,96.4,16,21.0,352,35.2,384,305,,1.2,,8,,,316,5.3,,30.8,
+P-10016,E-10016-02,2025-04-13T17:24:58.002115,36.9,68,117,82,96.2,12,21.0,530,,,,,,,,,,507,7.9,,30.8,
+P-10016,E-10016-02,2025-04-13T20:07:50.154995,36.3,66,130,81,98.5,12,21.0,431,,,,,1.3,,,,,425,6.5,37,30.8,
+P-10016,E-10016-02,2025-04-13T21:45:49.474773,36.2,85,114,75,92.5,12,37.7,381,44.9,,,0.38,,2,,,,377,6.1,,30.8,
+P-10016,E-10016-02,2025-04-13T22:12:57.711333,36.8,82,139,82,98.3,16,21.0,409,37.0,,,,,,,,,402,6.1,46,30.8,
+P-10016,E-10016-02,2025-04-14T01:22:12.928122,37.2,82,119,79,98.8,17,21.0,495,44.2,,,,1.4,,,34,27,495,8.0,56,30.8,
+P-10016,E-10016-02,2025-04-14T00:57:46.227022,36.9,75,111,83,97.3,14,46.7,426,39.3,,,0.47,0.9,2,,27,22,406,6.4,,30.8,
+P-10016,E-10016-02,2025-04-13T22:56:18.534710,37.1,71,114,82,96.1,14,21.0,375,37.7,,,,1.3,,8,,,348,5.6,74,30.8,
+P-10016,E-10016-02,2025-04-14T02:47:48.026648,36.1,83,120,75,96.5,19,21.0,378,,,,,,,,,,378,6.1,65,30.8,
+P-10017,E-10017-01,2025-04-14T16:25:23.477763,37.6,77,113,75,96.6,19,21.0,374,,,,,1.0,,,28,22,368,7.3,,31.4,1
+P-10017,E-10017-01,2025-04-14T17:07:07.709175,36.1,77,122,82,96.1,14,21.0,412,42.6,,,,,,,29,27,408,7.4,,31.4,1
+P-10017,E-10017-01,2025-04-14T17:31:23.254407,37.3,65,125,79,99.3,14,21.0,408,,482,319,,,,,31,26,397,7.3,,31.4,1
+P-10017,E-10017-01,2025-04-14T21:00:59.833784,36.1,68,133,80,96.5,13,21.0,455,44.4,414,158,,,,,27,24,442,8.2,,31.4,1
+P-10017,E-10017-01,2025-04-14T20:17:55.514108,36.9,67,117,71,98.2,13,38.3,535,,,,0.38,,7,,30,,516,9.6,66,31.4,
+P-10017,E-10017-01,2025-04-15T01:39:55.806947,37.0,64,123,88,96.4,14,21.0,520,39.4,,,,,,,26,26,483,9.4,,31.4,1
+P-10017,E-10017-01,2025-04-15T03:31:26.114915,36.0,74,112,75,98.2,17,21.0,468,,153,140,,,,,,,462,8.4,,31.4,
+P-10017,E-10017-01,2025-04-15T00:31:22.009905,36.7,79,123,81,95.4,17,31.7,354,40.9,235,132,0.32,,7,,,,354,6.4,,31.4,
+P-10017,E-10017-01,2025-04-14T20:29:05.714421,37.0,93,117,72,98.5,14,21.0,531,,,,,,,7,,,518,10.4,,31.4,
+P-10017,E-10017-01,2025-04-14T22:42:59.296288,36.3,74,114,74,99.2,20,21.0,373,36.2,,,,,,,,,363,6.7,,31.4,
+P-10017,E-10017-01,2025-04-15T07:12:18.794891,37.0,83,112,83,96.8,13,47.5,351,35.1,,,0.47,,9,,,,337,6.3,,31.4,
+P-10017,E-10017-01,2025-04-15T05:14:10.754106,36.2,71,122,75,94.8,19,21.0,448,44.1,,,,,,5,,,421,8.8,,31.4,
+P-10017,E-10017-02,2025-04-10T16:25:23.477763,36.6,80,133,77,99.4,12,21.0,507,,,,,,,5,25,,464,9.9,,31.4,
+P-10017,E-10017-02,2025-04-10T18:19:57.345460,36.3,71,135,77,97.0,19,21.0,549,,,,,1.1,,5,27,,530,9.9,,31.4,1
+P-10017,E-10017-02,2025-04-10T18:00:32.251030,36.2,83,129,91,96.7,17,21.0,504,41.2,375,251,,1.1,,,,,504,9.1,53,31.4,
+P-10017,E-10017-02,2025-04-10T21:59:27.075042,36.1,74,117,78,97.3,19,21.0,438,36.7,,,,,,8,,,418,7.9,40,31.4,1
+P-10017,E-10017-02,2025-04-10T22:15:07.098734,36.8,100,123,70,97.7,20,21.0,438,,,,,0.9,,7,,,412,7.9,,31.4,
+P-10017,E-10017-02,2025-04-10T21:08:06.909435,37.1,69,117,79,95.4,18,21.0,376,,,,,,,4,32,32,363,6.8,,31.4,1
+P-10017,E-10017-02,2025-04-11T00:09:37.012946,36.1,76,130,77,96.1,18,21.0,434,40.5,,,,,,7,,,427,7.8,,31.4,
+P-10017,E-10017-02,2025-04-11T02:37:25.186789,36.7,72,113,71,97.2,13,21.0,535,,,,,1.2,,,,,517,9.6,,31.4,1
+P-10017,E-10017-02,2025-04-10T22:39:34.510030,37.1,70,131,84,96.2,17,21.0,351,,396,362,,1.4,,,,,342,6.9,,31.4,
+P-10017,E-10017-02,2025-04-11T02:30:18.640974,36.9,80,120,75,93.5,16,21.0,350,,,,,1.0,,,,,338,6.3,,31.4,1
+P-10017,E-10017-02,2025-04-11T00:25:55.257130,37.0,83,115,70,92.7,17,57.6,506,,,,0.58,1.1,9,4,,,474,9.9,,31.4,
+P-10017,E-10017-02,2025-04-11T13:49:36.136764,36.9,84,117,76,96.5,19,21.0,366,36.3,,,,1.0,,,34,,366,7.2,72,31.4,
+P-10018,E-10018-01,2025-04-17T16:25:23.477763,36.4,70,140,79,97.6,13,21.0,448,,220,94,,1.3,,8,,,410,6.4,79,25.6,1
+P-10018,E-10018-01,2025-04-17T18:03:52.325107,36.3,84,129,97,96.9,18,21.0,426,,,,,1.1,,,,,426,6.1,,25.6,
+P-10018,E-10018-01,2025-04-17T20:17:44.272086,36.4,78,138,88,98.5,12,21.0,452,36.4,,,,,,,,,437,6.4,,25.6,
+P-10018,E-10018-01,2025-04-17T19:27:57.477421,36.3,48,139,77,98.5,14,21.0,539,,119,82,,1.0,,6,,,530,7.7,,25.6,1
+P-10018,E-10018-01,2025-04-17T21:59:12.073261,36.9,84,134,92,99.5,15,21.0,467,,258,142,,1.4,,,33,28,440,6.6,,25.6,
+P-10018,E-10018-01,2025-04-17T23:24:22.046901,36.8,79,136,88,96.5,14,21.0,473,,383,256,,,,,27,,464,6.7,,25.6,
+P-10018,E-10018-01,2025-04-18T00:52:49.274300,37.2,67,127,91,98.8,20,52.8,387,,,,0.53,1.4,4,7,,,378,5.2,76,25.6,
+P-10018,E-10018-02,2025-04-16T16:25:23.477763,36.4,80,140,84,99.2,17,21.0,488,,,,,,,,35,25,477,6.9,,25.6,1
+P-10018,E-10018-02,2025-04-16T18:05:53.702307,36.3,73,137,94,99.3,15,44.2,455,,,,0.44,0.9,8,,,,425,6.1,69,25.6,1
+P-10018,E-10018-02,2025-04-16T19:08:58.775627,36.4,74,151,87,96.0,12,21.0,361,,177,175,,1.4,,8,30,25,356,5.1,,25.6,
+P-10018,E-10018-02,2025-04-16T18:00:02.469048,38.1,65,136,91,95.7,16,21.0,425,38.7,,,,1.1,,,27,23,424,5.7,,25.6,1
+P-10018,E-10018-02,2025-04-16T19:31:36.741446,37.5,66,131,92,94.9,20,21.0,469,,,,,1.2,,6,31,25,433,6.3,,25.6,1
+P-10018,E-10018-02,2025-04-17T02:01:42.680744,36.0,93,143,82,98.0,15,21.0,409,,352,,,,,6,,,388,5.8,,25.6,1
+P-10018,E-10018-02,2025-04-16T21:04:08.788817,36.3,81,131,92,96.4,13,21.0,486,,,,,,,4,30,30,475,6.5,,25.6,1
+P-10018,E-10018-02,2025-04-17T05:16:21.109813,37.4,65,128,96,99.4,14,21.0,488,38.2,,,,,,5,,,472,6.9,48,25.6,
+P-10018,E-10018-02,2025-04-17T07:02:01.635343,37.0,76,140,84,99.0,15,21.0,353,41.4,435,367,,1.2,,6,,,342,4.7,38,25.6,1
+P-10018,E-10018-02,2025-04-16T22:20:45.301073,37.1,70,125,89,98.6,16,21.0,450,36.5,106,84,,0.9,,,28,23,415,6.4,49,25.6,
+P-10018,E-10018-02,2025-04-17T10:31:46.742908,37.5,65,137,98,96.9,16,21.0,550,,,,,1.1,,8,35,24,505,7.3,,25.6,
+P-10018,E-10018-02,2025-04-17T10:04:58.482060,37.1,83,142,76,96.7,15,21.0,525,,,,,,,,,,485,7.5,,25.6,
+P-10018,E-10018-02,2025-04-17T05:24:40.740404,37.2,65,137,83,98.6,13,21.0,406,38.1,,,,1.3,,6,27,23,395,5.4,,25.6,
+P-10018,E-10018-02,2025-04-17T06:53:57.608690,36.3,75,142,96,97.3,17,21.0,474,,274,177,,,,5,,,443,6.7,,25.6,
+P-10018,E-10018-02,2025-04-17T15:41:57.722150,36.4,82,138,91,96.3,12,21.0,354,,,,,1.3,,6,35,29,335,5.0,23,25.6,
+P-10019,E-10019-01,2025-04-15T16:25:23.477763,37.8,62,150,94,96.4,18,21.0,357,,,,,1.5,,,25,23,353,5.0,,23.7,
+P-10019,E-10019-01,2025-04-15T17:56:34.498851,37.3,72,128,90,96.8,17,54.1,508,41.8,,,0.54,1.1,8,,,,488,7.1,,23.7,
+P-10019,E-10019-01,2025-04-15T20:14:24.626548,37.4,84,135,93,96.2,14,21.0,391,40.8,,,,1.1,,,,,356,5.9,,23.7,
+P-10019,E-10019-01,2025-04-15T19:43:06.005410,37.7,83,139,90,94.0,20,21.0,506,,,,,1.0,,5,,,500,7.1,,23.7,1
+P-10019,E-10019-01,2025-04-15T22:18:18.568235,38.0,77,153,96,96.2,16,21.0,420,,,,,1.2,,,31,21,420,5.9,23,23.7,
+P-10019,E-10019-01,2025-04-16T02:11:09.690741,37.2,79,140,92,97.5,19,24.7,373,40.2,,,0.25,1.5,4,6,,,343,5.6,,23.7,
+P-10019,E-10019-01,2025-04-15T20:08:31.506115,37.4,81,143,97,99.2,16,21.0,452,40.4,174,114,,1.1,,5,30,,423,6.3,,23.7,1
+P-10019,E-10019-01,2025-04-16T00:00:11.416428,37.7,84,141,91,98.2,13,21.0,416,38.8,,,,1.0,,,,,395,6.2,,23.7,
+P-10019,E-10019-01,2025-04-15T22:52:34.102127,36.7,87,145,87,95.5,17,21.0,511,38.4,,,,1.4,,6,,,471,7.7,,23.7,
+P-10019,E-10019-01,2025-04-16T08:21:11.535125,37.2,71,126,84,98.9,18,21.0,513,,,,,,,,,,496,7.2,,23.7,
+P-10019,E-10019-02,2025-04-08T16:25:23.477763,37.2,83,136,94,93.1,18,21.0,543,41.2,,,,,,,,,496,7.6,46,23.7,1
+P-10019,E-10019-02,2025-04-08T17:22:07.473353,37.9,101,142,97,96.9,18,21.0,494,,,,,1.0,,,,,461,6.9,68,23.7,
+P-10019,E-10019-02,2025-04-08T18:05:57.834309,36.5,71,149,81,98.6,20,21.0,532,,,,,1.1,,6,,,525,7.5,,23.7,
+P-10019,E-10019-02,2025-04-08T20:00:23.352181,37.9,91,137,89,98.4,15,21.0,526,,,,,,,7,,,491,7.4,,23.7,1
+P-10019,E-10019-02,2025-04-08T22:01:59.800453,38.0,96,135,87,98.0,20,21.0,517,39.9,184,106,,,,4,,,482,7.3,38,23.7,
+P-10019,E-10019-02,2025-04-08T23:23:23.383529,36.7,98,129,86,96.0,20,21.0,464,44.0,159,88,,1.3,,,,,450,6.5,,23.7,
+P-10019,E-10019-02,2025-04-08T21:00:08.619619,37.2,88,149,93,98.7,17,21.0,480,40.7,,,,,,,32,,462,7.2,,23.7,
+P-10019,E-10019-02,2025-04-09T06:07:32.276373,36.9,85,137,98,98.8,17,21.0,516,44.8,219,,,,,8,,,485,7.2,51,23.7,1
+P-10019,E-10019-03,2025-04-09T16:25:23.477763,36.6,89,129,95,96.9,15,21.0,363,,,,,1.4,,,,,340,5.4,,23.7,1
+P-10019,E-10019-03,2025-04-09T17:07:21.712830,37.1,71,134,77,98.4,15,45.4,398,,,,0.45,,8,,,,393,5.6,,23.7,1
+P-10019,E-10019-03,2025-04-09T18:33:48.559523,36.7,90,134,86,97.6,15,60.0,400,42.2,,,0.6,,4,8,,,390,5.6,,23.7,
+P-10019,E-10019-03,2025-04-09T20:28:49.982038,37.2,100,143,89,96.1,12,21.0,501,36.6,,,,,,,,,461,7.5,,23.7,
+P-10019,E-10019-03,2025-04-09T20:28:33.697915,37.4,92,143,93,99.0,15,21.0,358,,,,,1.1,,,,,339,5.4,,23.7,
+P-10019,E-10019-03,2025-04-09T22:52:19.157188,37.2,129,148,84,99.0,12,21.0,416,44.7,257,238,,1.0,,6,35,,406,6.2,,23.7,1
+P-10019,E-10019-03,2025-04-10T04:15:51.672069,37.3,67,152,89,98.4,17,21.0,459,,,,,,,6,,,414,6.9,,23.7,
+P-10019,E-10019-03,2025-04-10T05:21:47.397014,36.6,86,139,83,96.6,20,21.0,477,36.0,,,,,,,30,20,455,6.7,27,23.7,
+P-10019,E-10019-03,2025-04-09T21:57:10.562096,37.3,90,127,89,97.4,14,21.0,378,40.1,,,,1.2,,8,,,359,5.3,,23.7,
+P-10019,E-10019-03,2025-04-10T02:26:28.037230,37.9,100,150,109,99.3,12,21.0,460,,,,,1.5,,,,,452,6.5,,23.7,1
+P-10019,E-10019-03,2025-04-10T01:21:40.708821,37.3,88,134,78,98.2,19,21.0,487,,,,,,,,,,453,6.8,,23.7,1
+P-10019,E-10019-03,2025-04-09T23:40:01.875905,37.4,82,128,87,98.0,17,47.6,481,42.7,,,0.48,,7,4,25,,477,6.8,,23.7,
+P-10019,E-10019-03,2025-04-10T12:21:53.190719,37.0,101,139,83,97.5,16,21.0,461,42.0,,,,1.4,,,30,,423,6.5,,23.7,1
+P-10020,E-10020-01,2025-04-14T16:25:23.477763,37.9,74,137,90,96.3,12,21.0,352,,,,,1.0,,,,,326,4.8,,26.0,
+P-10020,E-10020-01,2025-04-14T17:37:52.860027,37.8,91,143,94,97.5,14,49.5,461,,116,85,0.49,0.8,4,,,,426,6.3,,26.0,1
+P-10020,E-10020-01,2025-04-14T18:17:41.583309,37.7,88,140,96,99.0,18,21.0,399,35.2,,,,,,7,31,26,380,5.8,,26.0,
+P-10020,E-10020-01,2025-04-14T20:25:20.683057,37.5,99,154,94,96.4,19,21.0,409,38.7,,,,,,,33,,402,5.5,,26.0,1
+P-10020,E-10020-01,2025-04-14T23:06:02.468823,36.7,83,129,81,95.7,18,21.0,489,44.3,,,,,,,27,21,460,6.6,,26.0,
+P-10020,E-10020-01,2025-04-14T19:50:43.795450,37.6,92,128,88,97.5,18,38.6,414,,323,84,0.39,1.0,9,,33,,377,6.0,,26.0,
+P-10020,E-10020-01,2025-04-14T21:20:46.764029,37.2,79,128,92,96.5,12,21.0,444,44.8,,,,1.4,,7,25,,439,6.0,,26.0,1
+P-10020,E-10020-01,2025-04-15T03:30:18.816376,37.5,75,133,84,96.1,14,21.0,423,41.2,,,,1.2,,,,,388,5.7,59,26.0,1
+P-10020,E-10020-01,2025-04-15T07:10:33.448121,37.9,83,140,93,98.0,19,21.0,534,,196,,,,,7,,,521,7.7,28,26.0,
+P-10020,E-10020-01,2025-04-15T08:45:28.565955,37.0,94,131,90,98.2,19,21.0,426,39.7,,,,,,8,,,395,5.8,,26.0,
+P-10021,E-10021-01,2025-04-15T16:25:23.477763,37.1,100,131,95,96.5,19,21.0,358,38.4,223,108,,1.4,,,33,22,337,7.0,,41.7,1
+P-10021,E-10021-01,2025-04-15T17:45:09.550903,37.8,81,136,76,98.2,12,21.0,484,37.1,,,,,,,,,440,10.5,,41.7,
+P-10021,E-10021-01,2025-04-15T20:18:57.940576,37.6,94,144,99,97.1,19,21.0,506,,490,,,,,,,,494,10.0,79,41.7,
+P-10021,E-10021-01,2025-04-15T18:12:15.671354,37.6,88,124,89,97.8,14,21.0,388,37.3,,,,,,8,31,24,363,8.4,,41.7,
+P-10021,E-10021-01,2025-04-15T19:05:41.715350,36.5,94,150,91,96.4,17,21.0,427,,,,,,,5,26,26,388,9.2,,41.7,1
+P-10021,E-10021-02,2025-04-12T16:25:23.477763,37.5,94,134,86,98.5,20,21.0,480,,,,,0.9,,6,,,432,10.4,,41.7,
+P-10021,E-10021-02,2025-04-12T18:11:21.786695,37.1,99,130,87,98.5,20,53.8,372,,,,0.54,,2,4,,,343,8.0,,41.7,
+P-10021,E-10021-02,2025-04-12T17:34:54.912088,36.7,89,145,95,97.7,15,21.0,478,35.2,193,118,,1.1,,,,,430,10.3,,41.7,
+P-10021,E-10021-02,2025-04-12T18:30:24.506220,36.7,84,133,86,98.9,20,32.0,450,40.7,,,0.32,1.2,7,,33,22,417,8.9,,41.7,
+P-10021,E-10021-02,2025-04-12T22:32:42.607112,38.0,85,129,91,96.6,13,21.0,377,,,,,0.8,,6,,,342,8.1,,41.7,
+P-10021,E-10021-02,2025-04-13T02:04:37.305743,36.9,89,132,86,99.1,16,21.0,424,,,,,0.9,,4,27,20,388,9.2,,41.7,
+P-10021,E-10021-02,2025-04-12T23:25:14.757345,37.2,89,155,98,99.0,12,21.0,530,35.0,,,,,,,31,22,495,10.4,,41.7,
+P-10021,E-10021-02,2025-04-13T02:05:58.427197,37.9,77,157,93,98.2,18,21.0,518,36.8,306,283,,0.9,,,,,498,11.2,,41.7,1
+P-10021,E-10021-02,2025-04-13T02:34:27.975919,36.8,78,136,85,96.1,20,38.5,433,44.1,,,0.39,,6,,,,428,9.4,65,41.7,
+P-10022,E-10022-01,2025-04-14T16:25:23.477763,36.7,78,147,86,94.8,13,21.0,384,41.7,,,,1.4,,8,,,353,6.1,,20.0,
+P-10022,E-10022-01,2025-04-14T17:51:37.743859,37.9,90,139,86,92.9,20,49.5,525,41.6,361,320,0.49,,6,,35,32,496,7.8,,20.0,
+P-10022,E-10022-01,2025-04-14T19:04:58.165895,37.3,55,136,94,99.0,15,21.0,477,,,,,1.3,,,25,,437,7.1,,20.0,
+P-10022,E-10022-01,2025-04-14T19:28:49.201987,37.8,77,161,91,99.0,20,21.0,530,,,,,1.4,,,32,20,494,7.9,59,20.0,
+P-10022,E-10022-01,2025-04-14T20:22:44.489841,37.8,86,127,90,97.2,20,21.0,504,,,,,1.5,,8,31,31,495,7.5,,20.0,
+P-10022,E-10022-01,2025-04-15T00:57:10.730296,36.6,76,141,96,97.3,16,21.0,447,,,,,1.3,,8,,,434,7.1,24,20.0,
+P-10022,E-10022-01,2025-04-15T04:09:03.597123,38.1,92,137,84,97.4,14,21.0,478,,,,,1.1,,,26,,466,7.1,,20.0,
+P-10022,E-10022-01,2025-04-15T04:10:47.017693,37.0,74,156,95,96.8,19,21.0,387,35.5,,,,1.2,,,,,364,5.8,,20.0,
+P-10022,E-10022-01,2025-04-15T03:48:46.914631,37.3,96,150,93,97.4,12,21.0,531,35.3,,,,,,6,,,529,8.5,,20.0,
+P-10022,E-10022-02,2025-04-15T16:25:23.477763,37.8,86,140,91,97.6,20,42.0,505,,353,172,0.42,1.0,4,,31,21,503,7.5,,20.0,1
+P-10022,E-10022-02,2025-04-15T17:22:34.363875,36.7,90,130,76,99.1,14,21.0,384,,,,,,,4,,,359,6.1,,20.0,1
+P-10022,E-10022-02,2025-04-15T18:22:57.831743,36.7,98,131,80,97.5,17,21.0,461,42.9,327,175,,,,8,28,,451,6.9,,20.0,1
+P-10022,E-10022-02,2025-04-15T22:10:22.977539,37.1,86,149,105,97.0,15,28.2,429,41.2,,,0.28,1.0,10,,33,26,428,6.9,,20.0,
+P-10022,E-10022-02,2025-04-15T20:40:36.801485,37.7,112,138,84,97.7,18,53.6,399,36.9,216,127,0.54,,5,,33,31,391,6.0,,20.0,
+P-10022,E-10022-02,2025-04-16T01:17:31.059044,37.3,86,158,86,96.1,16,21.0,509,35.7,150,,,,,6,,,465,7.6,,20.0,1
+P-10023,E-10023-01,2025-04-16T16:25:23.477763,36.9,85,114,79,99.2,19,21.0,356,,,,,0.9,,6,,,356,5.0,,32.3,1
+P-10023,E-10023-01,2025-04-16T18:00:54.531900,36.9,91,116,76,97.5,18,21.0,528,38.6,499,240,,,,,30,21,492,8.0,21,32.3,
+P-10023,E-10023-01,2025-04-16T19:11:06.893650,36.4,83,113,81,98.7,20,21.0,500,40.7,,,,1.1,,,33,31,467,7.1,,32.3,1
+P-10023,E-10023-01,2025-04-16T22:24:28.530555,37.0,69,125,74,96.8,16,21.0,394,,,,,1.1,,5,,,371,5.6,,32.3,
+P-10023,E-10023-01,2025-04-16T22:13:13.223286,36.0,67,136,80,96.2,17,21.0,501,,,,,,,,,,477,7.1,,32.3,1
+P-10023,E-10023-01,2025-04-16T19:23:49.822634,36.9,78,118,80,96.5,19,21.0,351,38.5,,,,,,7,27,26,336,5.3,,32.3,
+P-10023,E-10023-01,2025-04-16T20:27:47.364205,36.2,73,119,80,97.3,14,21.0,491,43.3,,,,0.9,,,,,486,7.4,,32.3,
+P-10023,E-10023-01,2025-04-17T02:24:01.804982,37.1,74,123,84,99.3,18,21.0,472,,123,80,,1.1,,7,,,431,7.1,45,32.3,
+P-10024,E-10024-01,2025-04-15T16:25:23.477763,36.3,73,128,89,97.1,17,21.0,435,,170,118,,,,7,,,392,8.2,,34.7,
+P-10024,E-10024-01,2025-04-15T18:07:48.098452,36.7,84,146,90,97.0,17,21.0,419,,,,,1.4,,,33,21,397,7.9,,34.7,
+P-10024,E-10024-01,2025-04-15T18:14:32.191799,36.2,76,140,95,96.8,19,21.0,469,37.4,,,,1.3,,7,,,463,8.2,75,34.7,1
+P-10024,E-10024-01,2025-04-15T19:52:21.430400,36.3,79,141,86,98.5,13,21.0,407,,,,,1.1,,5,28,,393,7.1,,34.7,
+P-10024,E-10024-01,2025-04-15T19:12:42.897089,36.3,79,133,82,97.0,20,21.0,406,43.5,,,,,,4,,,388,7.7,,34.7,
+P-10024,E-10024-01,2025-04-16T00:47:18.981436,36.2,80,141,90,97.8,13,21.0,452,,,,,1.4,,8,30,28,409,8.5,,34.7,1
+P-10024,E-10024-01,2025-04-15T21:21:43.902771,37.0,66,151,99,98.9,12,21.0,548,,490,459,,,,4,34,33,510,9.5,,34.7,1
+P-10024,E-10024-01,2025-04-15T22:03:37.547435,36.9,73,143,92,96.6,12,21.0,519,41.2,131,125,,,,,,,498,9.0,,34.7,
+P-10024,E-10024-01,2025-04-16T02:30:58.563859,36.3,65,125,87,98.3,16,21.0,466,42.3,,,,,,8,,,438,8.8,,34.7,
+P-10024,E-10024-01,2025-04-16T05:19:23.786954,36.8,77,135,98,99.5,18,53.4,488,,,,0.53,1.3,8,4,29,25,466,9.2,,34.7,
+P-10024,E-10024-01,2025-04-16T04:11:34.196901,36.3,67,144,92,96.9,13,21.0,469,,,,,,,,25,21,469,8.2,,34.7,
+P-10024,E-10024-01,2025-04-16T12:14:36.821705,36.5,74,130,90,97.9,18,21.0,400,41.5,178,147,,,,,,,394,7.5,,34.7,
+P-10024,E-10024-01,2025-04-16T06:32:12.115556,37.0,65,135,79,98.8,17,21.0,441,,,,,0.9,,,,,422,7.7,,34.7,
+P-10024,E-10024-01,2025-04-16T08:07:20.974603,36.2,75,128,88,97.0,17,21.0,465,,351,312,,,,,,,435,8.1,75,34.7,
+P-10024,E-10024-02,2025-04-11T16:25:23.479765,36.5,68,131,86,98.7,12,21.0,417,43.7,,,,0.9,,6,25,23,397,7.3,,34.7,
+P-10024,E-10024-02,2025-04-11T17:08:03.184724,36.5,79,142,82,96.2,17,21.0,403,,,,,1.1,,6,,,378,7.0,,34.7,
+P-10024,E-10024-02,2025-04-11T18:59:31.185642,36.2,67,131,96,97.5,18,21.0,448,38.4,,,,0.8,,8,,,421,7.8,,34.7,
+P-10024,E-10024-02,2025-04-11T20:08:42.902192,36.9,72,136,89,98.1,15,21.0,382,,,,,0.9,,,,,377,7.2,25,34.7,
+P-10024,E-10024-02,2025-04-11T21:13:54.967901,36.3,85,156,102,92.4,13,21.0,498,43.3,,,,1.5,,,32,32,473,8.7,,34.7,
+P-10024,E-10024-02,2025-04-11T19:05:08.399906,36.8,81,130,80,95.6,12,43.0,532,44.8,,,0.43,1.2,8,6,,,514,9.3,,34.7,
+P-10024,E-10024-02,2025-04-11T20:30:58.406696,36.4,96,158,89,98.3,17,21.0,442,40.0,297,267,,,,8,,,439,7.7,,34.7,
+P-10024,E-10024-02,2025-04-12T01:10:41.500813,36.3,72,156,92,96.2,18,21.0,413,39.5,,,,,,5,,,397,7.2,,34.7,
+P-10024,E-10024-02,2025-04-12T05:37:41.149984,36.2,82,131,94,96.5,16,21.0,366,38.9,,,,1.3,,7,,,353,6.9,,34.7,
+P-10024,E-10024-02,2025-04-11T21:56:55.521143,36.4,69,139,96,95.7,19,21.0,514,35.9,,,,,,8,30,25,468,8.9,,34.7,
+P-10024,E-10024-02,2025-04-12T00:57:49.048800,36.8,73,130,83,96.5,12,21.0,546,38.8,370,259,,,,5,,,513,10.3,,34.7,
+P-10024,E-10024-02,2025-04-12T05:52:56.495843,36.7,76,127,84,98.0,17,21.0,451,,,,,1.0,,,29,27,432,7.8,,34.7,
+P-10024,E-10024-02,2025-04-12T07:59:24.295245,36.3,70,133,86,99.3,16,21.0,496,35.3,259,190,,1.2,,,,,457,8.6,,34.7,
+P-10024,E-10024-02,2025-04-12T08:57:37.006400,36.4,65,123,86,97.1,14,21.0,526,,,,,,,,,,510,9.1,,34.7,
+P-10024,E-10024-03,2025-04-07T16:25:23.479765,36.1,75,134,90,98.0,15,21.0,471,38.0,394,234,,0.9,,,,,426,8.2,,34.7,
+P-10024,E-10024-03,2025-04-07T17:50:45.441261,36.7,78,125,92,96.2,12,21.0,440,35.7,,,,1.0,,,,,400,8.3,,34.7,
+P-10024,E-10024-03,2025-04-07T17:59:34.046596,37.5,73,131,85,98.2,13,21.0,355,,,,,,,,27,21,351,6.2,,34.7,
+P-10024,E-10024-03,2025-04-07T19:50:52.056161,37.0,76,130,83,94.6,13,54.2,522,44.7,,,0.54,,10,,26,20,471,9.1,,34.7,1
+P-10024,E-10024-03,2025-04-07T19:17:52.456238,36.7,67,163,89,97.6,20,21.0,351,39.3,,,,,,5,32,26,318,6.1,,34.7,1
+P-10024,E-10024-03,2025-04-08T00:19:28.719458,36.2,71,139,90,99.4,15,21.0,469,36.6,368,291,,0.8,,,32,,468,8.2,,34.7,
+P-10024,E-10024-03,2025-04-07T22:37:40.782784,37.0,82,142,101,96.5,14,51.1,382,35.7,148,85,0.51,,7,4,32,24,375,7.2,76,34.7,
+P-10024,E-10024-03,2025-04-08T00:16:16.043531,36.9,81,144,87,92.2,17,21.0,382,41.5,207,153,,1.5,,,,,355,6.6,,34.7,
+P-10024,E-10024-03,2025-04-08T02:20:40.891588,37.1,79,133,84,96.6,18,21.0,482,,,,,1.3,,,34,31,452,8.4,,34.7,
+P-10024,E-10024-03,2025-04-08T04:20:25.126105,37.1,85,149,95,97.3,16,21.0,509,39.1,,,,1.3,,6,,,478,8.9,,34.7,
+P-10024,E-10024-03,2025-04-08T06:15:52.954179,36.3,80,143,85,97.7,16,21.0,384,,377,370,,1.0,,,31,30,355,6.7,52,34.7,
+P-10024,E-10024-03,2025-04-08T02:33:33.967334,36.6,70,143,79,97.3,15,21.0,469,,,,,1.1,,,27,,439,8.8,77,34.7,
+P-10024,E-10024-03,2025-04-07T23:46:05.303386,36.3,69,145,92,97.0,13,21.0,422,40.2,,,,,,,,,411,7.3,,34.7,
+P-10025,E-10025-01,2025-04-14T16:25:23.479765,37.0,72,135,77,97.7,12,21.0,504,,,,,1.4,,5,,,466,7.2,,30.2,1
+P-10025,E-10025-01,2025-04-14T18:03:21.085564,37.1,95,141,81,99.3,18,21.0,545,40.7,,,,,,6,32,,508,7.4,,30.2,
+P-10025,E-10025-01,2025-04-14T18:40:54.904534,37.1,86,124,84,96.2,17,21.0,520,38.3,,,,,,,25,23,512,7.5,,30.2,
+P-10025,E-10025-01,2025-04-14T21:09:41.855209,37.0,90,150,96,97.9,19,21.0,525,,,,,,,,28,22,491,7.1,,30.2,1
+P-10025,E-10025-01,2025-04-14T22:03:28.820494,36.3,87,133,82,98.0,15,21.0,536,41.1,,,,1.0,,,,,533,7.7,,30.2,
+P-10025,E-10025-01,2025-04-14T19:45:22.830024,36.8,98,129,99,97.0,15,21.0,489,36.2,251,,,,,,28,28,473,6.6,,30.2,
+P-10025,E-10025-01,2025-04-14T23:50:29.300665,36.2,92,137,93,97.5,18,21.0,431,36.8,,,,,,7,,,413,6.2,20,30.2,
+P-10025,E-10025-01,2025-04-14T22:50:18.485571,37.2,75,137,91,96.8,24,21.0,415,,,,,,,,34,,377,5.6,,30.2,
+P-10025,E-10025-01,2025-04-15T02:56:56.905256,36.6,85,148,99,98.4,17,21.0,358,,,,,1.0,,8,,,354,4.8,59,30.2,
+P-10025,E-10025-02,2025-04-10T16:25:23.479765,37.1,81,129,83,98.0,12,21.0,544,,163,102,,,,,,,516,7.3,34,30.2,
+P-10025,E-10025-02,2025-04-10T17:04:53.878473,37.1,83,126,84,96.2,13,21.0,545,36.1,327,300,,,,,,,531,7.4,45,30.2,1
+P-10025,E-10025-02,2025-04-10T19:41:21.464755,37.0,93,157,103,98.2,14,21.0,477,42.0,,,,,,,28,,450,6.4,,30.2,1
+P-10025,E-10025-02,2025-04-10T22:11:58.817946,37.1,72,157,98,97.7,14,21.0,426,,,,,,,,,,426,6.1,,30.2,
+P-10025,E-10025-02,2025-04-10T20:59:34.888941,36.9,100,125,87,96.7,13,21.0,408,,,,,,,,30,,390,5.5,,30.2,
+P-10025,E-10025-02,2025-04-11T02:01:04.111619,36.1,87,136,88,97.8,12,21.0,425,,,,,1.0,,,28,28,410,6.1,,30.2,1
+P-10025,E-10025-02,2025-04-11T01:16:31.693318,37.1,79,145,87,97.0,17,21.0,430,,,,,1.2,,,25,21,404,5.8,,30.2,
+P-10025,E-10025-02,2025-04-11T00:02:31.679601,36.9,65,162,95,94.8,16,21.0,438,35.3,,,,1.1,,7,,,405,5.9,,30.2,1
+P-10025,E-10025-02,2025-04-11T05:48:33.029737,36.1,93,158,91,96.5,17,21.0,542,42.6,279,217,,1.4,,5,,,538,7.8,,30.2,
+P-10025,E-10025-02,2025-04-11T04:55:06.771030,36.6,68,144,76,96.1,18,21.0,476,,,,,1.2,,,32,24,468,6.4,,30.2,
+P-10025,E-10025-02,2025-04-11T07:42:19.858646,36.6,105,137,90,96.8,20,21.0,418,,453,277,,1.2,,4,25,20,383,5.6,,30.2,
+P-10025,E-10025-02,2025-04-10T23:17:40.613060,36.7,91,144,82,96.6,20,21.0,477,37.9,435,142,,1.4,,,,,457,6.4,,30.2,
+P-10026,E-10026-01,2025-04-14T16:25:23.479765,37.2,70,139,97,98.3,17,21.0,365,,,,,1.0,,,34,,356,5.4,,25.5,1
+P-10026,E-10026-01,2025-04-14T17:41:59.407054,36.4,72,149,95,99.0,20,21.0,496,44.3,,,,0.9,,,,,446,7.4,,25.5,
+P-10026,E-10026-01,2025-04-14T19:18:37.552017,36.5,67,140,89,95.7,13,39.9,391,,,,0.4,1.1,2,,34,21,362,5.8,,25.5,
+P-10026,E-10026-01,2025-04-14T19:42:40.448837,36.4,73,129,76,97.6,18,21.0,360,,,,,,,,,,329,5.3,,25.5,
+P-10026,E-10026-01,2025-04-15T00:08:19.595688,37.1,70,136,93,98.2,12,21.0,376,,,,,1.2,,,28,25,350,6.0,53,25.5,1
+P-10026,E-10026-01,2025-04-14T19:38:14.996945,36.1,79,137,86,99.2,17,21.0,477,42.4,,,,,,4,27,,454,7.1,,25.5,
+P-10026,E-10026-01,2025-04-14T22:18:08.067171,37.0,44,134,83,98.4,14,21.0,407,,,,,1.3,,,,,407,6.0,,25.5,
+P-10026,E-10026-01,2025-04-14T21:14:18.313827,36.8,74,153,96,98.3,17,21.0,448,,,,,0.9,,,28,26,418,7.1,,25.5,1
+P-10026,E-10026-01,2025-04-15T08:14:25.392889,37.0,81,151,102,98.2,14,21.0,511,35.9,447,384,,,,,31,,511,8.1,58,25.5,
+P-10026,E-10026-02,2025-04-13T16:25:23.479765,36.9,84,124,92,97.9,17,30.3,544,,491,476,0.3,,10,5,,,521,8.1,,25.5,
+P-10026,E-10026-02,2025-04-13T18:05:07.795111,36.5,104,127,81,98.6,17,21.0,512,42.4,,,,,,,,,507,7.6,,25.5,1
+P-10026,E-10026-02,2025-04-13T18:05:25.271963,36.4,63,130,82,98.9,18,21.0,530,40.5,246,196,,,,,,,480,7.9,,25.5,
+P-10026,E-10026-02,2025-04-13T21:04:46.540353,36.3,76,126,99,96.4,18,21.0,539,,,,,1.1,,,27,24,491,8.6,,25.5,1
+P-10026,E-10026-02,2025-04-13T19:52:36.554451,37.2,85,129,80,97.6,18,21.0,546,38.2,,,,1.4,,,,,505,8.1,,25.5,
+P-10026,E-10026-02,2025-04-13T21:17:35.130344,36.8,79,134,92,98.2,14,21.0,543,,106,85,,,,6,25,24,508,8.0,54,25.5,
+P-10026,E-10026-02,2025-04-13T19:43:25.817608,36.7,85,139,82,96.4,12,21.0,350,,491,283,,1.5,,5,,,327,5.6,,25.5,
+P-10026,E-10026-03,2025-04-15T16:25:23.479765,37.2,67,150,93,96.0,20,21.0,437,,,,,,,,29,21,426,6.5,,25.5,
+P-10026,E-10026-03,2025-04-15T17:37:24.016806,37.2,74,137,88,98.8,17,21.0,351,41.1,,,,1.3,,4,,,344,5.2,,25.5,1
+P-10026,E-10026-03,2025-04-15T18:47:45.174229,36.5,71,140,98,99.1,16,21.0,544,,410,,,0.9,,4,31,27,523,8.6,,25.5,1
+P-10026,E-10026-03,2025-04-15T18:00:18.241385,36.8,70,138,97,96.8,12,21.0,505,44.4,,,,0.8,,7,33,22,478,7.5,,25.5,
+P-10026,E-10026-03,2025-04-15T20:30:07.375198,37.1,84,131,81,97.4,20,27.9,465,36.9,,,0.28,,2,,34,,458,6.9,,25.5,
+P-10026,E-10026-03,2025-04-15T23:21:48.938490,36.4,83,141,82,96.3,17,21.0,477,43.4,,,,1.4,,,,,448,7.1,,25.5,
+P-10026,E-10026-03,2025-04-16T04:19:07.462473,36.2,76,144,84,97.6,17,21.0,506,,107,105,,,,,25,24,467,7.5,,25.5,1
+P-10026,E-10026-03,2025-04-15T23:55:04.563432,36.2,77,137,86,98.1,20,21.0,437,44.6,245,99,,,,,,,400,6.5,,25.5,
+P-10027,E-10027-01,2025-04-16T16:25:23.479765,36.5,75,116,76,94.9,22,21.0,412,35.3,,,,0.9,,4,,,407,6.6,,29.1,1
+P-10027,E-10027-01,2025-04-16T17:24:39.386138,36.8,74,113,83,98.6,16,21.0,435,38.6,,,,,,,,,396,7.5,65,29.1,
+P-10027,E-10027-01,2025-04-16T17:49:27.557407,37.1,84,123,71,98.8,12,21.0,406,35.9,232,223,,1.4,,,,,368,6.5,,29.1,
+P-10027,E-10027-01,2025-04-16T22:20:52.055684,36.7,66,119,81,96.5,15,38.0,533,,261,90,0.38,1.1,7,,32,31,503,8.5,,29.1,1
+P-10027,E-10027-01,2025-04-16T22:02:25.172283,36.7,69,123,85,96.8,15,21.0,481,42.7,,,,1.2,,,,,454,8.3,39,29.1,
+P-10027,E-10027-01,2025-04-16T20:58:59.565232,36.6,59,120,86,97.9,18,21.0,437,,,,,1.2,,,,,417,7.0,,29.1,
+P-10027,E-10027-01,2025-04-17T02:14:57.987047,37.0,76,114,75,97.0,17,21.0,491,,407,,,1.0,,,30,24,474,8.5,,29.1,
+P-10027,E-10027-02,2025-04-14T16:25:23.479765,36.2,71,112,85,92.8,16,21.0,512,37.2,120,110,,,,6,,,480,8.8,,29.1,1
+P-10027,E-10027-02,2025-04-14T18:23:43.651790,36.9,83,112,76,97.3,19,56.0,546,,,,0.56,,2,7,,,498,8.7,,29.1,1
+P-10027,E-10027-02,2025-04-14T17:33:43.587059,37.1,83,110,80,96.9,18,32.8,436,,,,0.33,,6,,,,416,7.5,,29.1,
+P-10027,E-10027-02,2025-04-14T20:08:49.142645,37.1,81,129,87,98.7,17,21.0,473,,,,,0.8,,,35,,435,8.2,,29.1,
+P-10027,E-10027-02,2025-04-14T23:27:30.271234,37.1,75,115,84,96.2,19,21.0,405,38.2,,,,,,,35,,368,6.5,,29.1,
+P-10027,E-10027-03,2025-04-03T16:25:23.479765,36.4,83,128,83,99.4,13,21.0,374,42.4,205,115,,,,,,,336,6.4,57,29.1,
+P-10027,E-10027-03,2025-04-03T18:20:10.353055,37.1,65,111,85,98.8,20,21.0,426,,176,124,,,,,,,398,7.3,46,29.1,
+P-10027,E-10027-03,2025-04-03T20:09:18.810657,36.1,84,122,78,98.7,18,21.0,478,,,,,1.0,,4,,,464,8.2,,29.1,1
+P-10027,E-10027-03,2025-04-03T22:03:31.169186,36.9,53,112,77,96.6,14,29.2,362,38.4,494,235,0.29,,8,5,,,329,6.2,,29.1,
+P-10027,E-10027-03,2025-04-03T20:29:20.185412,36.9,69,110,83,97.1,15,21.0,405,35.7,240,91,,1.5,,,34,34,394,6.5,,29.1,
+P-10027,E-10027-03,2025-04-03T20:51:09.349778,36.1,81,142,84,99.3,17,21.0,496,43.7,,,,1.1,,,31,22,463,7.9,,29.1,
+P-10027,E-10027-03,2025-04-03T21:02:57.800990,36.0,89,111,74,92.9,17,21.0,427,,,,,0.9,,6,27,23,397,7.4,,29.1,
+P-10028,E-10028-01,2025-04-15T16:25:23.479765,37.0,85,139,97,99.0,14,21.0,468,43.6,,,,,,,,,456,8.5,,39.4,
+P-10028,E-10028-01,2025-04-15T18:12:20.965691,36.2,66,140,90,98.6,12,21.0,382,,,,,,,4,26,26,356,6.9,,39.4,
+P-10028,E-10028-01,2025-04-15T18:25:58.868199,37.0,80,146,87,99.1,12,21.0,499,42.0,,,,1.3,,,31,30,462,9.0,34,39.4,
+P-10028,E-10028-01,2025-04-15T21:31:00.031786,36.1,71,135,94,96.9,19,47.7,457,36.4,,,0.48,,2,7,,,447,8.3,,39.4,1
+P-10028,E-10028-01,2025-04-15T23:20:23.588763,37.7,76,156,90,96.5,17,21.0,404,40.3,416,98,,,,5,,,394,8.0,,39.4,
+P-10028,E-10028-01,2025-04-15T21:00:48.678477,36.9,73,138,81,98.9,17,42.6,515,,,,0.43,0.8,3,6,26,25,479,10.2,,39.4,
+P-10028,E-10028-01,2025-04-16T02:37:00.265909,37.7,80,143,77,99.4,18,38.4,386,,,,0.38,0.8,7,,28,21,351,7.6,76,39.4,
+P-10028,E-10028-01,2025-04-16T00:57:42.716564,36.9,74,133,92,96.3,13,21.0,489,38.6,,,,,,,,,475,9.6,,39.4,
+P-10028,E-10028-01,2025-04-16T05:48:56.392576,37.0,80,140,86,98.7,16,21.0,529,44.4,,,,1.2,,6,29,28,517,10.4,,39.4,
+P-10028,E-10028-02,2025-04-09T16:25:23.479765,36.1,82,128,93,99.0,16,21.0,504,35.2,,,,1.5,,,,,489,9.9,66,39.4,1
+P-10028,E-10028-02,2025-04-09T18:03:05.594407,36.8,75,128,84,96.5,19,21.0,426,,,,,1.0,,,33,22,426,7.7,,39.4,1
+P-10028,E-10028-02,2025-04-09T18:46:38.583988,37.1,84,139,95,98.4,20,21.0,478,,,,,1.4,,,,,443,9.4,,39.4,
+P-10028,E-10028-02,2025-04-09T21:52:17.759802,36.1,81,134,85,97.5,15,21.0,433,41.2,,,,1.4,,,25,21,432,8.5,,39.4,
+P-10028,E-10028-02,2025-04-09T21:42:24.762352,36.5,81,143,85,96.7,18,21.0,492,41.0,,,,1.1,,,32,,468,9.7,,39.4,
+P-10028,E-10028-03,2025-04-10T16:25:23.479765,37.5,82,138,95,96.3,15,21.0,401,,,,,0.8,,,31,20,368,7.3,,39.4,
+P-10028,E-10028-03,2025-04-10T18:21:06.337936,36.9,82,127,77,98.9,12,21.0,422,,,,,,,,28,27,407,8.3,,39.4,
+P-10028,E-10028-03,2025-04-10T19:33:23.513886,36.0,73,121,94,97.4,16,21.0,500,44.8,,,,,,7,,,482,9.1,,39.4,
+P-10028,E-10028-03,2025-04-10T20:55:21.321155,36.3,69,134,89,92.6,14,21.0,493,,,,,1.1,,,,,467,9.7,,39.4,
+P-10028,E-10028-03,2025-04-11T00:01:26.987622,37.4,73,138,85,98.6,19,21.0,372,,241,,,,,,28,,368,7.3,,39.4,
+P-10028,E-10028-03,2025-04-10T23:37:27.842658,37.0,76,131,80,98.7,17,21.0,508,,,,,,,,33,22,497,10.0,,39.4,
+P-10028,E-10028-03,2025-04-11T02:38:25.923606,36.2,81,138,89,96.1,20,21.0,526,,325,283,,1.4,,7,,,497,10.4,,39.4,
+P-10028,E-10028-03,2025-04-11T01:07:38.239162,36.8,70,125,88,99.5,19,21.0,351,37.0,,,,,,,,,343,6.9,,39.4,
+P-10028,E-10028-03,2025-04-11T06:53:58.886272,36.3,84,142,87,96.1,17,21.0,525,,361,167,,0.8,,,,,518,10.3,,39.4,
+P-10029,E-10029-01,2025-04-16T16:25:23.479765,36.8,78,125,85,98.2,16,21.0,421,,,,,,,6,,,402,6.2,,28.8,
+P-10029,E-10029-01,2025-04-16T17:30:28.585268,36.9,104,134,75,96.7,15,21.0,372,,,,,,,,,,355,5.2,41,28.8,1
+P-10029,E-10029-01,2025-04-16T17:54:58.330568,37.2,88,134,82,98.1,17,21.0,398,37.7,,,,,,,28,20,374,5.9,,28.8,
+P-10029,E-10029-01,2025-04-16T21:54:50.674067,36.2,92,128,79,98.5,16,21.0,388,36.3,,,,1.0,,,,,380,5.4,,28.8,1
+P-10029,E-10029-01,2025-04-16T18:45:23.049557,36.0,86,123,90,96.6,12,21.0,482,,,,,,,,35,28,468,6.7,,28.8,
+P-10029,E-10029-01,2025-04-16T21:56:57.398254,36.4,93,135,79,99.4,19,21.0,396,44.4,,,,1.0,,6,,,357,5.9,,28.8,1
+P-10029,E-10029-01,2025-04-17T03:15:34.148938,36.1,54,150,89,94.5,13,21.0,414,39.4,,,,0.9,,8,,,375,6.1,,28.8,1
+P-10029,E-10029-01,2025-04-17T05:06:40.676700,36.2,83,144,87,96.3,17,29.7,426,,332,245,0.3,1.4,7,5,,,403,5.9,,28.8,1
+P-10029,E-10029-01,2025-04-17T03:30:09.555433,36.8,81,142,103,99.4,20,21.0,354,,177,102,,,,,,,341,5.2,48,28.8,
+P-10030,E-10030-01,2025-04-16T16:25:23.479765,36.6,91,132,85,99.4,13,21.0,422,,,,,,,5,,,399,5.9,,19.9,
+P-10030,E-10030-01,2025-04-16T17:47:35.752375,37.1,84,145,87,97.9,15,57.1,421,,,,0.57,,4,,,,391,6.3,23,19.9,
+P-10030,E-10030-01,2025-04-16T17:34:43.488984,37.7,90,154,94,99.5,20,21.0,524,43.9,,,,1.0,,,25,21,483,7.3,,19.9,
+P-10030,E-10030-01,2025-04-16T18:48:31.688638,36.5,97,156,88,96.5,13,21.0,420,,,,,1.4,,,,,394,6.2,,19.9,
+P-10030,E-10030-01,2025-04-16T22:38:18.361598,36.2,97,140,91,96.5,22,21.0,440,,344,244,,0.9,,,,,403,6.5,,19.9,
+P-10030,E-10030-01,2025-04-16T23:28:55.141081,37.1,99,129,95,98.5,14,21.0,466,,,,,,,4,,,435,6.9,,19.9,
+P-10030,E-10030-01,2025-04-16T20:26:47.287614,36.3,102,121,90,97.6,17,21.0,512,42.0,,,,1.4,,4,,,502,7.1,,19.9,1
+P-10030,E-10030-01,2025-04-16T20:18:38.001016,36.8,84,149,97,96.6,20,21.0,550,38.1,,,,1.4,,,,,549,8.2,,19.9,1
+P-10030,E-10030-01,2025-04-17T07:39:39.389526,36.0,90,126,90,98.6,20,21.0,377,37.4,,,,1.3,,7,,,354,5.3,,19.9,
+P-10030,E-10030-01,2025-04-17T09:18:37.361281,37.2,89,129,92,96.4,15,21.0,436,,,,,1.2,,,,,399,6.5,,19.9,
+P-10030,E-10030-01,2025-04-17T10:49:17.945720,37.7,97,148,83,97.1,20,21.0,519,,,,,1.4,,7,,,504,7.7,,19.9,
+P-10030,E-10030-01,2025-04-17T13:32:55.382142,36.7,74,136,87,97.3,22,31.7,424,,,,0.32,,2,,,,385,6.3,,19.9,
+P-10031,E-10031-01,2025-04-14T16:25:23.479765,37.1,74,113,84,98.2,18,21.0,364,,,,,0.8,,,,,340,5.8,,33.9,1
+P-10031,E-10031-01,2025-04-14T17:38:12.952397,36.2,73,135,84,93.2,17,21.0,412,37.2,,,,1.4,,,34,21,394,6.2,,33.9,
+P-10031,E-10031-01,2025-04-14T18:36:56.769414,36.3,71,123,80,96.3,13,21.0,498,36.2,,,,,,6,,,485,8.0,37,33.9,
+P-10031,E-10031-01,2025-04-14T20:37:54.356842,36.3,73,119,70,96.5,14,53.0,363,44.8,310,109,0.53,1.1,2,,30,25,351,5.4,,33.9,
+P-10031,E-10031-01,2025-04-14T20:24:32.415283,36.4,67,112,77,98.8,14,21.0,352,,,,,1.4,,,,,347,5.7,,33.9,
+P-10031,E-10031-01,2025-04-14T21:24:00.215470,37.7,67,133,81,95.6,16,21.0,445,40.7,,,,1.2,,,35,21,436,7.2,,33.9,
+P-10031,E-10031-01,2025-04-14T23:45:36.475701,36.7,67,123,72,98.8,14,21.0,396,38.9,,,,1.5,,,28,,381,6.4,,33.9,
+P-10031,E-10031-01,2025-04-15T03:31:10.926776,36.2,81,112,85,97.7,17,21.0,538,,,,,,,,,,502,8.1,,33.9,1
+P-10031,E-10031-01,2025-04-15T03:55:22.674810,36.5,67,123,80,92.2,18,21.0,364,44.5,,,,1.5,,,,,359,5.5,,33.9,1
+P-10031,E-10031-01,2025-04-15T08:55:25.560672,36.9,71,113,75,97.1,19,21.0,522,,,,,1.3,,,,,484,7.8,,33.9,
+P-10031,E-10031-01,2025-04-15T01:09:36.184266,36.6,84,113,81,97.2,19,21.0,375,37.5,,,,1.2,,4,34,,342,5.6,29,33.9,
+P-10031,E-10031-01,2025-04-15T09:05:30.562950,36.6,99,138,92,97.7,16,21.0,542,40.1,,,,,,,,,519,8.7,,33.9,
+P-10031,E-10031-01,2025-04-14T23:31:24.115580,36.1,75,124,81,97.2,19,21.0,372,,,,,1.1,,4,25,,344,6.0,,33.9,
+P-10031,E-10031-01,2025-04-14T23:48:43.449223,36.3,68,131,92,99.3,15,34.1,406,,,,0.34,,10,8,28,26,366,6.5,61,33.9,
+P-10031,E-10031-02,2025-04-08T16:25:23.479765,36.8,83,124,84,98.4,16,45.6,539,35.3,,,0.46,,10,,,,500,8.7,80,33.9,
+P-10031,E-10031-02,2025-04-08T18:09:12.836473,36.2,71,120,81,97.9,12,21.0,464,42.1,,,,,,8,32,29,452,7.5,,33.9,
+P-10031,E-10031-02,2025-04-08T18:59:17.654894,36.0,72,112,81,96.8,14,21.0,482,,,,,,,,33,24,443,7.7,,33.9,1
+P-10031,E-10031-02,2025-04-08T19:55:47.433070,36.8,77,124,71,97.7,12,21.0,497,,,,,,,,,,478,7.4,,33.9,
+P-10031,E-10031-02,2025-04-08T19:55:55.544991,36.4,87,117,75,99.4,18,21.0,462,35.2,,,,,,6,35,21,447,7.4,,33.9,
+P-10031,E-10031-02,2025-04-08T21:59:37.613345,36.7,79,132,79,96.2,18,21.0,516,,,,,0.9,,5,,,475,8.3,63,33.9,
+P-10031,E-10031-02,2025-04-08T20:40:48.647517,37.1,59,115,84,96.2,18,21.0,491,,,,,,,6,33,28,470,7.9,,33.9,
+P-10031,E-10031-02,2025-04-09T00:17:30.068375,36.3,68,111,72,97.6,15,21.0,405,,,,,1.3,,4,,,375,6.5,,33.9,
+P-10031,E-10031-02,2025-04-09T05:12:26.203757,37.5,85,121,81,93.9,14,21.0,440,,,,,1.3,,6,26,22,400,6.6,47,33.9,1
+P-10031,E-10031-02,2025-04-09T01:05:31.638380,36.4,67,115,72,97.6,20,59.7,381,,432,120,0.6,,5,7,31,31,357,6.1,,33.9,
+P-10031,E-10031-02,2025-04-09T10:52:30.487495,36.6,83,124,74,98.1,15,56.1,515,35.5,,,0.56,0.9,6,4,33,,494,8.3,,33.9,
+P-10031,E-10031-02,2025-04-09T06:18:24.600104,37.0,42,125,90,99.3,12,21.0,502,,,,,1.4,,,30,,485,8.1,77,33.9,1
+P-10031,E-10031-02,2025-04-09T14:00:44.085164,37.2,74,111,77,92.0,14,21.0,514,38.2,349,80,,1.5,,,32,26,477,8.3,60,33.9,1
+P-10031,E-10031-02,2025-04-08T23:31:38.438318,36.2,73,142,88,98.2,15,52.5,429,,134,107,0.53,1.2,5,7,,,391,6.4,,33.9,
+P-10032,E-10032-01,2025-04-14T16:25:23.479765,36.7,102,137,85,98.3,20,21.0,545,,,,,,,,,,516,11.3,,41.3,
+P-10032,E-10032-01,2025-04-14T18:10:54.412242,36.9,90,148,86,99.3,16,21.0,486,,,,,1.1,,5,32,32,444,9.3,,41.3,
+P-10032,E-10032-01,2025-04-14T17:29:22.182220,36.8,91,137,80,98.7,16,37.7,428,43.9,,,0.38,1.1,10,,,,409,8.1,25,41.3,
+P-10032,E-10032-01,2025-04-14T17:58:41.053352,37.1,58,140,87,98.1,15,21.0,507,,,,,,,,,,470,9.7,,41.3,
+P-10032,E-10032-01,2025-04-14T20:00:59.191411,37.2,91,133,89,97.5,15,21.0,517,35.2,,,,0.9,,,34,29,468,9.8,,41.3,1
+P-10032,E-10032-01,2025-04-14T21:06:29.431043,38.0,79,127,88,93.1,15,21.0,547,38.0,,,,1.1,,,35,,540,10.4,,41.3,
+P-10032,E-10032-01,2025-04-14T22:06:37.798218,37.5,84,146,84,98.9,12,21.0,388,39.4,,,,1.4,,4,27,,375,8.1,39,41.3,
+P-10032,E-10032-01,2025-04-15T03:51:04.114200,37.2,78,129,91,98.5,15,21.0,542,,,,,1.4,,,,,492,11.3,,41.3,
+P-10032,E-10032-01,2025-04-15T05:42:09.302782,37.1,90,135,84,96.1,13,21.0,448,,212,,,1.5,,,,,436,8.5,,41.3,
+P-10032,E-10032-01,2025-04-14T21:59:51.404411,37.6,87,123,91,98.0,12,40.3,504,,435,,0.4,1.2,4,4,,,466,9.6,,41.3,
+P-10032,E-10032-01,2025-04-14T23:44:41.493117,36.4,89,136,87,98.7,15,21.0,550,,217,130,,,,6,,,504,10.5,,41.3,1
+P-10032,E-10032-01,2025-04-14T23:26:56.746460,38.0,120,142,91,97.2,18,21.0,459,35.5,323,224,,,,,,,445,9.6,,41.3,
+P-10032,E-10032-02,2025-04-11T16:25:23.479765,36.9,113,139,90,98.2,17,21.0,405,35.9,,,,1.0,,,,,376,7.7,60,41.3,
+P-10032,E-10032-02,2025-04-11T17:51:40.391946,37.3,98,139,81,98.9,17,48.5,493,41.6,,,0.48,1.0,9,,27,,481,9.4,,41.3,
+P-10032,E-10032-02,2025-04-11T18:33:16.558692,37.1,66,138,97,93.9,18,21.0,550,,,,,,,5,25,20,523,10.5,,41.3,
+P-10032,E-10032-02,2025-04-11T18:52:08.406505,37.6,88,137,92,98.5,14,21.0,362,,224,126,,0.9,,,30,,352,7.5,,41.3,
+P-10032,E-10032-02,2025-04-11T20:24:30.226653,37.5,93,146,87,97.0,12,56.5,407,,,,0.56,1.3,4,7,,,367,8.5,,41.3,
+P-10032,E-10032-02,2025-04-11T23:53:03.370248,37.3,81,141,95,99.0,14,21.0,524,,,,,,,7,30,22,524,10.0,,41.3,
+P-10032,E-10032-02,2025-04-11T23:29:05.526796,37.4,96,143,90,95.4,17,21.0,428,40.6,,,,,,,,,387,8.1,,41.3,
+P-10032,E-10032-02,2025-04-11T23:23:08.451300,36.7,79,133,86,96.3,13,21.0,520,44.0,209,109,,1.2,,,,,492,10.8,,41.3,
+P-10032,E-10032-02,2025-04-12T03:13:55.773384,37.0,77,141,94,94.9,18,21.0,399,,498,367,,1.4,,6,,,382,7.6,,41.3,
+P-10032,E-10032-03,2025-04-17T16:25:23.479765,36.9,67,128,95,97.8,20,55.2,456,40.4,376,140,0.55,1.2,9,5,27,20,416,8.7,,41.3,
+P-10032,E-10032-03,2025-04-17T17:02:01.718359,36.8,85,157,89,96.8,13,21.0,445,,225,143,,1.4,,,,,421,9.3,61,41.3,
+P-10032,E-10032-03,2025-04-17T20:00:47.858941,37.8,89,156,91,97.0,12,21.0,526,44.8,,,,,,5,29,20,480,10.0,,41.3,1
+P-10032,E-10032-03,2025-04-17T18:27:27.795044,36.8,97,135,77,97.3,12,26.4,508,,,,0.26,,9,,,,491,9.7,80,41.3,
+P-10032,E-10032-03,2025-04-17T22:21:13.705071,37.2,77,141,78,96.3,15,21.0,370,,,,,1.4,,6,35,,361,7.0,68,41.3,
+P-10032,E-10032-03,2025-04-17T22:55:00.624510,36.5,85,144,95,95.9,18,21.0,489,37.2,339,213,,,,6,31,26,440,10.2,,41.3,1
+P-10032,E-10032-03,2025-04-18T01:30:23.990698,36.9,86,125,87,97.1,14,21.0,375,,,,,1.4,,,34,32,341,7.1,,41.3,1
+P-10032,E-10032-03,2025-04-17T22:28:29.138105,36.8,99,136,88,98.5,19,21.0,436,,,,,0.8,,,28,25,431,8.3,,41.3,
+P-10032,E-10032-03,2025-04-17T21:03:09.394953,37.5,71,126,80,97.1,17,21.0,493,,461,253,,1.3,,,,,446,10.3,,41.3,
+P-10032,E-10032-03,2025-04-18T02:12:32.903500,37.9,85,143,80,96.3,17,21.0,430,43.8,,,,1.0,,5,,,393,9.0,,41.3,
+P-10033,E-10033-01,2025-04-14T16:25:23.479765,37.0,81,120,84,99.2,19,21.0,543,36.4,,,,,,7,,,502,8.6,,22.4,1
+P-10033,E-10033-01,2025-04-14T17:10:31.299578,36.8,77,113,71,97.4,14,21.0,475,,294,85,,1.4,,,35,24,436,8.1,,22.4,
+P-10033,E-10033-01,2025-04-14T18:08:47.918766,36.4,78,125,70,97.8,20,30.9,352,36.5,,,0.31,1.2,4,,26,20,316,6.0,,22.4,1
+P-10033,E-10033-01,2025-04-14T18:18:47.502397,37.0,77,121,73,99.4,18,21.0,359,44.8,495,250,,0.9,,7,,,344,6.1,66,22.4,
+P-10033,E-10033-01,2025-04-14T20:54:39.162718,36.4,66,119,72,99.3,16,21.0,459,,,,,,,,,,441,7.8,76,22.4,
+P-10033,E-10033-01,2025-04-14T21:03:04.008090,36.9,84,121,82,97.2,14,21.0,370,,,,,1.5,,6,,,365,6.3,23,22.4,1
+P-10033,E-10033-01,2025-04-15T03:51:59.051063,36.5,78,133,87,95.0,17,21.0,412,41.2,208,137,,,,,30,23,401,7.0,,22.4,
+P-10033,E-10033-01,2025-04-15T03:08:02.420560,37.0,70,113,83,98.3,14,37.9,355,43.4,,,0.38,,10,5,,,346,6.1,65,22.4,
+P-10033,E-10033-01,2025-04-15T05:43:59.694939,37.1,80,127,83,98.6,17,21.0,427,,,,,1.4,,8,,,386,6.8,,22.4,1
+P-10033,E-10033-01,2025-04-15T08:08:09.412859,36.6,70,115,80,96.5,18,21.0,367,,,,,,,,35,31,332,6.3,,22.4,
+P-10033,E-10033-01,2025-04-15T07:35:40.985274,37.0,80,135,75,97.0,18,21.0,477,41.4,,,,,,,,,441,7.6,40,22.4,
+P-10033,E-10033-01,2025-04-15T00:33:22.716346,36.3,73,122,76,96.2,14,21.0,433,35.7,,,,1.2,,8,,,431,6.9,,22.4,
+P-10033,E-10033-01,2025-04-15T02:34:57.418132,36.8,71,119,74,96.4,14,21.0,473,,,,,,,,,,458,7.5,,22.4,1
+P-10033,E-10033-02,2025-04-16T16:25:23.481768,36.4,77,124,74,99.3,19,21.0,529,40.7,,,,1.1,,7,,,498,9.0,,22.4,1
+P-10033,E-10033-02,2025-04-16T18:01:25.177504,36.8,66,114,72,96.7,19,21.0,510,,,,,1.0,,,,,467,8.1,53,22.4,1
+P-10033,E-10033-02,2025-04-16T17:47:13.094821,36.8,68,118,82,98.6,12,21.0,443,,481,241,,,,,34,,436,7.6,57,22.4,
+P-10033,E-10033-02,2025-04-16T19:23:14.959967,37.3,72,121,78,98.9,12,21.0,503,,,,,,,8,31,,499,8.0,,22.4,1
+P-10033,E-10033-02,2025-04-16T21:46:03.637096,36.1,66,125,77,96.2,17,21.0,409,41.1,377,115,,,,4,34,24,388,6.5,,22.4,
+P-10033,E-10033-02,2025-04-16T18:55:24.414348,36.6,101,121,84,96.0,15,21.0,410,,,,,,,,,,386,6.5,,22.4,
+P-10033,E-10033-02,2025-04-16T22:13:21.694327,36.9,66,111,71,97.9,18,21.0,403,38.6,,,,,,,,,380,6.9,,22.4,
+P-10033,E-10033-02,2025-04-16T20:34:47.078408,36.9,55,116,82,96.1,17,21.0,471,38.3,470,392,,1.0,,,,,465,8.0,,22.4,
+P-10033,E-10033-02,2025-04-16T22:24:30.129938,37.0,70,113,77,99.5,20,35.9,483,,,,0.36,1.3,5,,,,461,8.2,,22.4,
+P-10033,E-10033-03,2025-04-09T16:25:23.481768,36.0,84,114,76,98.5,17,21.0,489,41.5,,,,1.3,,8,,,488,8.3,,22.4,
+P-10033,E-10033-03,2025-04-09T17:54:04.215748,36.0,78,129,84,99.2,20,21.0,450,41.3,,,,,,,30,,409,7.1,,22.4,1
+P-10033,E-10033-03,2025-04-09T19:13:28.120434,37.1,71,119,76,97.4,17,21.0,540,40.8,,,,0.9,,,30,21,501,9.2,72,22.4,
+P-10033,E-10033-03,2025-04-09T20:11:58.925145,36.1,69,114,73,96.5,14,21.0,548,41.4,,,,,,,,,537,8.7,,22.4,
+P-10033,E-10033-03,2025-04-09T21:01:16.087436,36.1,68,124,73,99.0,18,59.8,377,35.5,,,0.6,0.9,2,5,,,348,6.4,,22.4,
+P-10033,E-10033-03,2025-04-09T20:21:25.839454,37.1,54,124,80,97.3,18,21.0,489,,,,,,,6,,,487,7.7,,22.4,1
+P-10033,E-10033-03,2025-04-10T01:21:19.087305,36.2,43,124,71,99.4,13,21.0,364,43.0,308,200,,1.0,,,30,,343,6.2,64,22.4,
+P-10033,E-10033-03,2025-04-09T22:59:07.322269,36.6,76,125,85,98.9,18,43.3,358,,,,0.43,1.3,9,4,,,347,5.7,,22.4,
+P-10033,E-10033-03,2025-04-10T05:56:48.840840,36.7,82,125,82,98.9,13,21.0,389,,419,,,1.1,,5,28,26,361,6.2,43,22.4,
+P-10033,E-10033-03,2025-04-09T21:18:06.642534,37.1,74,116,71,96.3,17,21.0,490,,492,,,,,,30,27,490,7.8,,22.4,
+P-10033,E-10033-03,2025-04-10T06:03:18.058570,36.4,82,123,77,99.4,18,21.0,412,36.6,,,,,,6,,,381,6.5,,22.4,
+P-10033,E-10033-03,2025-04-10T01:57:22.048782,36.8,81,115,78,97.8,13,21.0,549,,,,,1.4,,,26,,507,9.4,,22.4,1
+P-10033,E-10033-03,2025-04-10T11:02:21.442055,36.4,66,121,74,93.8,17,46.6,471,,,,0.47,,8,,28,22,424,8.0,,22.4,
+P-10033,E-10033-03,2025-04-10T08:57:10.762147,36.8,74,123,83,97.7,20,21.0,354,,121,,,1.0,,6,28,24,337,6.0,76,22.4,1
+P-10034,E-10034-01,2025-04-15T16:25:23.481768,36.4,85,128,83,94.3,17,21.0,443,,,,,1.4,,,,,416,6.0,,16.4,
+P-10034,E-10034-01,2025-04-15T17:55:58.602984,36.3,83,144,101,97.7,18,21.0,386,,286,251,,,,,,,352,5.2,,16.4,
+P-10034,E-10034-01,2025-04-15T17:57:43.631387,36.2,44,151,88,97.4,17,36.3,527,36.1,465,334,0.36,1.0,6,,28,28,516,7.6,36,16.4,1
+P-10034,E-10034-01,2025-04-15T20:09:07.271889,36.6,67,135,92,97.6,12,21.0,430,41.0,,,,0.9,,,29,,424,6.2,,16.4,
+P-10034,E-10034-01,2025-04-15T20:23:51.009294,36.1,84,127,90,96.4,13,21.0,436,,,,,1.2,,,,,406,5.9,,16.4,1
+P-10034,E-10034-01,2025-04-15T23:31:28.974600,36.7,73,131,81,97.6,14,21.0,460,40.2,209,133,,0.8,,,31,,446,6.6,,16.4,
+P-10034,E-10034-01,2025-04-16T03:36:19.748476,36.8,65,143,82,99.2,12,45.6,371,41.7,,,0.46,1.5,3,,25,,351,5.3,,16.4,1
+P-10034,E-10034-01,2025-04-16T01:33:27.732222,36.6,80,140,81,96.1,12,21.0,547,,,,,1.2,,7,,,498,7.8,43,16.4,
+P-10034,E-10034-01,2025-04-16T07:25:55.481046,37.9,77,128,93,96.4,19,21.0,465,,497,201,,1.4,,,,,448,6.3,,16.4,
+P-10034,E-10034-01,2025-04-15T22:51:59.899829,36.6,67,138,96,98.4,15,21.0,397,,303,96,,1.3,,5,29,,382,5.4,,16.4,1
+P-10034,E-10034-01,2025-04-16T02:22:41.837519,36.4,73,158,94,99.1,13,35.1,485,37.2,327,,0.35,,9,,35,33,484,6.5,77,16.4,
+P-10034,E-10034-01,2025-04-16T13:43:34.154864,36.3,75,135,81,97.8,12,21.0,484,,231,152,,1.0,,,,,452,6.9,67,16.4,
+P-10034,E-10034-01,2025-04-16T05:21:22.008803,37.3,84,144,89,97.8,20,21.0,418,,401,268,,1.4,,4,,,378,6.0,45,16.4,
+P-10035,E-10035-01,2025-04-16T16:25:23.481768,36.7,78,121,79,96.8,13,21.0,422,35.6,,,,,,,,,400,9.7,65,38.2,
+P-10035,E-10035-01,2025-04-16T17:05:17.766024,36.5,79,113,84,96.4,14,21.0,516,,252,210,,1.1,,8,35,20,474,10.8,,38.2,1
+P-10035,E-10035-01,2025-04-16T19:21:03.849245,36.0,67,122,70,95.2,13,21.0,358,,,,,1.3,,6,,,358,8.3,,38.2,1
+P-10035,E-10035-01,2025-04-16T18:54:37.322999,37.2,85,122,80,98.8,14,21.0,441,,241,,,1.3,,6,,,433,9.2,,38.2,1
+P-10035,E-10035-01,2025-04-16T20:31:25.161625,36.6,84,128,90,98.4,20,21.0,449,,,,,,,,,,406,10.4,,38.2,
+P-10035,E-10035-01,2025-04-16T21:17:11.732175,36.6,75,111,70,97.3,15,21.0,494,36.7,,,,1.4,,,,,453,11.4,,38.2,
+P-10035,E-10035-01,2025-04-16T22:59:06.618883,36.3,83,118,73,97.8,13,21.0,496,,,,,,,,33,28,452,10.4,,38.2,
+P-10035,E-10035-01,2025-04-17T03:48:29.085989,36.8,52,120,85,96.2,16,21.0,505,39.6,,,,1.4,,5,,,492,10.6,,38.2,
+P-10035,E-10035-01,2025-04-17T01:52:03.332018,36.0,85,118,81,99.1,12,21.0,426,,410,153,,,,,,,384,8.9,,38.2,
+P-10035,E-10035-01,2025-04-16T23:33:49.248967,36.3,85,111,82,94.7,13,21.0,546,,,,,1.3,,,33,,508,11.4,57,38.2,1
+P-10035,E-10035-01,2025-04-16T22:03:12.713234,36.1,78,113,78,96.4,15,21.0,350,,,,,1.3,,,,,343,8.1,61,38.2,
+P-10035,E-10035-01,2025-04-17T02:10:05.413414,37.1,71,112,81,96.3,20,21.0,523,,,,,1.5,,,,,522,10.9,39,38.2,
+P-10035,E-10035-01,2025-04-17T00:45:45.028129,37.0,65,124,75,98.4,17,21.0,530,,,,,0.9,,,35,34,529,11.1,39,38.2,
+P-10035,E-10035-01,2025-04-17T07:58:13.347731,36.2,106,115,76,96.3,19,21.0,424,41.5,,,,1.3,,,34,,385,9.8,,38.2,
+P-10035,E-10035-01,2025-04-17T12:16:50.918559,37.5,73,124,79,96.2,18,21.0,485,40.8,278,202,,,,,,,470,10.1,63,38.2,
+P-10036,E-10036-01,2025-04-16T16:25:23.481768,36.4,76,149,91,97.7,18,21.0,430,,324,141,,0.9,,5,,,389,7.1,,19.0,
+P-10036,E-10036-01,2025-04-16T17:56:00.282865,37.5,101,128,93,99.1,19,41.4,359,43.7,,,0.41,0.9,10,5,,,332,5.9,,19.0,
+P-10036,E-10036-01,2025-04-16T19:06:55.195091,37.9,85,133,89,99.5,14,21.0,448,,226,196,,1.4,,,,,424,7.4,,19.0,
+P-10036,E-10036-01,2025-04-16T19:48:57.211154,37.5,90,141,77,98.5,20,21.0,480,42.6,,,,1.3,,5,,,432,8.6,,19.0,1
+P-10036,E-10036-01,2025-04-16T23:03:17.872104,36.8,77,142,81,99.2,16,21.0,372,44.5,488,392,,0.9,,,,,372,6.6,,19.0,
+P-10036,E-10036-01,2025-04-16T19:45:17.944760,37.1,72,142,84,96.4,19,21.0,447,,,,,1.4,,7,30,,435,8.0,50,19.0,1
+P-10036,E-10036-01,2025-04-17T02:26:07.590907,37.5,78,141,76,96.7,13,21.0,516,44.7,,,,,,,,,498,8.5,,19.0,
+P-10036,E-10036-02,2025-04-15T16:25:23.481768,37.3,125,135,95,93.3,18,21.0,439,38.3,236,221,,0.9,,5,29,23,399,7.8,,19.0,
+P-10036,E-10036-02,2025-04-15T18:02:19.309420,37.2,78,135,88,99.1,19,36.0,451,40.5,,,0.36,1.0,4,5,,,415,8.0,,19.0,
+P-10036,E-10036-02,2025-04-15T17:26:05.004752,37.1,73,143,84,93.5,18,21.0,359,43.5,,,,,,,32,27,348,5.9,55,19.0,
+P-10036,E-10036-02,2025-04-15T19:31:09.150284,36.7,90,141,90,97.2,14,21.0,474,,,,,1.4,,6,25,24,427,7.8,,19.0,1
+P-10036,E-10036-02,2025-04-15T21:45:09.320863,37.6,82,148,93,97.9,12,21.0,456,37.4,254,129,,,,4,,,410,8.1,,19.0,
+P-10036,E-10036-02,2025-04-15T22:30:08.756234,37.4,91,150,103,98.8,20,21.0,548,,,,,,,,31,31,510,9.8,37,19.0,
+P-10036,E-10036-02,2025-04-15T21:54:03.518848,37.1,100,151,86,99.5,13,40.3,355,,,,0.4,1.0,6,,,,334,5.9,,19.0,1
+P-10036,E-10036-02,2025-04-16T04:03:00.987153,37.3,91,141,98,96.5,15,21.0,399,38.5,,,,1.4,,,,,390,7.1,,19.0,
+P-10036,E-10036-02,2025-04-16T05:08:09.061999,37.0,90,129,86,97.4,14,21.0,400,40.2,,,,,,,,,368,6.6,79,19.0,1
+P-10037,E-10037-01,2025-04-16T16:25:23.481768,36.5,83,119,76,94.8,20,32.8,372,41.9,,,0.33,1.4,9,,31,26,334,5.5,,28.5,
+P-10037,E-10037-01,2025-04-16T17:40:21.525176,37.1,80,122,78,97.5,14,21.0,367,42.3,460,233,,1.1,,,,,336,5.4,,28.5,
+P-10037,E-10037-01,2025-04-16T19:45:16.224511,36.7,79,121,90,95.8,15,21.0,358,37.9,,,,,,,,,341,5.7,29,28.5,1
+P-10037,E-10037-01,2025-04-16T19:20:01.764554,36.4,67,119,74,96.3,17,21.0,487,,,,,,,7,,,441,7.7,27,28.5,1
+P-10037,E-10037-01,2025-04-16T21:07:06.007942,36.2,64,139,86,97.2,20,21.0,492,39.9,,,,1.2,,7,,,489,7.3,26,28.5,
+P-10037,E-10037-01,2025-04-17T00:25:28.076341,37.2,79,118,79,97.6,17,21.0,525,,233,198,,1.2,,,26,,513,7.8,,28.5,
+P-10037,E-10037-01,2025-04-17T03:09:15.252777,36.4,74,113,73,97.1,19,21.0,520,,,,,1.2,,,28,,516,7.7,,28.5,
+P-10037,E-10037-01,2025-04-17T01:05:30.677617,36.9,71,115,80,97.0,14,21.0,434,36.3,,,,1.1,,,,,404,6.4,,28.5,
+P-10037,E-10037-01,2025-04-16T23:18:38.906734,36.1,83,121,81,98.9,12,21.0,472,,,,,1.3,,,,,424,7.0,,28.5,
+P-10037,E-10037-01,2025-04-17T06:36:37.699521,36.2,81,113,76,97.7,23,21.0,508,,225,174,,,,,,,464,7.5,,28.5,
+P-10038,E-10038-01,2025-04-13T16:25:23.481768,36.4,93,140,86,96.2,16,43.4,356,,,,0.43,,8,5,,,328,4.8,,18.8,1
+P-10038,E-10038-01,2025-04-13T18:01:09.560487,36.5,81,144,88,96.7,17,21.0,408,,,,,,,7,,,376,5.9,,18.8,
+P-10038,E-10038-01,2025-04-13T18:48:11.831339,36.2,73,153,88,97.6,13,21.0,443,36.0,,,,1.2,,,,,427,6.0,,18.8,
+P-10038,E-10038-01,2025-04-13T18:56:00.281494,36.3,73,140,87,96.8,14,40.5,428,40.9,,,0.41,1.2,8,8,35,35,400,5.8,,18.8,1
+P-10038,E-10038-01,2025-04-13T21:11:18.218232,36.5,80,126,98,98.1,15,29.3,548,35.7,,,0.29,1.5,3,,,,542,7.9,,18.8,
+P-10038,E-10038-01,2025-04-13T20:14:28.399401,36.7,71,129,86,94.5,15,21.0,497,,,,,1.2,,,,,478,6.7,,18.8,
+P-10038,E-10038-01,2025-04-13T20:33:29.899972,37.2,65,144,86,93.8,12,21.0,541,37.6,,,,,,,34,29,488,7.8,21,18.8,
+P-10038,E-10038-01,2025-04-14T02:47:14.745110,36.6,81,141,82,98.9,14,21.0,408,43.0,,,,0.9,,,32,,369,5.5,,18.8,1
+P-10038,E-10038-01,2025-04-14T04:11:47.980620,37.7,85,148,90,96.3,15,21.0,501,,,,,1.3,,,,,473,6.8,,18.8,
+P-10038,E-10038-02,2025-04-08T16:25:23.481768,37.2,81,142,89,97.4,16,47.0,450,,182,84,0.47,,5,,28,28,435,6.1,,18.8,
+P-10038,E-10038-02,2025-04-08T17:35:04.561584,36.8,69,129,96,97.8,19,21.0,440,,,,,0.9,,,27,,405,5.9,,18.8,1
+P-10038,E-10038-02,2025-04-08T18:37:39.270299,36.3,79,141,96,97.6,19,21.0,459,,492,321,,,,5,,,424,6.6,,18.8,
+P-10038,E-10038-02,2025-04-08T18:00:25.992422,37.2,65,133,89,99.4,12,21.0,494,,,,,1.0,,4,,,469,6.7,37,18.8,
+P-10038,E-10038-02,2025-04-08T20:13:03.764546,36.0,65,140,85,96.4,20,38.5,539,41.4,362,117,0.39,,5,7,32,20,501,7.7,,18.8,
+P-10038,E-10038-02,2025-04-09T00:01:05.070518,36.9,71,144,101,96.2,12,21.0,424,39.3,466,456,,1.4,,,,,419,5.7,,18.8,
+P-10038,E-10038-02,2025-04-09T01:01:39.329628,37.1,76,139,87,96.3,17,21.0,390,,,,,1.1,,,,,386,5.3,43,18.8,
+P-10038,E-10038-02,2025-04-08T20:24:47.730157,36.2,70,146,87,98.8,19,41.2,473,36.5,,,0.41,,8,7,,,463,6.4,,18.8,
+P-10038,E-10038-03,2025-04-09T16:25:23.481768,36.1,85,142,85,97.0,13,21.0,361,44.3,,,,1.2,,,,,358,5.2,,18.8,
+P-10038,E-10038-03,2025-04-09T17:55:42.407223,36.4,73,133,90,91.6,14,21.0,445,,,,,0.8,,,,,437,6.4,,18.8,
+P-10038,E-10038-03,2025-04-09T18:29:43.266360,36.9,79,138,92,96.8,13,21.0,450,35.3,,,,1.2,,5,33,29,407,6.5,,18.8,1
+P-10038,E-10038-03,2025-04-09T18:35:09.099423,36.0,70,146,97,98.8,18,21.0,393,42.6,189,131,,1.2,,6,,,359,5.6,,18.8,
+P-10038,E-10038-03,2025-04-10T00:04:55.774668,36.9,69,133,95,96.9,20,21.0,391,,,,,1.2,,,,,387,5.3,,18.8,1
+P-10038,E-10038-03,2025-04-09T20:27:45.304951,37.0,82,140,78,96.1,16,21.0,501,43.9,,,,,,,30,22,487,6.8,,18.8,
+P-10038,E-10038-03,2025-04-09T23:26:26.345458,36.2,83,149,92,96.3,20,21.0,435,43.0,,,,1.2,,,,,411,5.9,,18.8,
+P-10038,E-10038-03,2025-04-10T01:50:39.394715,36.0,74,123,92,99.1,14,43.7,417,,437,181,0.44,1.0,5,,,,380,5.6,,18.8,
+P-10038,E-10038-03,2025-04-10T06:11:30.184293,36.6,66,161,93,96.3,18,21.0,359,41.1,,,,1.2,,,,,346,4.8,80,18.8,1
+P-10039,E-10039-01,2025-04-15T16:25:23.481768,36.8,98,135,87,96.6,15,21.0,351,,,,,1.1,,,,,345,7.4,,38.6,1
+P-10039,E-10039-01,2025-04-15T18:11:27.223931,36.9,97,132,91,98.0,15,45.5,398,,,,0.46,1.0,7,,,,371,7.7,,38.6,
+P-10039,E-10039-01,2025-04-15T18:14:52.782928,37.5,61,139,85,99.3,16,21.0,379,44.3,,,,,,,,,343,7.3,,38.6,1
+P-10039,E-10039-01,2025-04-15T21:00:10.395087,37.2,99,161,91,96.0,18,21.0,414,,,,,,,,,,387,8.7,,38.6,
+P-10039,E-10039-01,2025-04-15T19:32:22.963476,38.0,83,136,90,97.0,20,35.9,493,37.6,288,180,0.36,,2,5,,,490,10.4,44,38.6,
+P-10039,E-10039-01,2025-04-16T01:48:04.076503,36.8,78,138,90,97.0,19,21.0,509,,438,412,,0.8,,,34,22,460,9.8,,38.6,
+P-10039,E-10039-01,2025-04-15T23:50:50.092506,37.2,103,141,89,97.2,15,21.0,363,40.7,,,,,,6,,,358,7.0,,38.6,
+P-10039,E-10039-01,2025-04-16T04:13:09.456109,37.0,83,133,89,96.5,18,21.0,360,38.4,371,334,,1.1,,,29,25,333,7.6,,38.6,
+P-10039,E-10039-01,2025-04-16T05:12:44.890208,37.0,88,155,102,97.2,16,21.0,548,,,,,1.5,,,,,512,11.6,,38.6,
+P-10039,E-10039-01,2025-04-16T01:03:33.156025,37.6,50,135,97,92.2,15,21.0,524,,,,,1.0,,7,28,26,471,10.1,71,38.6,
+P-10039,E-10039-01,2025-04-16T11:14:12.182031,36.8,85,135,92,96.1,16,51.0,476,,164,113,0.51,,9,7,,,466,9.2,23,38.6,
+P-10039,E-10039-02,2025-04-16T16:25:23.481768,36.7,83,128,91,97.6,14,21.0,521,35.3,246,143,,,,,,,505,10.0,,38.6,
+P-10039,E-10039-02,2025-04-16T17:15:08.195412,37.3,100,133,90,98.3,20,21.0,367,,,,,1.2,,,,,360,7.7,,38.6,
+P-10039,E-10039-02,2025-04-16T20:13:08.588591,37.3,79,136,94,93.7,15,32.7,468,,,,0.33,1.2,8,,,,449,9.9,,38.6,
+P-10039,E-10039-02,2025-04-16T21:09:15.535079,36.9,84,135,94,97.5,12,46.7,398,37.7,244,238,0.47,0.9,9,,,,377,8.4,,38.6,
+P-10039,E-10039-02,2025-04-16T20:00:00.988566,36.9,125,121,92,99.2,19,21.0,363,,112,,,1.1,,6,,,330,7.7,,38.6,1
+P-10039,E-10039-02,2025-04-16T23:10:30.627968,37.0,100,166,105,93.1,21,55.3,540,40.8,,,0.55,1.3,10,,,,493,10.4,,38.6,
+P-10039,E-10039-02,2025-04-16T22:34:43.013126,37.4,94,123,87,96.7,20,21.0,471,,,,,1.4,,,30,26,426,9.1,,38.6,
+P-10039,E-10039-02,2025-04-16T20:22:49.969457,36.9,90,132,93,98.5,15,21.0,456,,,,,,,7,,,420,9.6,,38.6,
+P-10039,E-10039-02,2025-04-16T21:51:40.944506,37.6,92,125,82,97.3,13,21.0,515,40.8,252,,,1.5,,4,35,,510,10.9,,38.6,
+P-10039,E-10039-02,2025-04-17T01:15:09.580015,37.9,90,150,98,96.1,20,21.0,362,,,,,1.4,,7,,,353,7.0,,38.6,
+P-10039,E-10039-02,2025-04-17T06:26:54.740560,37.9,105,146,79,94.3,13,58.7,397,,120,105,0.59,1.5,9,,,,389,7.6,,38.6,
+P-10039,E-10039-02,2025-04-17T13:06:10.061429,37.7,54,125,95,99.0,15,44.3,472,,,,0.44,,10,,29,26,469,10.0,,38.6,
+P-10039,E-10039-02,2025-04-17T07:50:41.570386,37.6,90,152,102,97.4,16,52.5,430,42.0,,,0.53,,6,,27,20,408,8.3,73,38.6,
+P-10039,E-10039-02,2025-04-17T02:26:35.707676,37.2,92,142,91,99.0,17,21.0,451,44.3,,,,,,,27,,415,8.7,,38.6,
+P-10040,E-10040-01,2025-04-16T16:25:23.481768,37.0,96,153,86,96.6,19,21.0,381,,136,88,,0.8,,4,,,348,5.5,,16.3,
+P-10040,E-10040-01,2025-04-16T17:49:49.447727,36.3,53,123,91,99.2,20,21.0,473,42.0,410,342,,1.5,,8,30,26,457,6.4,,16.3,1
+P-10040,E-10040-01,2025-04-16T19:57:45.918506,37.6,92,153,86,97.5,19,30.0,386,,226,,0.3,1.0,4,,,,353,5.6,,16.3,1
+P-10040,E-10040-01,2025-04-16T18:07:46.035444,36.0,92,143,95,97.0,17,21.0,390,39.0,272,,,,,,,,378,5.3,,16.3,
+P-10040,E-10040-01,2025-04-16T22:04:15.671051,37.0,85,147,92,97.9,14,21.0,357,,,,,0.8,,7,29,23,327,4.8,43,16.3,
+P-10040,E-10040-01,2025-04-16T20:49:32.444393,36.2,84,127,87,96.5,17,21.0,374,,,,,,,,28,22,370,5.1,39,16.3,
+P-10040,E-10040-01,2025-04-16T21:05:44.345262,36.4,93,140,86,96.7,16,21.0,379,,,,,1.5,,,,,345,5.1,,16.3,1
+P-10040,E-10040-01,2025-04-16T23:44:56.593556,36.5,80,154,105,98.2,17,21.0,505,,487,221,,1.3,,,,,498,6.8,,16.3,
+P-10040,E-10040-01,2025-04-17T07:48:36.175406,36.7,99,134,85,97.8,18,21.0,403,,457,,,,,8,,,396,5.8,,16.3,
+P-10040,E-10040-01,2025-04-17T00:18:38.238111,36.3,81,144,83,97.2,20,55.4,379,39.2,225,205,0.55,0.9,7,6,32,30,369,5.1,,16.3,
+P-10040,E-10040-01,2025-04-17T09:51:06.278965,36.9,80,138,79,98.6,13,21.0,527,,113,,,1.2,,4,25,25,520,7.1,,16.3,
+P-10040,E-10040-01,2025-04-17T06:38:46.546175,36.8,99,155,92,96.0,20,21.0,426,37.2,,,,,,5,,,400,5.8,36,16.3,
+P-10040,E-10040-01,2025-04-17T14:38:29.811069,36.3,98,128,88,96.2,13,21.0,536,,,,,,,,31,,501,7.7,,16.3,
+P-10041,E-10041-01,2025-04-14T16:25:23.481768,36.5,82,137,89,96.9,16,47.4,529,39.3,,,0.47,,2,,,,507,11.2,,22.4,
+P-10041,E-10041-01,2025-04-14T17:00:34.016855,36.4,74,141,83,96.7,14,21.0,370,42.9,,,,1.2,,5,,,358,7.8,,22.4,
+P-10041,E-10041-01,2025-04-14T18:37:04.454838,36.3,74,122,88,98.3,16,21.0,429,41.2,,,,1.3,,,,,415,9.1,,22.4,
+P-10041,E-10041-01,2025-04-14T18:52:24.123599,36.1,84,132,87,94.1,12,21.0,539,37.9,,,,,,,,,535,10.4,,22.4,
+P-10041,E-10041-01,2025-04-14T21:44:45.812362,36.1,84,140,91,96.5,19,21.0,420,40.7,,,,1.0,,,,,419,8.1,,22.4,
+P-10041,E-10041-01,2025-04-14T22:37:55.817985,37.7,88,133,99,97.1,14,59.7,466,,,,0.6,1.0,5,,31,,439,9.0,,22.4,1
+P-10041,E-10041-01,2025-04-15T02:02:45.648159,36.9,86,149,88,98.9,14,21.0,487,44.0,,,,0.9,,,,,453,10.3,,22.4,
+P-10041,E-10041-01,2025-04-14T23:09:24.923579,36.4,111,137,87,96.0,14,21.0,358,37.4,369,105,,1.0,,,,,351,6.9,,22.4,1
+P-10041,E-10041-01,2025-04-14T20:39:47.463825,37.0,81,140,82,97.7,14,21.0,497,38.3,401,241,,1.0,,,29,23,490,10.5,,22.4,
+P-10041,E-10041-01,2025-04-15T07:53:24.101580,36.4,93,128,75,96.8,15,21.0,380,36.9,,,,1.4,,,27,,364,7.3,31,22.4,
+P-10041,E-10041-02,2025-04-16T16:25:23.481768,36.2,95,134,87,98.8,18,21.0,504,43.9,491,,,,,4,26,22,456,10.7,47,22.4,
+P-10041,E-10041-02,2025-04-16T17:31:19.128798,36.6,81,135,76,97.4,17,21.0,511,,,,,1.1,,8,,,499,9.9,49,22.4,
+P-10041,E-10041-02,2025-04-16T17:41:20.367309,37.1,87,124,90,98.4,16,21.0,396,,433,89,,1.0,,,,,390,8.4,,22.4,1
+P-10041,E-10041-02,2025-04-16T18:20:28.298047,36.6,75,149,86,96.4,20,21.0,388,40.4,,,,1.0,,6,,,384,8.2,,22.4,
+P-10041,E-10041-02,2025-04-16T18:26:32.537287,37.0,81,160,95,98.1,15,21.0,358,35.7,256,225,,1.4,,,,,331,7.6,,22.4,1
+P-10041,E-10041-03,2025-04-17T16:25:23.481768,36.8,101,131,84,97.9,14,21.0,520,,401,346,,,,,,,497,11.0,65,22.4,1
+P-10041,E-10041-03,2025-04-17T17:04:02.252989,37.0,75,143,89,98.0,14,59.2,474,,,,0.59,1.2,7,,,,439,9.2,,22.4,
+P-10041,E-10041-03,2025-04-17T17:38:25.191325,37.1,87,162,100,97.9,16,21.0,421,43.5,,,,1.0,,5,26,20,421,8.1,,22.4,
+P-10041,E-10041-03,2025-04-17T19:12:05.145386,37.0,122,140,86,97.5,20,21.0,529,,,,,1.3,,4,,,478,10.2,,22.4,
+P-10041,E-10041-03,2025-04-17T22:58:44.621305,36.1,88,136,84,96.8,13,21.0,468,,,,,0.9,,,,,429,9.0,,22.4,
+P-10041,E-10041-03,2025-04-18T00:39:04.240093,36.7,82,144,99,99.2,18,21.0,372,43.8,155,142,,1.4,,,,,351,7.9,,22.4,
+P-10041,E-10041-03,2025-04-18T03:12:36.498606,36.3,87,141,84,99.1,19,21.0,478,,225,154,,1.2,,,26,,472,9.2,,22.4,1
+P-10041,E-10041-03,2025-04-17T21:31:20.243997,36.2,98,136,86,98.2,17,21.0,523,,,,,1.2,,6,34,,472,10.1,58,22.4,
+P-10041,E-10041-03,2025-04-17T20:51:54.043960,36.8,99,139,84,98.3,20,21.0,379,39.4,228,,,,,,,,343,8.0,,22.4,
+P-10041,E-10041-03,2025-04-18T07:05:19.536268,36.8,104,151,96,98.1,17,21.0,474,,372,226,,,,8,,,474,10.0,,22.4,
+P-10041,E-10041-03,2025-04-17T22:57:27.072795,36.5,99,128,84,99.3,12,21.0,466,,344,135,,,,4,31,,464,9.0,,22.4,
+P-10041,E-10041-03,2025-04-18T07:11:11.299972,36.7,61,160,93,96.9,20,54.7,367,,,,0.55,1.4,4,,,,365,7.8,,22.4,
+P-10041,E-10041-03,2025-04-18T02:28:44.227709,36.6,99,155,103,93.3,16,21.0,419,38.8,,,,1.4,,,,,402,8.1,,22.4,1
+P-10042,E-10042-01,2025-04-14T16:25:23.481768,37.3,65,126,86,96.4,12,38.1,493,,,,0.38,,10,8,,,490,8.0,,20.2,
+P-10042,E-10042-01,2025-04-14T17:19:57.577403,37.5,88,163,98,97.1,19,42.0,371,,,,0.42,1.2,9,,,,355,6.5,,20.2,
+P-10042,E-10042-01,2025-04-14T17:37:54.814811,37.2,90,130,80,96.1,15,21.0,414,,,,,1.3,,7,29,21,373,7.2,72,20.2,
+P-10042,E-10042-01,2025-04-14T18:00:13.557688,37.1,95,132,91,98.9,13,21.0,502,43.0,315,,,1.2,,,25,23,475,8.8,,20.2,
+P-10042,E-10042-01,2025-04-15T00:20:08.227311,37.4,87,157,93,99.5,19,53.8,373,42.1,,,0.54,0.9,5,,,,339,6.0,77,20.2,
+P-10042,E-10042-01,2025-04-14T21:27:20.681401,37.5,93,139,82,97.2,16,21.0,410,39.6,133,96,,1.2,,6,,,392,6.6,,20.2,1
+P-10042,E-10042-01,2025-04-14T22:05:38.606827,37.0,90,147,85,97.2,16,21.0,420,,,,,1.2,,,25,,405,6.8,,20.2,
+P-10042,E-10042-01,2025-04-15T05:04:23.729597,37.7,76,138,92,93.0,15,34.6,397,,,,0.35,,2,,25,24,383,6.9,67,20.2,
+P-10042,E-10042-01,2025-04-15T02:33:17.836518,36.6,99,134,88,99.5,14,46.1,462,,,,0.46,1.3,9,,31,,449,7.5,,20.2,1
+P-10042,E-10042-01,2025-04-15T08:01:24.815367,36.5,94,144,88,97.7,15,21.0,374,44.9,,,,1.2,,7,35,35,371,6.5,,20.2,
+P-10042,E-10042-01,2025-04-14T23:39:25.123760,37.1,81,148,84,96.2,16,21.0,398,44.2,,,,,,,,,387,6.4,,20.2,
+P-10042,E-10042-01,2025-04-15T12:48:55.711282,37.0,85,160,93,97.0,16,21.0,518,,,,,1.2,,8,,,507,9.0,,20.2,
+P-10042,E-10042-01,2025-04-15T00:28:38.456396,37.2,80,158,96,96.8,14,21.0,398,43.4,255,135,,,,6,32,32,387,6.9,,20.2,1
+P-10042,E-10042-01,2025-04-15T08:04:19.958992,37.2,88,134,84,97.7,17,42.9,421,44.0,,,0.43,0.9,6,5,,,407,6.8,,20.2,
+P-10042,E-10042-01,2025-04-15T10:28:32.139940,37.7,82,132,85,96.6,15,21.0,441,43.0,,,,,,5,,,421,7.1,,20.2,
+P-10042,E-10042-02,2025-04-12T16:25:23.481768,36.9,109,128,87,97.2,15,21.0,378,,,,,1.0,,,,,341,6.1,,20.2,
+P-10042,E-10042-02,2025-04-12T17:25:28.215456,37.2,89,139,88,98.7,18,21.0,459,38.6,,,,1.4,,,31,25,440,7.4,,20.2,
+P-10042,E-10042-02,2025-04-12T19:02:58.458473,37.5,104,147,85,96.1,20,21.0,404,40.8,,,,1.3,,,26,26,403,6.5,,20.2,1
+P-10042,E-10042-02,2025-04-12T21:20:45.054073,36.9,88,148,87,97.4,15,21.0,401,36.3,,,,,,,,,394,7.0,,20.2,1
+P-10042,E-10042-02,2025-04-12T23:32:31.621641,37.4,83,140,93,97.0,13,21.0,444,42.3,,,,,,6,,,402,7.8,,20.2,
+P-10043,E-10043-01,2025-04-16T16:25:23.481768,37.1,129,136,85,98.0,16,21.0,521,43.5,,,,0.9,,,,,492,8.6,,30.6,
+P-10043,E-10043-01,2025-04-16T17:01:05.255109,37.4,76,125,82,98.6,20,21.0,537,,,,,,,,29,22,483,8.9,,30.6,
+P-10043,E-10043-01,2025-04-16T20:11:08.669667,37.1,103,150,104,98.6,15,21.0,542,43.5,406,,,,,6,,,519,9.7,,30.6,
+P-10043,E-10043-01,2025-04-16T19:42:32.863689,37.2,76,143,98,97.4,16,55.9,420,44.1,467,172,0.56,0.9,6,,,,408,7.5,,30.6,1
+P-10043,E-10043-01,2025-04-16T21:22:54.136303,37.4,89,144,90,96.8,18,21.0,441,44.7,215,127,,,,,,,423,7.3,,30.6,
+P-10043,E-10043-01,2025-04-16T22:11:52.935010,37.5,96,135,92,98.9,18,21.0,376,,,,,1.4,,8,,,352,6.7,,30.6,
+P-10043,E-10043-02,2025-04-10T16:25:23.481768,37.3,97,139,81,99.2,16,21.0,504,,,,,0.9,,5,29,28,468,9.0,45,30.6,1
+P-10043,E-10043-02,2025-04-10T17:20:13.715322,38.0,86,123,78,97.0,16,21.0,378,,,,,1.5,,4,,,360,6.3,,30.6,
+P-10043,E-10043-02,2025-04-10T18:51:08.665843,37.7,89,137,78,95.3,16,21.0,531,,,,,1.0,,7,,,478,9.5,,30.6,
+P-10043,E-10043-02,2025-04-10T21:16:54.098939,37.1,74,129,88,98.3,18,21.0,441,41.5,,,,0.9,,7,,,413,7.3,,30.6,
+P-10043,E-10043-02,2025-04-10T23:08:14.901300,37.0,107,140,86,98.1,20,21.0,493,,431,199,,,,,,,464,8.8,,30.6,
+P-10043,E-10043-02,2025-04-10T23:21:37.568416,37.4,87,124,99,93.2,19,21.0,369,44.3,415,395,,0.9,,5,,,359,6.1,,30.6,1
+P-10043,E-10043-02,2025-04-10T20:30:50.026839,37.0,90,139,94,97.6,14,21.0,451,,,,,0.9,,,,,422,8.1,,30.6,
+P-10043,E-10043-02,2025-04-10T23:31:22.234382,36.6,61,143,89,98.3,17,21.0,375,42.8,279,251,,,,5,31,,341,6.7,59,30.6,
+P-10043,E-10043-02,2025-04-10T20:42:55.987808,37.7,82,148,83,96.7,15,21.0,454,,353,181,,1.4,,7,,,442,8.1,,30.6,
+P-10043,E-10043-02,2025-04-11T05:39:34.480794,37.8,83,141,77,99.5,20,21.0,388,,,,,0.9,,6,,,379,6.9,,30.6,
+P-10043,E-10043-02,2025-04-11T12:03:25.568235,37.6,89,156,95,96.5,14,21.0,441,,,,,1.3,,,,,432,7.9,,30.6,
+P-10044,E-10044-01,2025-04-16T16:25:23.481768,37.2,82,129,81,98.2,12,21.0,409,39.6,411,345,,1.3,,6,,,379,5.5,,17.1,
+P-10044,E-10044-01,2025-04-16T17:48:21.783520,37.2,92,145,81,96.3,17,36.1,427,,399,288,0.36,,6,,26,22,418,6.1,,17.1,
+P-10044,E-10044-01,2025-04-16T17:36:46.901612,36.3,83,134,92,98.1,17,21.0,359,,,,,1.5,,,,,336,4.8,,17.1,1
+P-10044,E-10044-01,2025-04-16T18:26:25.033578,36.8,86,140,95,98.7,15,21.0,440,,196,149,,0.9,,5,,,402,5.9,,17.1,
+P-10044,E-10044-01,2025-04-16T21:49:02.182509,36.7,75,132,94,99.2,18,21.0,363,37.6,,,,1.0,,,,,326,4.9,,17.1,
+P-10044,E-10044-01,2025-04-16T20:25:59.006819,36.7,103,137,88,96.7,18,21.0,494,,310,170,,,,,26,25,461,6.7,58,17.1,
+P-10044,E-10044-01,2025-04-17T01:35:47.154560,36.2,86,141,77,96.5,20,44.7,397,,,,0.45,1.3,7,6,,,391,5.7,,17.1,
+P-10044,E-10044-01,2025-04-16T21:15:59.350334,37.1,58,137,94,96.5,16,54.7,471,,106,89,0.55,,10,5,31,,447,6.8,,17.1,1
+P-10044,E-10044-01,2025-04-17T05:16:32.132307,37.2,88,123,82,98.7,21,21.0,549,,421,229,,,,6,35,20,494,7.4,60,17.1,
+P-10044,E-10044-01,2025-04-17T08:14:29.758039,37.1,89,143,92,97.0,18,21.0,544,37.5,,,,1.0,,,,,493,7.3,,17.1,
+P-10044,E-10044-01,2025-04-17T05:32:01.051900,37.1,81,128,83,96.2,20,21.0,548,39.2,,,,1.3,,,26,24,507,7.4,75,17.1,1
+P-10044,E-10044-01,2025-04-17T00:49:48.687048,36.1,85,135,90,97.7,14,21.0,493,35.5,,,,1.2,,,,,459,7.1,29,17.1,
+P-10044,E-10044-01,2025-04-17T07:03:06.487635,36.5,61,134,79,98.3,19,41.5,547,,,,0.41,,8,,25,,534,7.9,,17.1,
+P-10044,E-10044-01,2025-04-17T06:32:18.148085,36.4,76,135,91,97.4,18,21.0,481,36.8,,,,,,,30,23,452,6.9,,17.1,1
+P-10044,E-10044-02,2025-04-09T16:25:23.483771,37.0,84,129,87,97.6,14,21.0,469,,140,114,,,,,33,,438,6.7,,17.1,
+P-10044,E-10044-02,2025-04-09T17:00:26.161930,37.1,102,135,91,96.9,15,21.0,533,,258,107,,1.1,,,,,518,7.7,,17.1,
+P-10044,E-10044-02,2025-04-09T20:01:37.671033,36.0,87,142,92,99.1,20,21.0,428,42.8,400,136,,1.4,,,,,425,6.1,,17.1,
+P-10044,E-10044-02,2025-04-09T21:57:09.560882,36.2,63,133,87,96.1,15,21.0,374,42.2,,,,,,,,,342,5.0,,17.1,
+P-10044,E-10044-02,2025-04-09T22:23:21.222173,36.0,87,134,93,97.0,19,21.0,477,,,,,,,,,,464,6.4,,17.1,1
+P-10044,E-10044-02,2025-04-10T00:59:03.170947,36.8,80,144,93,97.6,19,21.0,443,,,,,,,4,,,411,6.4,61,17.1,
+P-10044,E-10044-02,2025-04-09T22:45:18.780860,36.1,84,134,90,96.3,15,21.0,360,39.6,285,,,0.8,,,,,343,4.9,,17.1,1
+P-10044,E-10044-02,2025-04-09T20:34:31.079107,36.2,85,130,81,97.7,17,28.2,512,39.1,,,0.28,,2,7,,,471,6.9,,17.1,
+P-10044,E-10044-02,2025-04-09T20:47:08.791424,37.0,93,129,89,97.2,18,49.4,404,36.1,,,0.49,,6,7,31,21,398,5.5,24,17.1,
+P-10044,E-10044-02,2025-04-10T09:29:16.880870,36.6,89,141,87,97.9,15,21.0,384,,,,,,,8,,,370,5.2,,17.1,
+P-10044,E-10044-02,2025-04-10T04:30:32.409359,36.7,96,125,94,96.6,14,21.0,417,39.3,,,,0.9,,,31,21,387,6.0,,17.1,
+P-10044,E-10044-02,2025-04-10T01:02:53.066789,36.9,96,134,97,96.2,20,29.9,353,,,,0.3,,6,4,32,28,341,5.1,79,17.1,1
+P-10045,E-10045-01,2025-04-17T16:25:23.483771,36.5,87,140,79,92.2,18,21.0,504,35.3,228,,,1.1,,6,34,31,486,7.3,,31.0,
+P-10045,E-10045-01,2025-04-17T17:09:14.589298,36.6,81,148,89,96.9,19,21.0,505,41.9,,,,,,,,,463,6.9,,31.0,1
+P-10045,E-10045-01,2025-04-17T18:47:30.152250,36.5,92,123,79,93.1,19,47.5,353,,,,0.47,1.0,10,7,31,30,349,4.8,,31.0,
+P-10045,E-10045-01,2025-04-17T20:20:38.745823,36.8,98,141,89,97.0,20,21.0,426,37.8,143,123,,,,6,32,26,405,6.2,52,31.0,
+P-10045,E-10045-01,2025-04-17T21:51:07.175787,37.1,76,136,80,98.0,21,21.0,394,,,,,,,,,,382,5.4,,31.0,
+P-10045,E-10045-01,2025-04-18T00:15:11.444395,36.1,84,133,96,98.5,13,21.0,530,37.8,266,100,,,,8,,,517,7.7,,31.0,
+P-10045,E-10045-01,2025-04-18T00:15:18.148714,37.1,98,130,96,98.0,14,21.0,512,,,,,1.0,,,,,469,7.4,,31.0,1
+P-10045,E-10045-01,2025-04-17T22:42:21.817462,37.2,89,136,86,96.5,19,21.0,419,38.8,189,147,,,,7,,,381,6.1,,31.0,1
+P-10045,E-10045-01,2025-04-18T06:13:50.196783,36.8,90,126,80,99.1,16,21.0,546,,150,139,,1.0,,,25,21,544,7.4,,31.0,1
+P-10045,E-10045-01,2025-04-18T07:19:08.719699,36.1,83,132,93,97.0,13,21.0,498,39.4,,,,1.2,,,,,461,7.2,,31.0,
+P-10045,E-10045-01,2025-04-17T21:52:44.335603,36.5,73,148,109,98.9,18,21.0,372,,,,,1.0,,,26,26,347,5.4,,31.0,
+P-10045,E-10045-01,2025-04-18T09:54:50.863663,36.3,92,122,90,98.0,13,21.0,518,,,,,1.1,,,,,496,7.5,,31.0,
+P-10045,E-10045-01,2025-04-18T07:16:42.428424,36.0,90,133,92,96.6,15,21.0,526,38.1,259,147,,1.0,,5,,,502,7.6,,31.0,
+P-10045,E-10045-01,2025-04-17T23:51:50.032223,36.1,74,128,90,98.8,12,21.0,384,37.9,413,152,,0.9,,,35,35,374,5.2,,31.0,
+P-10046,E-10046-01,2025-04-14T16:25:23.483771,36.4,65,137,90,92.7,14,21.0,436,,,,,0.9,,5,,,423,7.2,43,34.0,
+P-10046,E-10046-01,2025-04-14T18:22:02.789315,36.5,68,132,88,97.5,16,21.0,437,,206,113,,,,,26,26,420,7.2,,34.0,
+P-10046,E-10046-01,2025-04-14T20:01:37.034811,36.3,70,151,89,92.6,18,41.9,447,,352,232,0.42,1.5,3,6,,,422,8.0,,34.0,
+P-10046,E-10046-01,2025-04-14T18:32:00.900480,36.9,78,137,89,97.0,19,21.0,459,35.8,,,,0.9,,,,,436,7.6,25,34.0,
+P-10046,E-10046-01,2025-04-14T20:36:34.508984,37.1,76,156,98,98.1,20,21.0,518,37.9,150,122,,1.0,,,,,509,9.3,,34.0,1
+P-10046,E-10046-01,2025-04-14T22:37:28.229191,36.8,81,143,97,96.2,18,21.0,355,38.3,141,91,,1.4,,5,31,,341,6.3,39,34.0,
+P-10046,E-10046-01,2025-04-15T01:33:35.898512,36.5,77,138,94,96.0,18,34.8,395,,,,0.35,,5,8,31,,382,7.1,,34.0,
+P-10046,E-10046-01,2025-04-15T03:12:03.356925,36.7,80,129,90,96.1,14,47.9,390,,198,150,0.48,,10,,28,27,360,7.0,,34.0,
+P-10046,E-10046-01,2025-04-15T04:03:57.920837,36.3,74,136,96,97.6,17,21.0,427,,,,,1.4,,5,,,400,7.6,,34.0,
+P-10046,E-10046-02,2025-04-16T16:25:23.483771,36.5,71,137,93,97.5,19,21.0,376,43.1,346,221,,,,,,,357,6.7,,34.0,1
+P-10046,E-10046-02,2025-04-16T17:50:33.196219,36.9,73,151,96,98.4,20,34.3,511,,,,0.34,0.8,8,,33,24,484,8.5,,34.0,
+P-10046,E-10046-02,2025-04-16T19:25:20.880102,36.1,79,133,94,96.9,14,21.0,400,,231,,,,,,,,368,6.6,,34.0,
+P-10046,E-10046-02,2025-04-16T20:49:36.559055,37.7,71,130,99,98.7,16,21.0,406,44.5,,,,0.9,,4,,,370,7.3,,34.0,
+P-10046,E-10046-02,2025-04-16T21:42:36.567705,36.5,85,138,87,98.8,18,21.0,386,,,,,,,,25,22,371,6.4,,34.0,
+P-10046,E-10046-02,2025-04-16T21:26:24.393638,36.7,71,127,79,96.7,20,21.0,489,41.8,,,,1.2,,,,,444,8.1,,34.0,
+P-10046,E-10046-02,2025-04-16T20:04:19.426491,37.1,74,134,84,96.1,14,21.0,474,35.1,312,281,,,,,34,24,456,7.8,56,34.0,
+P-10046,E-10046-02,2025-04-17T00:55:58.665470,36.2,70,135,87,96.3,14,42.9,521,36.3,117,108,0.43,1.1,2,8,,,493,8.6,,34.0,
+P-10046,E-10046-03,2025-04-03T16:25:23.483771,36.2,67,132,95,98.2,19,21.0,437,,,,,,,8,,,406,7.8,,34.0,1
+P-10046,E-10046-03,2025-04-03T18:23:15.748007,36.4,70,153,95,99.0,18,21.0,531,41.4,,,,,,,25,,524,8.8,,34.0,
+P-10046,E-10046-03,2025-04-03T19:51:56.184981,36.6,82,146,102,98.7,13,21.0,500,35.9,,,,,,4,,,473,8.3,80,34.0,
+P-10046,E-10046-03,2025-04-03T21:20:42.363172,36.6,74,124,93,97.6,19,21.0,359,43.1,,,,1.1,,,35,,338,5.9,,34.0,
+P-10046,E-10046-03,2025-04-03T19:05:59.820464,36.7,84,141,86,97.6,16,21.0,405,,,,,,,,,,379,7.2,,34.0,
+P-10046,E-10046-03,2025-04-04T00:06:31.138518,36.9,76,154,93,93.1,18,21.0,487,39.9,,,,0.8,,,29,27,443,8.7,37,34.0,
+P-10046,E-10046-03,2025-04-03T22:53:48.194615,37.2,76,147,86,97.6,13,21.0,465,44.7,,,,0.9,,,,,428,7.7,,34.0,
+P-10046,E-10046-03,2025-04-04T03:08:00.575608,36.5,80,152,103,98.6,16,21.0,389,42.9,,,,0.9,,,,,352,7.0,,34.0,1
+P-10046,E-10046-03,2025-04-03T22:51:51.313357,36.6,84,132,84,99.3,16,21.0,418,,,,,,,,,,410,6.9,,34.0,
+P-10046,E-10046-03,2025-04-04T00:59:14.439311,36.1,104,132,79,97.1,12,21.0,500,,,,,1.1,,,26,23,456,8.9,,34.0,
+P-10046,E-10046-03,2025-04-04T02:15:10.454025,37.3,71,145,88,98.0,14,21.0,476,,,,,1.0,,,,,467,7.9,,34.0,
+P-10046,E-10046-03,2025-04-04T05:50:45.944888,36.6,82,123,93,96.4,15,21.0,474,42.8,,,,1.3,,,,,455,8.5,23,34.0,
+P-10046,E-10046-03,2025-04-04T01:26:30.050056,36.6,65,123,90,96.6,20,21.0,430,44.5,234,82,,,,,30,26,399,7.7,,34.0,
+P-10046,E-10046-03,2025-04-04T16:21:19.249455,36.3,72,152,95,98.5,20,21.0,423,40.8,325,133,,1.2,,,,,420,7.0,,34.0,
+P-10047,E-10047-01,2025-04-14T16:25:23.483771,36.3,79,112,79,97.9,17,21.0,457,43.9,483,443,,,,7,,,430,6.7,,27.8,
+P-10047,E-10047-01,2025-04-14T17:21:33.474905,36.8,68,142,84,97.6,13,21.0,538,,406,103,,1.1,,,30,22,487,7.9,,27.8,
+P-10047,E-10047-01,2025-04-14T19:13:23.709547,36.7,70,110,73,96.3,13,21.0,393,,211,,,,,,28,21,388,6.2,,27.8,1
+P-10047,E-10047-01,2025-04-14T18:14:37.372844,37.0,69,124,77,98.0,16,21.0,487,37.1,,,,,,4,,,452,7.6,27,27.8,1
+P-10047,E-10047-01,2025-04-14T21:09:44.291766,37.2,65,121,93,96.1,20,21.0,490,38.6,102,,,1.3,,6,,,490,7.7,,27.8,1
+P-10047,E-10047-01,2025-04-15T02:00:32.018253,36.9,84,124,76,97.0,12,21.0,516,35.3,322,193,,0.9,,,29,,492,8.1,,27.8,
+P-10047,E-10047-01,2025-04-14T21:54:58.696787,36.7,58,129,79,98.5,14,21.0,407,,185,162,,,,6,31,,388,6.0,,27.8,1
+P-10047,E-10047-01,2025-04-15T04:27:25.827651,36.8,81,117,70,97.1,19,21.0,526,36.4,176,143,,,,,,,478,8.3,72,27.8,
+P-10047,E-10047-01,2025-04-15T04:47:21.320468,36.9,70,112,80,97.6,19,21.0,452,,,,,,,8,,,418,7.1,59,27.8,
+P-10047,E-10047-02,2025-04-11T16:25:23.483771,37.2,74,144,85,98.4,18,21.0,414,44.4,,,,,,5,27,26,408,6.5,,27.8,
+P-10047,E-10047-02,2025-04-11T18:11:56.897530,37.0,71,122,75,97.8,14,21.0,385,44.1,,,,,,,31,22,385,5.6,64,27.8,1
+P-10047,E-10047-02,2025-04-11T18:02:53.550455,36.5,71,110,83,96.6,20,21.0,438,35.1,281,,,,,,,,411,6.9,,27.8,
+P-10047,E-10047-02,2025-04-11T20:09:27.347305,36.5,79,116,77,97.1,20,21.0,454,42.1,,,,0.8,,,32,27,446,7.1,24,27.8,
+P-10047,E-10047-02,2025-04-11T22:07:38.234250,36.6,67,114,75,94.9,14,21.0,464,,,,,1.4,,,27,,424,7.3,,27.8,
+P-10047,E-10047-02,2025-04-11T21:59:40.340727,36.4,85,119,76,98.3,12,21.0,523,,489,190,,,,,,,499,8.2,,27.8,
+P-10047,E-10047-02,2025-04-11T20:06:18.384572,36.1,78,115,82,99.0,17,21.0,491,37.9,175,,,0.9,,,31,,489,7.7,35,27.8,
+P-10047,E-10047-02,2025-04-11T20:25:14.712715,36.9,78,122,84,98.1,17,30.6,416,,,,0.31,1.2,10,,,,412,6.1,,27.8,
+P-10047,E-10047-02,2025-04-11T20:47:18.844699,36.9,84,123,77,96.9,14,21.0,401,41.0,,,,1.4,,6,32,21,364,6.3,69,27.8,
+P-10047,E-10047-02,2025-04-12T09:36:14.573089,36.1,67,114,70,98.6,19,21.0,429,40.0,431,260,,,,,33,26,410,6.7,,27.8,
+P-10047,E-10047-02,2025-04-12T11:30:58.617901,36.5,78,122,72,96.7,20,21.0,386,,,,,,,,34,,353,5.7,,27.8,
+P-10047,E-10047-03,2025-04-13T16:25:23.483771,36.4,75,116,77,99.4,12,21.0,353,35.3,326,252,,1.4,,,31,,352,5.5,34,27.8,
+P-10047,E-10047-03,2025-04-13T17:24:10.129588,37.5,71,110,72,98.8,12,21.0,451,,226,159,,,,7,,,448,6.6,,27.8,
+P-10047,E-10047-03,2025-04-13T19:08:52.131208,37.0,82,115,70,96.6,12,21.0,538,,,,,1.4,,,35,24,498,8.5,,27.8,1
+P-10047,E-10047-03,2025-04-13T21:02:47.781808,36.5,44,110,77,97.6,12,21.0,419,42.5,,,,1.5,,,34,,413,6.6,,27.8,
+P-10047,E-10047-03,2025-04-13T19:07:30.566145,36.4,75,113,71,97.6,20,21.0,353,36.4,,,,,,7,,,349,5.2,,27.8,
+P-10047,E-10047-03,2025-04-14T00:23:36.418755,36.7,81,116,78,96.7,20,42.2,510,,205,171,0.42,,4,,27,26,470,8.0,,27.8,
+P-10047,E-10047-03,2025-04-13T23:59:23.417118,36.6,79,110,70,99.2,12,21.0,515,,,,,1.1,,,32,28,473,7.6,,27.8,
+P-10047,E-10047-03,2025-04-14T03:20:49.283725,36.6,69,123,77,96.8,18,21.0,515,44.4,367,95,,1.0,,,,,499,7.6,,27.8,
+P-10047,E-10047-03,2025-04-14T00:00:09.178931,36.8,67,116,79,96.3,12,21.0,426,,,,,1.0,,,34,,391,6.7,,27.8,
+P-10047,E-10047-03,2025-04-14T05:01:11.134665,36.8,78,118,85,97.6,15,33.8,388,,,,0.34,,9,,33,22,355,6.1,30,27.8,
+P-10047,E-10047-03,2025-04-13T22:22:26.595075,37.1,72,133,90,98.9,13,21.0,523,37.8,,,,1.1,,5,,,513,7.7,,27.8,
+P-10048,E-10048-01,2025-04-15T16:25:23.483771,37.2,75,140,93,99.3,12,21.0,498,35.5,,,,1.3,,7,,,493,9.8,,31.4,1
+P-10048,E-10048-01,2025-04-15T17:09:11.905288,36.0,65,136,94,96.1,17,21.0,361,,,,,0.8,,,30,25,356,6.5,,31.4,1
+P-10048,E-10048-01,2025-04-15T17:28:54.653380,36.9,76,137,96,99.0,17,21.0,529,35.9,,,,1.4,,4,,,512,10.4,,31.4,1
+P-10048,E-10048-01,2025-04-15T21:43:52.667114,36.1,71,156,91,98.5,18,21.0,429,39.6,413,302,,1.1,,,,,412,7.7,,31.4,
+P-10048,E-10048-01,2025-04-16T00:19:25.292131,36.5,85,140,88,96.7,19,21.0,513,41.9,,,,1.4,,,25,25,464,10.1,,31.4,
+P-10048,E-10048-01,2025-04-15T22:42:26.355650,36.9,77,138,95,98.1,12,59.7,446,,,,0.6,,3,6,,,411,8.8,,31.4,
+P-10048,E-10048-01,2025-04-15T19:54:51.263002,36.4,68,128,85,96.4,14,36.1,534,,,,0.36,1.2,9,,,,500,9.6,,31.4,
+P-10048,E-10048-01,2025-04-15T22:25:58.660385,36.6,82,139,86,99.3,15,21.0,388,38.3,,,,1.1,,5,,,361,7.0,,31.4,
+P-10048,E-10048-01,2025-04-16T06:48:30.056445,36.6,43,137,93,97.4,16,21.0,377,35.2,,,,,,6,,,362,7.4,35,31.4,
+P-10048,E-10048-02,2025-04-15T16:25:23.483771,36.4,72,134,92,97.8,17,21.0,401,,,,,,,,,,401,7.9,28,31.4,
+P-10048,E-10048-02,2025-04-15T17:01:30.937842,36.8,107,134,92,98.5,23,33.5,372,37.2,,,0.34,1.3,2,5,25,,357,6.7,,31.4,1
+P-10048,E-10048-02,2025-04-15T18:10:21.989195,36.8,78,143,78,97.1,17,54.1,459,37.1,,,0.54,,6,5,,,451,9.0,,31.4,
+P-10048,E-10048-02,2025-04-15T21:26:07.349898,36.5,72,132,80,98.4,16,42.2,459,42.5,355,135,0.42,,9,6,,,434,8.3,,31.4,1
+P-10048,E-10048-02,2025-04-15T21:52:45.001350,36.3,51,132,88,97.2,17,21.0,466,39.4,389,253,,1.2,,5,,,455,9.1,33,31.4,
+P-10048,E-10048-02,2025-04-16T00:47:46.979913,37.1,68,134,91,92.5,13,21.0,459,37.4,202,147,,1.3,,8,26,26,434,8.3,,31.4,
+P-10048,E-10048-02,2025-04-16T04:08:45.275093,36.6,65,138,95,98.2,16,21.0,424,36.5,449,,,1.4,,6,,,394,8.3,,31.4,
+P-10049,E-10049-01,2025-04-14T16:25:23.483771,36.8,68,113,77,98.2,20,21.0,491,39.0,,,,1.3,,7,27,,486,7.0,,26.3,
+P-10049,E-10049-01,2025-04-14T17:33:20.252151,36.2,83,111,82,95.3,16,21.0,496,,,,,1.2,,,,,476,7.0,49,26.3,
+P-10049,E-10049-01,2025-04-14T19:31:48.256826,36.3,66,120,84,96.1,15,51.2,518,43.1,,,0.51,1.4,3,,30,22,496,6.9,,26.3,
+P-10049,E-10049-01,2025-04-14T21:24:48.225872,36.8,46,110,79,96.3,16,21.0,352,44.1,,,,,,,32,20,334,5.0,,26.3,
+P-10049,E-10049-01,2025-04-14T18:48:16.690089,37.0,82,125,81,96.9,13,21.0,438,,,,,1.3,,,,,432,5.8,64,26.3,1
+P-10049,E-10049-01,2025-04-15T00:48:13.265289,36.9,78,121,83,97.8,15,39.1,501,,359,344,0.39,1.3,8,4,,,463,7.1,22,26.3,1
+P-10049,E-10049-01,2025-04-14T22:53:40.622539,37.0,83,117,79,98.4,17,41.1,457,42.9,,,0.41,1.1,3,,,,430,6.5,,26.3,
+P-10049,E-10049-01,2025-04-14T23:31:38.577744,36.7,74,124,79,96.7,17,21.0,514,38.7,,,,1.4,,5,,,474,7.3,,26.3,1
+P-10049,E-10049-01,2025-04-15T01:53:08.824503,36.7,41,114,81,96.9,18,21.0,529,,,,,,,,,,478,7.1,,26.3,
+P-10049,E-10049-01,2025-04-15T03:41:38.867393,36.3,66,117,78,97.0,21,24.5,430,36.1,,,0.24,,8,7,,,389,6.1,,26.3,
+P-10049,E-10049-01,2025-04-15T01:39:35.084675,36.8,71,125,82,96.6,16,21.0,363,41.9,,,,0.8,,,,,339,5.1,50,26.3,
+P-10049,E-10049-01,2025-04-15T12:11:43.728331,36.2,75,138,95,99.4,17,21.0,377,,388,,,1.0,,6,,,341,5.0,,26.3,
+P-10049,E-10049-01,2025-04-14T22:34:48.388049,36.8,105,141,87,96.6,19,28.2,547,,,,0.28,1.5,4,,,,517,7.8,,26.3,1
+P-10049,E-10049-01,2025-04-15T09:48:55.730729,37.0,46,121,72,97.1,20,21.0,437,39.6,118,106,,1.1,,,,,400,6.2,,26.3,
+P-10049,E-10049-02,2025-04-16T16:25:23.483771,36.3,75,114,70,96.5,20,51.2,514,,430,409,0.51,,6,6,29,24,464,6.9,,26.3,1
+P-10049,E-10049-02,2025-04-16T17:52:04.086811,36.5,85,122,73,98.1,20,21.0,380,,,,,1.0,,5,,,353,5.1,,26.3,1
+P-10049,E-10049-02,2025-04-16T17:35:43.740958,36.9,78,112,74,96.4,13,21.0,362,43.0,,,,0.8,,5,35,20,347,4.8,,26.3,1
+P-10049,E-10049-02,2025-04-16T20:17:28.945788,36.1,81,110,85,96.0,17,21.0,407,36.0,,,,1.4,,,28,22,375,5.4,,26.3,1
+P-10049,E-10049-02,2025-04-16T23:29:37.794190,37.2,72,137,84,99.1,20,32.6,463,44.1,,,0.33,1.5,4,,,,449,6.2,,26.3,
+P-10049,E-10049-02,2025-04-16T23:27:09.117592,36.2,69,137,80,97.6,17,21.0,359,42.0,,,,1.4,,,,,345,5.1,,26.3,1
+P-10049,E-10049-02,2025-04-17T00:09:52.855567,36.7,81,117,70,98.0,19,21.0,483,,,,,,,,,,450,6.9,,26.3,
+P-10049,E-10049-02,2025-04-17T00:26:29.953334,36.7,82,112,70,98.4,12,21.0,461,44.3,,,,,,8,,,442,6.5,43,26.3,1
+P-10049,E-10049-02,2025-04-17T02:17:44.316898,36.5,108,118,75,97.6,19,41.7,484,40.8,149,122,0.42,,6,,34,,439,6.9,67,26.3,
+P-10049,E-10049-02,2025-04-17T01:07:26.693088,37.1,56,112,81,96.5,17,21.0,415,,,,,,,5,35,30,399,5.5,,26.3,
+P-10049,E-10049-02,2025-04-17T07:08:46.729183,36.4,83,133,75,97.6,14,21.0,457,37.8,,,,1.2,,,,,438,6.1,,26.3,
+P-10049,E-10049-02,2025-04-17T08:20:06.005181,36.9,79,123,73,95.4,14,21.0,462,44.4,,,,1.1,,8,31,,430,6.2,45,26.3,
+P-10049,E-10049-02,2025-04-17T04:58:08.445410,37.6,70,116,74,96.3,16,21.0,357,,,,,1.3,,,35,,321,5.1,,26.3,1
+P-10049,E-10049-02,2025-04-17T13:30:04.653733,36.7,81,115,80,96.4,18,21.0,478,43.0,,,,1.3,,8,,,456,6.8,,26.3,1
+P-10049,E-10049-02,2025-04-17T00:39:20.733790,36.2,82,124,84,99.4,14,21.0,445,,,,,,,,33,,410,6.3,75,26.3,1
+P-10050,E-10050-01,2025-04-13T16:25:23.483771,36.1,72,138,82,98.5,18,26.9,405,43.2,,,0.27,1.2,5,,,,385,8.6,,28.7,
+P-10050,E-10050-01,2025-04-13T17:05:40.165950,36.8,88,144,84,97.1,16,21.0,399,,458,,,,,,,,392,8.5,,28.7,
+P-10050,E-10050-01,2025-04-13T18:56:00.717588,36.3,95,135,87,96.5,18,46.4,351,39.4,230,138,0.46,1.4,7,,32,,337,7.5,42,28.7,
+P-10050,E-10050-01,2025-04-13T19:31:39.883477,36.4,91,128,79,98.8,18,28.9,392,,,,0.29,1.0,4,,31,24,368,8.3,,28.7,1
+P-10050,E-10050-01,2025-04-13T19:50:54.385817,36.5,71,125,91,97.0,13,21.0,456,,,,,1.2,,,29,,449,9.7,,28.7,
+P-10050,E-10050-01,2025-04-14T00:24:56.712302,36.5,85,145,90,97.0,12,21.0,409,,,,,1.2,,,,,386,8.7,,28.7,
+P-10050,E-10050-01,2025-04-13T23:20:30.464292,36.6,72,128,78,99.3,13,21.0,397,,,,,,,,,,387,7.7,,28.7,1
+P-10050,E-10050-01,2025-04-13T23:09:49.019707,36.9,85,121,82,96.7,19,21.0,498,38.3,,,,0.9,,,33,31,449,9.7,,28.7,
+P-10050,E-10050-01,2025-04-14T02:57:29.641259,36.5,94,136,96,94.0,12,21.0,457,,,,,,,8,,,438,9.7,,28.7,
+P-10050,E-10050-02,2025-04-08T16:25:23.483771,36.2,86,122,81,98.8,15,21.0,439,,280,,,,,,,,419,9.3,,28.7,
+P-10050,E-10050-02,2025-04-08T17:14:56.697588,36.0,90,137,84,97.5,20,21.0,520,,,,,,,6,,,471,11.1,44,28.7,
+P-10050,E-10050-02,2025-04-08T17:49:56.169021,36.2,88,137,82,96.1,20,21.0,476,36.5,,,,1.2,,,27,25,431,10.1,,28.7,
+P-10050,E-10050-02,2025-04-08T21:44:51.532178,36.6,87,150,99,97.1,12,21.0,423,44.9,,,,0.8,,,33,30,406,8.2,54,28.7,
+P-10050,E-10050-02,2025-04-08T20:02:50.864186,37.2,78,132,90,97.4,15,21.0,482,42.2,,,,,,,,,477,9.4,67,28.7,
+P-10050,E-10050-03,2025-04-06T16:25:23.483771,36.6,110,137,86,97.4,13,21.0,414,37.8,,,,1.2,,6,34,,377,8.0,,28.7,
+P-10050,E-10050-03,2025-04-06T18:03:31.843585,36.4,95,147,85,96.5,18,21.0,447,39.3,123,80,,1.1,,4,31,20,439,8.7,,28.7,1
+P-10050,E-10050-03,2025-04-06T20:08:42.464734,36.1,87,145,96,96.2,23,21.0,491,,,,,1.3,,,,,457,10.4,,28.7,
+P-10050,E-10050-03,2025-04-06T19:46:23.204389,36.8,83,127,84,95.8,15,21.0,369,,156,150,,,,8,34,32,347,7.2,,28.7,
+P-10050,E-10050-03,2025-04-06T19:54:50.983779,36.7,95,139,82,99.5,17,21.0,477,36.7,300,126,,,,5,,,447,9.3,,28.7,
+P-10050,E-10050-03,2025-04-06T20:03:30.792485,36.6,98,142,88,96.7,12,21.0,513,38.5,,,,1.4,,,29,26,494,10.9,,28.7,
+P-10050,E-10050-03,2025-04-06T21:46:50.703858,36.4,82,132,87,99.5,19,53.8,527,35.5,494,248,0.54,1.4,2,,27,21,483,11.2,,28.7,
+P-10050,E-10050-03,2025-04-07T03:11:32.384091,36.6,83,144,90,96.4,17,21.0,393,35.6,,,,,,7,,,358,8.4,,28.7,1
+P-10050,E-10050-03,2025-04-07T05:52:16.342159,36.6,89,128,87,92.4,16,38.4,411,35.4,,,0.38,,6,4,,,379,8.7,,28.7,
+P-10050,E-10050-03,2025-04-07T09:56:18.580417,36.8,80,136,78,98.9,17,21.0,414,,281,106,,,,,,,406,8.0,28,28.7,1
+P-10050,E-10050-03,2025-04-07T01:49:57.746735,36.7,64,142,91,97.9,12,21.0,544,42.2,,,,1.0,,6,,,523,11.6,,28.7,
+P-10050,E-10050-03,2025-04-06T23:11:41.389865,37.2,83,125,83,97.3,16,21.0,355,,,,,1.2,,,,,331,6.9,,28.7,
+P-10050,E-10050-03,2025-04-07T16:14:58.391315,37.1,89,137,85,98.1,15,21.0,529,37.2,339,145,,,,,,,515,11.3,,28.7,
+P-10050,E-10050-03,2025-04-07T05:25:26.072455,37.2,99,138,80,98.7,12,21.0,423,,,,,,,,,,381,8.2,79,28.7,
+P-10050,E-10050-03,2025-04-07T04:29:33.592189,37.4,76,136,96,97.9,16,21.0,394,,,,,1.0,,,35,25,368,7.6,,28.7,
diff --git a/migrations/versions/0a3ef5c08275_add_encounterstatus_enum_and_update_.py b/migrations/versions/0a3ef5c08275_add_encounterstatus_enum_and_update_.py
new file mode 100644
index 0000000000000000000000000000000000000000..02c0469e690b5e7da375e5d0f4b87d7f4be61a5c
--- /dev/null
+++ b/migrations/versions/0a3ef5c08275_add_encounterstatus_enum_and_update_.py
@@ -0,0 +1,52 @@
+"""Add EncounterStatus enum and update status column
+
+Revision ID: 0a3ef5c08275
+Revises: 6d1cbb67e2e2
+Create Date: 2025-04-19 11:22:10.500929
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision = '0a3ef5c08275'
+down_revision = '6d1cbb67e2e2'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('encounters', schema=None) as batch_op:
+        batch_op.alter_column('status',
+               existing_type=mysql.VARCHAR(collation='utf8mb4_unicode_ci', length=50),
+               type_=sa.Enum('ACTIVE', 'NEEDS_ASSESSMENT', 'ASSESSMENT_IN_PROGRESS', 'AWAITING_REVIEW', 'COMPLETED', 'CANCELLED', name='encounterstatus'),
+               existing_nullable=False)
+        batch_op.create_index(batch_op.f('ix_encounters_status'), ['status'], unique=False)
+
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               type_=sa.Text(length=16777215),
+               existing_nullable=True)
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=sa.Text(length=16777215),
+               type_=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               existing_nullable=True)
+
+    with op.batch_alter_table('encounters', schema=None) as batch_op:
+        batch_op.drop_index(batch_op.f('ix_encounters_status'))
+        batch_op.alter_column('status',
+               existing_type=sa.Enum('ACTIVE', 'NEEDS_ASSESSMENT', 'ASSESSMENT_IN_PROGRESS', 'AWAITING_REVIEW', 'COMPLETED', 'CANCELLED', name='encounterstatus'),
+               type_=mysql.VARCHAR(collation='utf8mb4_unicode_ci', length=50),
+               existing_nullable=False)
+
+    # ### end Alembic commands ###
diff --git a/migrations/versions/375b7f062a5f_add_ass_date_to_patient.py b/migrations/versions/375b7f062a5f_add_ass_date_to_patient.py
new file mode 100644
index 0000000000000000000000000000000000000000..d9414503dedacbf345ffd1289c284b3b4428750d
--- /dev/null
+++ b/migrations/versions/375b7f062a5f_add_ass_date_to_patient.py
@@ -0,0 +1,44 @@
+"""add ass date to patient
+
+Revision ID: 375b7f062a5f
+Revises: 0a3ef5c08275
+Create Date: 2025-04-19 11:58:03.391271
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision = '375b7f062a5f'
+down_revision = '0a3ef5c08275'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('patients', schema=None) as batch_op:
+        batch_op.add_column(sa.Column('assignment_date', sa.DateTime(), nullable=True))
+
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               type_=sa.Text(length=16777215),
+               existing_nullable=True)
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=sa.Text(length=16777215),
+               type_=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               existing_nullable=True)
+
+    with op.batch_alter_table('patients', schema=None) as batch_op:
+        batch_op.drop_column('assignment_date')
+
+    # ### end Alembic commands ###
diff --git a/migrations/versions/617d526bbcee_add.py b/migrations/versions/617d526bbcee_add.py
new file mode 100644
index 0000000000000000000000000000000000000000..c34079c2c3a94f8aeb5a769c964f904469ce445a
--- /dev/null
+++ b/migrations/versions/617d526bbcee_add.py
@@ -0,0 +1,48 @@
+"""add
+
+Revision ID: 617d526bbcee
+Revises: 9d82acfed8fa
+Create Date: 2025-04-18 22:06:25.939688
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision = '617d526bbcee'
+down_revision = '9d82acfed8fa'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('encounters', schema=None) as batch_op:
+        batch_op.add_column(sa.Column('end_time', sa.DateTime(), nullable=True))
+        batch_op.add_column(sa.Column('encounter_type', sa.String(length=50), nullable=True))
+        batch_op.add_column(sa.Column('needs_intervention', sa.Boolean(), nullable=False))
+
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               type_=sa.Text(length=16777215),
+               existing_nullable=True)
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=sa.Text(length=16777215),
+               type_=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               existing_nullable=True)
+
+    with op.batch_alter_table('encounters', schema=None) as batch_op:
+        batch_op.drop_column('needs_intervention')
+        batch_op.drop_column('encounter_type')
+        batch_op.drop_column('end_time')
+
+    # ### end Alembic commands ###
diff --git a/migrations/versions/6d1cbb67e2e2_assign.py b/migrations/versions/6d1cbb67e2e2_assign.py
new file mode 100644
index 0000000000000000000000000000000000000000..3a5c81d9de2dfd3cefa8ff43565afe37f3ad2166
--- /dev/null
+++ b/migrations/versions/6d1cbb67e2e2_assign.py
@@ -0,0 +1,50 @@
+"""assign
+
+Revision ID: 6d1cbb67e2e2
+Revises: bfff5e42bd2f
+Create Date: 2025-04-19 00:03:59.435077
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision = '6d1cbb67e2e2'
+down_revision = 'bfff5e42bd2f'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('patients', schema=None) as batch_op:
+        batch_op.add_column(sa.Column('assigned_dietitian_user_id', sa.Integer(), nullable=True))
+        batch_op.drop_constraint('patients_ibfk_1', type_='foreignkey')
+        batch_op.create_foreign_key(None, 'users', ['assigned_dietitian_user_id'], ['userID'])
+        batch_op.drop_column('dietitian_id')
+
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               type_=sa.Text(length=16777215),
+               existing_nullable=True)
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=sa.Text(length=16777215),
+               type_=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               existing_nullable=True)
+
+    with op.batch_alter_table('patients', schema=None) as batch_op:
+        batch_op.add_column(sa.Column('dietitian_id', mysql.INTEGER(), autoincrement=False, nullable=True))
+        batch_op.drop_constraint(None, type_='foreignkey')
+        batch_op.create_foreign_key('patients_ibfk_1', 'dietitians', ['dietitian_id'], ['dietitianID'])
+        batch_op.drop_column('assigned_dietitian_user_id')
+
+    # ### end Alembic commands ###
diff --git a/migrations/versions/734f404fad77_add_encounter_id_and_dietitian_id_to_.py b/migrations/versions/734f404fad77_add_encounter_id_and_dietitian_id_to_.py
new file mode 100644
index 0000000000000000000000000000000000000000..a725f86a49510a496c1234e9d10ab298ac504d9c
--- /dev/null
+++ b/migrations/versions/734f404fad77_add_encounter_id_and_dietitian_id_to_.py
@@ -0,0 +1,52 @@
+"""Add encounter_id and dietitian_id to Report mode
+
+Revision ID: 734f404fad77
+Revises: cf323f4343be
+Create Date: 2025-04-19 15:30:30.321092
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision = '734f404fad77'
+down_revision = 'cf323f4343be'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('reports', schema=None) as batch_op:
+        batch_op.add_column(sa.Column('encounterID', sa.Integer(), nullable=True))
+        batch_op.add_column(sa.Column('dietitianID', sa.Integer(), nullable=True))
+        batch_op.add_column(sa.Column('completed_date', sa.DateTime(), nullable=True))
+        batch_op.create_foreign_key(None, 'encounters', ['encounterID'], ['encounterID'])
+        batch_op.create_foreign_key(None, 'users', ['dietitianID'], ['userID'])
+
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               type_=sa.Text(length=16777215),
+               existing_nullable=True)
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=sa.Text(length=16777215),
+               type_=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               existing_nullable=True)
+
+    with op.batch_alter_table('reports', schema=None) as batch_op:
+        batch_op.drop_constraint(None, type_='foreignkey')
+        batch_op.drop_constraint(None, type_='foreignkey')
+        batch_op.drop_column('completed_date')
+        batch_op.drop_column('dietitianID')
+        batch_op.drop_column('encounterID')
+
+    # ### end Alembic commands ###
diff --git a/migrations/versions/bfff5e42bd2f_allow_null_for_needs_intervention.py b/migrations/versions/bfff5e42bd2f_allow_null_for_needs_intervention.py
new file mode 100644
index 0000000000000000000000000000000000000000..bb21b71136921d364830f1964bf5f3f23a0d9be6
--- /dev/null
+++ b/migrations/versions/bfff5e42bd2f_allow_null_for_needs_intervention.py
@@ -0,0 +1,48 @@
+"""Allow null for needs_intervention
+
+Revision ID: bfff5e42bd2f
+Revises: e631bdcdce5f
+Create Date: 2025-04-18 23:01:08.603279
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision = 'bfff5e42bd2f'
+down_revision = 'e631bdcdce5f'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('encounters', schema=None) as batch_op:
+        batch_op.alter_column('needs_intervention',
+               existing_type=mysql.TINYINT(display_width=1),
+               nullable=True)
+
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               type_=sa.Text(length=16777215),
+               existing_nullable=True)
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=sa.Text(length=16777215),
+               type_=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               existing_nullable=True)
+
+    with op.batch_alter_table('encounters', schema=None) as batch_op:
+        batch_op.alter_column('needs_intervention',
+               existing_type=mysql.TINYINT(display_width=1),
+               nullable=False)
+
+    # ### end Alembic commands ###
diff --git "a/migrations/versions/cf323f4343be_thay_\304\221\341\273\225i_tr\341\272\241ng_th\303\241i.py" "b/migrations/versions/cf323f4343be_thay_\304\221\341\273\225i_tr\341\272\241ng_th\303\241i.py"
new file mode 100644
index 0000000000000000000000000000000000000000..ce366055b4bf4c6a54921e69e2b570136bfaf0f8
--- /dev/null
+++ "b/migrations/versions/cf323f4343be_thay_\304\221\341\273\225i_tr\341\272\241ng_th\303\241i.py"
@@ -0,0 +1,38 @@
+"""thay đổi trạng thái
+
+Revision ID: cf323f4343be
+Revises: fd2ac04819c9
+Create Date: 2025-04-19 14:39:22.579139
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision = 'cf323f4343be'
+down_revision = 'fd2ac04819c9'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               type_=sa.Text(length=16777215),
+               existing_nullable=True)
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=sa.Text(length=16777215),
+               type_=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               existing_nullable=True)
+
+    # ### end Alembic commands ###
diff --git a/migrations/versions/e631bdcdce5f_ml.py b/migrations/versions/e631bdcdce5f_ml.py
new file mode 100644
index 0000000000000000000000000000000000000000..42785d6a089d27848dfaab7d56f06e447df20b97
--- /dev/null
+++ b/migrations/versions/e631bdcdce5f_ml.py
@@ -0,0 +1,44 @@
+"""ml
+
+Revision ID: e631bdcdce5f
+Revises: 617d526bbcee
+Create Date: 2025-04-18 22:18:57.110317
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision = 'e631bdcdce5f'
+down_revision = '617d526bbcee'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('encounters', schema=None) as batch_op:
+        batch_op.add_column(sa.Column('diagnosis', sa.String(length=255), nullable=True))
+
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               type_=sa.Text(length=16777215),
+               existing_nullable=True)
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=sa.Text(length=16777215),
+               type_=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               existing_nullable=True)
+
+    with op.batch_alter_table('encounters', schema=None) as batch_op:
+        batch_op.drop_column('diagnosis')
+
+    # ### end Alembic commands ###
diff --git a/migrations/versions/eaf7e2cfc895_add_procedure.py b/migrations/versions/eaf7e2cfc895_add_procedure.py
new file mode 100644
index 0000000000000000000000000000000000000000..e63dcdd27ee7cd05eeb21b3d200e8d1fd077518d
--- /dev/null
+++ b/migrations/versions/eaf7e2cfc895_add_procedure.py
@@ -0,0 +1,46 @@
+"""add procedure
+
+Revision ID: eaf7e2cfc895
+Revises: 734f404fad77
+Create Date: 2025-04-19 17:41:56.281693
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision = 'eaf7e2cfc895'
+down_revision = '734f404fad77'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('reports', schema=None) as batch_op:
+        batch_op.add_column(sa.Column('related_procedure_id', sa.Integer(), nullable=True))
+        batch_op.create_foreign_key(None, 'procedures', ['related_procedure_id'], ['procedureID'])
+
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               type_=sa.Text(length=16777215),
+               existing_nullable=True)
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=sa.Text(length=16777215),
+               type_=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               existing_nullable=True)
+
+    with op.batch_alter_table('reports', schema=None) as batch_op:
+        batch_op.drop_constraint(None, type_='foreignkey')
+        batch_op.drop_column('related_procedure_id')
+
+    # ### end Alembic commands ###
diff --git a/migrations/versions/fd2ac04819c9_update_status_enums_and_referral_.py b/migrations/versions/fd2ac04819c9_update_status_enums_and_referral_.py
new file mode 100644
index 0000000000000000000000000000000000000000..3da25157938a3344a96bb8b1c47b0803d68da0bf
--- /dev/null
+++ b/migrations/versions/fd2ac04819c9_update_status_enums_and_referral_.py
@@ -0,0 +1,136 @@
+"""Update status enums and referral dietitian relationship
+
+Revision ID: fd2ac04819c9
+Revises: 375b7f062a5f
+Create Date: 2025-04-19 13:54:15.128405
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import mysql
+
+# revision identifiers, used by Alembic.
+revision = 'fd2ac04819c9'
+down_revision = '375b7f062a5f'
+branch_labels = None
+depends_on = None
+
+# Định nghĩa Enum để sử dụng trong migration
+patient_status_enum = sa.Enum('NOT_ASSESSED', 'NEEDS_ASSESSMENT', 'ASSESSMENT_IN_PROGRESS', 'COMPLETED', name='patientstatus')
+referral_status_enum = sa.Enum('DIETITIAN_UNASSIGNED', 'WAITING_FOR_REPORT', 'COMPLETED', name='referralstatus')
+old_referral_status_enum_for_downgrade = sa.Enum('Not Needed', 'ML Recommended', 'Pending Review', 'Staff Referred', 'Completed', 'Rejected', name='referrals_referral_status')
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('patients', schema=None) as batch_op:
+        # === BEGIN DATA MIGRATION FOR patients.status ===
+        op.execute("UPDATE patients SET status = 'NEEDS_ASSESSMENT' WHERE status = 'Needs Assessment'")
+        op.execute("UPDATE patients SET status = 'COMPLETED' WHERE status = 'Completed'")
+        op.execute("UPDATE patients SET status = 'NOT_ASSESSED' WHERE status = 'active'")
+        # === END DATA MIGRATION ===
+
+        batch_op.alter_column('status',
+               existing_type=mysql.VARCHAR(collation='utf8mb4_unicode_ci', length=20),
+               type_=patient_status_enum, # Sử dụng Enum đã định nghĩa
+               existing_nullable=True, 
+               nullable=False,
+               postgresql_using='status::patientstatus' 
+              )
+        batch_op.create_index(batch_op.f('ix_patients_status'), ['status'], unique=False)
+
+    with op.batch_alter_table('referrals', schema=None) as batch_op:
+        # === BEGIN DATA MIGRATION FOR referrals.referral_status ===
+        op.execute("UPDATE referrals SET referral_status = 'DIETITIAN_UNASSIGNED' WHERE referral_status = 'ML Recommended'")
+        op.execute("UPDATE referrals SET referral_status = 'DIETITIAN_UNASSIGNED' WHERE referral_status = 'Staff Referred'")
+        op.execute("UPDATE referrals SET referral_status = 'DIETITIAN_UNASSIGNED' WHERE referral_status = 'Pending Review'")
+        op.execute("UPDATE referrals SET referral_status = 'COMPLETED' WHERE referral_status = 'Completed'")
+        op.execute("UPDATE referrals SET referral_status = NULL WHERE referral_status = 'Not Needed'")
+        op.execute("UPDATE referrals SET referral_status = NULL WHERE referral_status = 'Rejected'")
+        # === END DATA MIGRATION ===
+
+        # Thay đổi kiểu cột referral_status
+        batch_op.alter_column('referral_status',
+               existing_type=mysql.ENUM('Not Needed', 'ML Recommended', 'Pending Review', 'Staff Referred', 'Completed', 'Rejected', collation='utf8mb4_unicode_ci'),
+               type_=referral_status_enum, # Sử dụng Enum mới
+               existing_nullable=True, # Giữ nullable cũ (nếu có)
+               nullable=True, # Cho phép NULL theo model mới
+               postgresql_using='referral_status::referralstatus'
+               )
+
+        # Thay đổi liên kết dietitian
+        batch_op.add_column(sa.Column('assigned_dietitian_user_id', sa.Integer(), nullable=True))
+        batch_op.create_foreign_key('fk_referrals_assigned_dietitian_user', 'users', ['assigned_dietitian_user_id'], ['userID'])
+        # Kiểm tra xem khóa ngoại cũ có tồn tại không trước khi xóa
+        # Tên khóa ngoại có thể khác nhau, cần kiểm tra DB hoặc migration trước đó
+        # Giả sử tên là 'referrals_ibfk_3' như trong file gốc
+        try:
+            batch_op.drop_constraint('referrals_ibfk_3', type_='foreignkey')
+        except Exception as e:
+            print(f"Could not drop foreign key constraint 'referrals_ibfk_3': {e}")
+            # Có thể bỏ qua lỗi nếu khóa không tồn tại
+        batch_op.drop_column('dietitianID')
+
+        # Tạo index mới cho referral_status
+        batch_op.create_index(batch_op.f('ix_referrals_referral_status'), ['referral_status'], unique=False)
+
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               type_=sa.Text(length=16777215),
+               existing_nullable=True)
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('uploadedfiles', schema=None) as batch_op:
+        batch_op.alter_column('error_details',
+               existing_type=sa.Text(length=16777215),
+               type_=mysql.LONGTEXT(collation='utf8mb4_unicode_ci'),
+               existing_nullable=True)
+
+    with op.batch_alter_table('referrals', schema=None) as batch_op:
+        batch_op.drop_index(batch_op.f('ix_referrals_referral_status'))
+
+        # Thêm lại cột dietitianID và khóa ngoại cũ
+        batch_op.add_column(sa.Column('dietitianID', mysql.INTEGER(), autoincrement=False, nullable=True))
+        batch_op.create_foreign_key('referrals_ibfk_3', 'dietitians', ['dietitianID'], ['dietitianID'])
+        # Xóa cột và khóa ngoại mới
+        batch_op.drop_constraint('fk_referrals_assigned_dietitian_user', type_='foreignkey')
+        batch_op.drop_column('assigned_dietitian_user_id')
+
+        # === BEGIN DATA MIGRATION FOR referrals.referral_status (DOWNGRADE) ===
+        op.execute("UPDATE referrals SET referral_status = 'ML Recommended' WHERE referral_status = 'DIETITIAN_UNASSIGNED' AND is_ml_recommended = TRUE") # Ưu tiên ML nếu is_ml_recommended là True
+        op.execute("UPDATE referrals SET referral_status = 'Staff Referred' WHERE referral_status = 'DIETITIAN_UNASSIGNED' AND is_ml_recommended = FALSE") # Giả định còn lại là Staff Referred
+        op.execute("UPDATE referrals SET referral_status = 'Pending Review' WHERE referral_status = 'WAITING_FOR_REPORT'") # Map tương đối
+        op.execute("UPDATE referrals SET referral_status = 'Completed' WHERE referral_status = 'COMPLETED'")
+        op.execute("UPDATE referrals SET referral_status = 'Not Needed' WHERE referral_status IS NULL") # Map NULL về Not Needed
+        # === END DATA MIGRATION ===
+
+        # Thay đổi kiểu cột referral_status về cũ
+        batch_op.alter_column('referral_status',
+               existing_type=referral_status_enum,
+               type_=old_referral_status_enum_for_downgrade, # Sử dụng Enum cũ
+               existing_nullable=True,
+               nullable=True, # Giữ nullable như cũ?
+               server_default='Not Needed', # Đặt lại default cũ
+               postgresql_using='referral_status::referrals_referral_status'
+               )
+
+    with op.batch_alter_table('patients', schema=None) as batch_op:
+        batch_op.drop_index(batch_op.f('ix_patients_status'))
+
+        # === BEGIN DATA MIGRATION FOR patients.status (DOWNGRADE) ===
+        op.execute("UPDATE patients SET status = 'Needs Assessment' WHERE status = 'NEEDS_ASSESSMENT'")
+        op.execute("UPDATE patients SET status = 'Completed' WHERE status = 'COMPLETED'")
+        op.execute("UPDATE patients SET status = 'active' WHERE status = 'NOT_ASSESSED'")
+        # === END DATA MIGRATION ===
+
+        batch_op.alter_column('status',
+               existing_type=patient_status_enum,
+               type_=mysql.VARCHAR(collation='utf8mb4_unicode_ci', length=20),
+               existing_nullable=False,
+               nullable=True)
+
+    # ### end Alembic commands ###
diff --git a/new_patients_upload.csv b/new_patients_upload.csv
index a437f8de4d5817d8edc405b65f697387d9584adc..f66c8b21252ae09307136b1c1df5e61d6fed785d 100644
--- a/new_patients_upload.csv
+++ b/new_patients_upload.csv
@@ -1,51 +1,51 @@
 firstName,lastName,age,gender,height,weight,blood_type
-Monica,Jenkins,34,female,150.7,47.7,B-
-Angela,Collins,41,female,154.7,73.2,A+
-John,Webb,89,male,160.5,76.5,A-
-Cheryl,Williams,48,female,166.3,76.9,O+
-Teresa,Mcmillan,64,female,171.5,63.5,A-
-Victoria,Kim,21,female,162.4,55.5,B-
-David,Hunt,47,male,182.1,96.4,O-
-Kelly,Osborne,85,female,154.6,60.4,B-
-Nicholas,Smith,62,male,185.1,88.2,A-
-Anthony,Cohen,79,male,182.6,67.8,O+
-Teresa,Smith,78,female,154.0,60.7,B+
-Paul,Price,54,male,171.2,82.1,AB-
-Ryan,Sullivan,78,male,185.7,96.6,AB+
-Timothy,Gutierrez,63,male,170.2,83.5,O+
-Stephanie,Pacheco,76,female,159.0,67.2,O+
-Susan,Wagner,58,female,159.2,63.3,B+
-Michael,Frank,81,male,165.0,63.0,O-
-Collin,Williams,48,male,178.6,80.6,AB+
-Lindsay,Dunn,48,female,164.6,66.8,AB-
-Kenneth,Mitchell,42,male,177.8,75.9,B-
-Alyssa,Chan,69,female,157.5,63.2,O-
-Kimberly,Smith,39,female,170.8,65.4,AB-
-Tanya,Smith,66,female,173.4,76.3,B-
-Sean,Craig,76,male,187.1,89.6,AB-
-Robert,Travis,26,male,182.8,77.0,B-
-Michelle,Mason,76,female,158.0,60.1,A+
-Kristin,Pennington,33,female,167.6,59.3,A+
-Robert,Callahan,74,male,163.0,78.3,AB+
-Gloria,Carter,81,female,156.0,69.1,O+
-Jennifer,Smith,54,female,170.7,74.2,O-
-Courtney,Lee,32,female,154.6,58.2,O-
-Andrew,Potter,30,male,185.1,77.5,A+
-Alexander,Shannon,70,male,165.6,61.1,A-
-Carlos,Hoover,62,male,160.8,78.2,B-
-Robert,Smith,87,male,174.9,73.1,B-
-Katie,Arnold,63,female,168.4,74.4,A+
-Keith,Knight,47,male,167.4,89.1,B+
-Colleen,Reyes,62,female,170.8,75.8,B-
-Kyle,Aguirre,49,other,166.0,79.8,O+
-Morgan,Mckee,73,female,160.2,62.5,O+
-Nicholas,Ramirez,42,other,165.0,66.3,AB+
-Ashley,Hebert,87,female,155.1,50.1,A+
-Stanley,Thomas,41,male,188.6,85.8,AB-
-Ashley,Williams,20,female,167.2,62.5,O+
-Brittany,Cherry,55,female,175.0,78.5,B-
-Robert,Bowen,43,male,181.2,89.9,B+
-Judith,Phelps,53,female,165.0,72.3,B-
-Ryan,Baker,27,other,167.9,66.4,A+
-Nathan,Jones,72,male,160.1,74.9,AB+
-Zachary,Gentry,63,male,163.1,72.8,A-
+Deanna,Becker,63,female,169.6,61.9,AB+
+Margaret,Luna,20,female,174.9,69.0,AB+
+Jacqueline,Chavez,51,female,162.3,55.0,O-
+Bryan,Smith,30,male,183.2,91.2,AB+
+Michelle,Perkins,40,female,151.3,67.9,O+
+Tyler,Johnson,47,male,168.3,73.3,O+
+Michael,Smith,50,male,177.4,85.9,B-
+Joanna,Medina,81,female,166.4,48.1,AB+
+Joanna,Madden,60,female,167.5,69.4,B+
+Jeanne,Barnes,79,female,156.2,61.3,B-
+Kimberly,King,49,female,166.7,48.3,O+
+Ronald,Snow,24,male,184.4,94.7,O-
+Lance,Howard,84,male,172.3,100.2,AB+
+Renee,Moore,75,female,162.2,72.6,O+
+Edward,Mercado,26,male,167.5,74.6,A+
+Nancy,Boyle,28,female,166.1,73.3,AB-
+Joseph,Obrien,62,male,186.1,98.5,B-
+Dawn,Alvarez,25,female,154.4,57.6,A+
+Aaron,Henderson,18,male,178.5,90.6,A+
+Ian,Rice,87,male,166.7,74.8,B-
+Debra,Jordan,20,female,161.1,67.0,AB-
+Christina,Jones,21,female,156.9,64.1,AB-
+Rachel,Brown,85,female,156.3,50.4,AB+
+Zachary,Lee,87,male,162.5,66.5,AB+
+Scott,Hampton,29,male,189.2,87.6,O+
+Michael,Owens,47,male,168.5,65.3,AB+
+Perry,Smith,88,male,184.3,100.1,A-
+Crystal,Castillo,49,other,170.5,68.3,A-
+Andrew,Combs,80,male,178.6,80.1,A+
+Allen,Hardy,68,male,182.0,78.3,O-
+Robert,Morgan,73,male,164.0,80.2,A-
+Christopher,Buckley,48,male,185.0,83.1,O+
+Christina,Ramirez,80,female,150.4,67.7,AB+
+Larry,Anthony,60,male,167.2,70.6,AB-
+David,Huynh,28,other,165.7,70.6,A-
+Tiffany,Peterson,79,female,151.1,58.2,O+
+Anthony,Hanson,22,male,171.2,82.2,B-
+Paul,Gonzales,72,male,172.5,93.8,AB+
+Mary,Carrillo,31,female,165.1,58.6,AB+
+Brenda,Ortiz,33,female,151.7,64.7,O+
+John,Giles,22,male,177.5,78.9,O+
+Joseph,Taylor,83,male,161.9,75.1,A+
+Shane,Pham,88,male,169.0,74.3,B+
+John,Salas,65,male,185.5,80.4,AB-
+Connie,Martin,19,female,160.4,66.9,A+
+Paul,Dixon,46,male,164.6,82.9,A-
+Lisa,Rowe,42,female,164.4,83.8,B+
+Patricia,Gray,50,female,161.8,66.2,B+
+Stacy,Scott,28,female,172.2,66.5,AB-
+Vincent,Miller,23,male,186.2,90.2,A-