From 2761e785018bfc5093689f4e70fe58f0c7536737 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Tue, 10 Feb 2026 11:40:04 +0000 Subject: [PATCH 01/43] [PRMP-939] checking what report s3 content lambda is created --- .../base-lambdas-reusable-deploy-all.yml | 14 ++++ lambdas/handlers/report_s3_content_handler.py | 62 ++++++++++++++++ .../reporting/report_s3_content_service.py | 72 +++++++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 lambdas/handlers/report_s3_content_handler.py create mode 100644 lambdas/services/reporting/report_s3_content_service.py diff --git a/.github/workflows/base-lambdas-reusable-deploy-all.yml b/.github/workflows/base-lambdas-reusable-deploy-all.yml index 495c36fb46..3b6d16fadf 100644 --- a/.github/workflows/base-lambdas-reusable-deploy-all.yml +++ b/.github/workflows/base-lambdas-reusable-deploy-all.yml @@ -838,3 +838,17 @@ jobs: lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + + deploy_report_s3_content_lambda: + name: Deploy Report S3 Content Lambda + uses: ./.github/workflows/base-lambdas-reusable-deploy.yml + with: + environment: ${{ inputs.environment }} + python_version: ${{ inputs.python_version }} + build_branch: ${{ inputs.build_branch }} + sandbox: ${{ inputs.sandbox }} + lambda_handler_name: report_s3_content_handler + lambda_aws_name: reportS3ContentLambda + lambda_layer_names: "core_lambda_layer" + secrets: + AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py new file mode 100644 index 0000000000..e10f08dc80 --- /dev/null +++ b/lambdas/handlers/report_s3_content_handler.py @@ -0,0 +1,62 @@ +import os +import tempfile +from datetime import datetime, timedelta, timezone + +from repositories.reporting.reporting_dynamo_repository import ReportingDynamoRepository +from services.reporting.excel_report_generator_service import ExcelReportGenerator +from services.reporting.report_orchestration_service import ReportOrchestrationService +from services.reporting.report_s3_content_service import ReportS3ContentService +from utils.audit_logging_setup import LoggingService +from utils.decorators.ensure_env_var import ensure_environment_variables +from utils.decorators.handle_lambda_exceptions import handle_lambda_exceptions +from utils.decorators.override_error_check import override_error_check +from utils.decorators.set_audit_arg import set_request_context_for_logging + +logger = LoggingService(__name__) + + +# def calculate_reporting_window(): +# now = datetime.now(timezone.utc) +# today_7am = now.replace(hour=7, minute=0, second=0, microsecond=0) +# +# if now < today_7am: +# today_7am -= timedelta(days=1) +# +# yesterday_7am = today_7am - timedelta(days=1) +# +# return ( +# int(yesterday_7am.timestamp()), +# int(today_7am.timestamp()), +# ) + + +@ensure_environment_variables(names=["LLOYD_GEORGE_BUCKET_NAME"]) +@ensure_environment_variables(names=["LLOYD_GEORGE_BUCKET_NAME"]) +@ensure_environment_variables(names=["STATISTICAL_REPORTS_BUCKET"]) +@override_error_check +@handle_lambda_exceptions +@set_request_context_for_logging +def lambda_handler(event, context): + logger.info("Report S3 content lambda invoked") + lloyd_george_bucket = os.getenv("LLOYD_GEORGE_BUCKET_NAME") + bulk_staging_store = os.getenv("LLOYD_GEORGE_BUCKET_NAME") + statistic_reports_bucket = os.getenv("STATISTICAL_REPORTS_BUCKET") + + # repository = ReportingDynamoRepository(table_name) + # excel_generator = ExcelReportGenerator() + # + # service = ReportOrchestrationService( + # repository=repository, + # excel_generator=excel_generator, + # ) + + service = ReportS3ContentService() + + # window_start, window_end = calculate_reporting_window() + # tmp_dir = tempfile.mkdtemp() + + service.process_s3_content( + # window_start_ts=window_start, + # window_end_ts=window_end, + # output_dir=tmp_dir, + ) diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py new file mode 100644 index 0000000000..7651673826 --- /dev/null +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -0,0 +1,72 @@ +import os +import tempfile +from collections import defaultdict + +from services.base.s3_service import S3Service +from utils.audit_logging_setup import LoggingService + +logger = LoggingService(__name__) + + +class ReportS3ContentService: + def __init__( + self + # repository, + # excel_generator, + ): + self.lloyd_george_bucket = os.getenv("LLOYD_GEORGE_BUCKET_NAME") + self.bulk_staging_store = os.getenv("LLOYD_GEORGE_BUCKET_NAME") + self.statistic_reports_bucket = os.getenv("STATISTICAL_REPORTS_BUCKET") + self.s3_service = S3Service() + + def process_s3_content( + self, + # window_start_ts: int, + # window_end_ts: int, + # output_dir: str, + ): + bucket_names = [self.lloyd_george_bucket,self.bulk_staging_store] + for bucket_name in bucket_names: + all_bucket_objects = self.s3_service.list_all_objects(bucket_name) + logger.info(f"All Bucket Objects for bucket : {bucket_name}") + logger.info(f"{all_bucket_objects}") + + # records = self.repository.get_records_for_time_window( + # window_start_ts, + # window_end_ts, + # ) + # if not records: + # logger.info("No records found for reporting window") + # return + # + # records_by_ods = self.group_records_by_ods(records) + # + # for ods_code, ods_records in records_by_ods.items(): + # logger.info( + # f"Generating report for ODS ods_code = {ods_code} record_count = {len(ods_records)}" + # ) + # self.generate_ods_report(ods_code, ods_records) + # logger.info("Report orchestration completed") + + # @staticmethod + # def group_records_by_ods(records: list[dict]) -> dict[str, list[dict]]: + # grouped = defaultdict(list) + # for record in records: + # ods_code = record.get("UploaderOdsCode") or "UNKNOWN" + # grouped[ods_code].append(record) + # return grouped + # + # def generate_ods_report( + # self, + # ods_code: str, + # records: list[dict], + # ): + # with tempfile.NamedTemporaryFile( + # suffix=f"_{ods_code}.xlsx", + # delete=False, + # ) as tmp: + # self.excel_generator.create_report_orchestration_xlsx( + # ods_code=ods_code, + # records=records, + # output_path=tmp.name, + # ) From d90e18307166ba321bed54a057dfcd0c6a79fa12 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Tue, 10 Feb 2026 14:42:50 +0000 Subject: [PATCH 02/43] [PRMP-939] updated logic to upload the csv --- lambdas/handlers/report_s3_content_handler.py | 42 +------- lambdas/services/base/s3_service.py | 21 ++++ .../reporting/csv_report_generator_service.py | 66 ++++++++++++ .../reporting/report_s3_content_service.py | 100 ++++++++---------- .../test_report_s3_content_handler.py | 43 ++++++++ .../test_csv_report_generator_service.py | 27 +++++ .../test_report_s3_content_service.py | 34 ++++++ 7 files changed, 235 insertions(+), 98 deletions(-) create mode 100644 lambdas/services/reporting/csv_report_generator_service.py create mode 100644 lambdas/tests/unit/handlers/test_report_s3_content_handler.py create mode 100644 lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py create mode 100644 lambdas/tests/unit/services/reporting/test_report_s3_content_service.py diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py index e10f08dc80..70de3ffbc9 100644 --- a/lambdas/handlers/report_s3_content_handler.py +++ b/lambdas/handlers/report_s3_content_handler.py @@ -1,10 +1,3 @@ -import os -import tempfile -from datetime import datetime, timedelta, timezone - -from repositories.reporting.reporting_dynamo_repository import ReportingDynamoRepository -from services.reporting.excel_report_generator_service import ExcelReportGenerator -from services.reporting.report_orchestration_service import ReportOrchestrationService from services.reporting.report_s3_content_service import ReportS3ContentService from utils.audit_logging_setup import LoggingService from utils.decorators.ensure_env_var import ensure_environment_variables @@ -14,49 +7,16 @@ logger = LoggingService(__name__) - -# def calculate_reporting_window(): -# now = datetime.now(timezone.utc) -# today_7am = now.replace(hour=7, minute=0, second=0, microsecond=0) -# -# if now < today_7am: -# today_7am -= timedelta(days=1) -# -# yesterday_7am = today_7am - timedelta(days=1) -# -# return ( -# int(yesterday_7am.timestamp()), -# int(today_7am.timestamp()), -# ) - - -@ensure_environment_variables(names=["LLOYD_GEORGE_BUCKET_NAME"]) @ensure_environment_variables(names=["LLOYD_GEORGE_BUCKET_NAME"]) +@ensure_environment_variables(names=["BULK_STAGING_BUCKET_NAME"]) @ensure_environment_variables(names=["STATISTICAL_REPORTS_BUCKET"]) @override_error_check @handle_lambda_exceptions @set_request_context_for_logging def lambda_handler(event, context): logger.info("Report S3 content lambda invoked") - lloyd_george_bucket = os.getenv("LLOYD_GEORGE_BUCKET_NAME") - bulk_staging_store = os.getenv("LLOYD_GEORGE_BUCKET_NAME") - statistic_reports_bucket = os.getenv("STATISTICAL_REPORTS_BUCKET") - - # repository = ReportingDynamoRepository(table_name) - # excel_generator = ExcelReportGenerator() - # - # service = ReportOrchestrationService( - # repository=repository, - # excel_generator=excel_generator, - # ) service = ReportS3ContentService() - # window_start, window_end = calculate_reporting_window() - # tmp_dir = tempfile.mkdtemp() - service.process_s3_content( - # window_start_ts=window_start, - # window_end_ts=window_end, - # output_dir=tmp_dir, ) diff --git a/lambdas/services/base/s3_service.py b/lambdas/services/base/s3_service.py index 3ee42b4e24..4a9bdb0a3d 100644 --- a/lambdas/services/base/s3_service.py +++ b/lambdas/services/base/s3_service.py @@ -255,3 +255,24 @@ def save_or_create_file(self, source_bucket: str, file_key: str, body: bytes): return self.client.put_object( Bucket=source_bucket, Key=file_key, Body=BytesIO(body) ) + + def list_all_object_versions(self, bucket_name: str): + paginator = self.client.get_paginator("list_object_versions") + versions, delete_markers = [], [] + + for page in paginator.paginate(Bucket=bucket_name): + versions.extend(page.get("Versions", [])) + delete_markers.extend(page.get("DeleteMarkers", [])) + + return versions, delete_markers + + def get_object_tags_versioned(self, bucket: str, key: str, version_id: str | None): + try: + params = {"Bucket": bucket, "Key": key} + if version_id: + params["VersionId"] = version_id + response = self.client.get_object_tagging(**params) + return response.get("TagSet", []) + except ClientError: + return [] + diff --git a/lambdas/services/reporting/csv_report_generator_service.py b/lambdas/services/reporting/csv_report_generator_service.py new file mode 100644 index 0000000000..683ede526e --- /dev/null +++ b/lambdas/services/reporting/csv_report_generator_service.py @@ -0,0 +1,66 @@ +import csv +from io import StringIO +from utils.audit_logging_setup import LoggingService + +logger = LoggingService(__name__) + + +class CsvReportGenerator: + def generate_s3_inventory_csv(self, bucket, versions, delete_markers) -> str: + logger.info(f"Generating S3 inventory CSV for bucket {bucket}") + + output = StringIO() + writer = csv.writer(output) + + writer.writerow( + [ + "bucket", + "key", + "entry_type", + "version_id", + "is_latest", + "last_modified", + "size", + "etag", + "storage_class", + "tags", + ] + ) + + for version in versions: + tags = version.get("Tags", []) + tag_str = ";".join(f"{t['Key']}={t['Value']}" for t in tags) + + writer.writerow( + [ + bucket, + version["Key"], + "VERSION", + version["VersionId"], + version["IsLatest"], + version["LastModified"].isoformat(), + version.get("Size"), + version.get("ETag"), + version.get("StorageClass"), + tag_str, + ] + ) + + for marker in delete_markers: + writer.writerow( + [ + bucket, + marker["Key"], + "DELETE_MARKER", + marker["VersionId"], + marker["IsLatest"], + marker["LastModified"].isoformat(), + None, + None, + None, + "", + ] + ) + + logger.info(f"Finished CSV generation for {bucket}") + return output.getvalue() diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 7651673826..1df6290cf8 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -1,72 +1,58 @@ import os -import tempfile -from collections import defaultdict +from concurrent.futures import ThreadPoolExecutor, as_completed +from io import BytesIO from services.base.s3_service import S3Service +from services.reporting.csv_report_generator_service import CsvReportGenerator from utils.audit_logging_setup import LoggingService logger = LoggingService(__name__) class ReportS3ContentService: - def __init__( - self - # repository, - # excel_generator, - ): + def __init__(self): self.lloyd_george_bucket = os.getenv("LLOYD_GEORGE_BUCKET_NAME") - self.bulk_staging_store = os.getenv("LLOYD_GEORGE_BUCKET_NAME") + self.bulk_staging_store = os.getenv("BULK_STAGING_BUCKET_NAME") self.statistic_reports_bucket = os.getenv("STATISTICAL_REPORTS_BUCKET") self.s3_service = S3Service() + self.csv_generator = CsvReportGenerator() + self.max_objects = 100000 #To avoid prod from melting - def process_s3_content( - self, - # window_start_ts: int, - # window_end_ts: int, - # output_dir: str, - ): - bucket_names = [self.lloyd_george_bucket,self.bulk_staging_store] - for bucket_name in bucket_names: - all_bucket_objects = self.s3_service.list_all_objects(bucket_name) - logger.info(f"All Bucket Objects for bucket : {bucket_name}") - logger.info(f"{all_bucket_objects}") + def _fetch_tags(self, bucket, version): + tags = self.s3_service.get_object_tags_versioned( + bucket, version["Key"], version["VersionId"] + ) + version["Tags"] = tags + return version - # records = self.repository.get_records_for_time_window( - # window_start_ts, - # window_end_ts, - # ) - # if not records: - # logger.info("No records found for reporting window") - # return - # - # records_by_ods = self.group_records_by_ods(records) - # - # for ods_code, ods_records in records_by_ods.items(): - # logger.info( - # f"Generating report for ODS ods_code = {ods_code} record_count = {len(ods_records)}" - # ) - # self.generate_ods_report(ods_code, ods_records) - # logger.info("Report orchestration completed") + def process_s3_content(self): + for bucket in [self.lloyd_george_bucket, self.bulk_staging_store]: + logger.info(f"Listing versions for bucket {bucket}") + versions, delete_markers = self.s3_service.list_all_object_versions(bucket) - # @staticmethod - # def group_records_by_ods(records: list[dict]) -> dict[str, list[dict]]: - # grouped = defaultdict(list) - # for record in records: - # ods_code = record.get("UploaderOdsCode") or "UNKNOWN" - # grouped[ods_code].append(record) - # return grouped - # - # def generate_ods_report( - # self, - # ods_code: str, - # records: list[dict], - # ): - # with tempfile.NamedTemporaryFile( - # suffix=f"_{ods_code}.xlsx", - # delete=False, - # ) as tmp: - # self.excel_generator.create_report_orchestration_xlsx( - # ods_code=ods_code, - # records=records, - # output_path=tmp.name, - # ) + if len(versions) > self.max_objects: + logger.warning(f"Limiting versions from {len(versions)} to {self.max_objects}") + versions = versions[: self.max_objects] + + logger.info(f"Fetching tags in parallel for {len(versions)} versions") + + with ThreadPoolExecutor(max_workers=20) as executor: + futures = [ + executor.submit(self._fetch_tags, bucket, v) for v in versions + ] + for _ in as_completed(futures): + pass + + logger.info(f"Generating CSV for bucket {bucket}") + csv_content = self.csv_generator.generate_s3_inventory_csv( + bucket, versions, delete_markers + ) + + logger.info(f"Uploading report for bucket {bucket}") + self.s3_service.upload_file_obj( + BytesIO(csv_content.encode("utf-8")), + self.statistic_reports_bucket, + f"s3-content-report/{bucket}-inventory.csv", + ) + + logger.info(f"Completed report for {bucket}") diff --git a/lambdas/tests/unit/handlers/test_report_s3_content_handler.py b/lambdas/tests/unit/handlers/test_report_s3_content_handler.py new file mode 100644 index 0000000000..75976cb2f4 --- /dev/null +++ b/lambdas/tests/unit/handlers/test_report_s3_content_handler.py @@ -0,0 +1,43 @@ +import pytest +from types import SimpleNamespace +from lambdas.handlers.report_s3_content_handler import lambda_handler + + +@pytest.fixture(autouse=True) +def patch_env_vars(monkeypatch): + env_vars = { + "LLOYD_GEORGE_BUCKET_NAME": "bucket-a", + "STATISTICAL_REPORTS_BUCKET": "bucket-b", + "BULK_STAGING_BUCKET_NAME": "bucket-c", + } + for key, value in env_vars.items(): + monkeypatch.setenv(key, value) + + +@pytest.fixture +def lambda_context(): + return SimpleNamespace(aws_request_id="test-request-id") + + +def test_lambda_handler_invokes_service(mocker, lambda_context): + mock_service_cls = mocker.patch( + "lambdas.handlers.report_s3_content_handler.ReportS3ContentService" + ) + mock_service = mock_service_cls.return_value + + lambda_handler({}, lambda_context) + + mock_service_cls.assert_called_once() + mock_service.process_s3_content.assert_called_once() + + +def test_lambda_handler_runs_without_event_data(mocker, lambda_context): + mock_service_cls = mocker.patch( + "lambdas.handlers.report_s3_content_handler.ReportS3ContentService" + ) + mock_service = mock_service_cls.return_value + + lambda_handler({}, lambda_context) + + mock_service_cls.assert_called_once() + mock_service.process_s3_content.assert_called_once() diff --git a/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py b/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py new file mode 100644 index 0000000000..fba9fd9cf3 --- /dev/null +++ b/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py @@ -0,0 +1,27 @@ +from datetime import datetime, timezone +from services.reporting.csv_report_generator_service import CsvReportGenerator + + +def test_generate_s3_inventory_csv(): + generator = CsvReportGenerator() + + versions = [ + { + "Key": "file1.txt", + "VersionId": "v1", + "IsLatest": True, + "LastModified": datetime(2024, 1, 1, tzinfo=timezone.utc), + "Size": 123, + "ETag": "etag1", + "StorageClass": "STANDARD", + "Tags": [{"Key": "autodelete", "Value": "true"}], + } + ] + + delete_markers = [] + + csv_output = generator.generate_s3_inventory_csv("bucket-a", versions, delete_markers) + + assert "bucket-a" in csv_output + assert "file1.txt" in csv_output + assert "autodelete=true" in csv_output diff --git a/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py b/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py new file mode 100644 index 0000000000..5c8c8354f3 --- /dev/null +++ b/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py @@ -0,0 +1,34 @@ +from unittest.mock import MagicMock +from services.reporting.report_s3_content_service import ReportS3ContentService + + +def test_process_s3_content(mocker): + service = ReportS3ContentService() + service.lloyd_george_bucket = "bucket-a" + service.bulk_staging_store = "bucket-b" + service.statistic_reports_bucket = "reports-bucket" + service.s3_service = mocker.Mock() + service.csv_generator = mocker.Mock() + + fake_versions = [ + { + "Key": "file1.txt", + "VersionId": "v1", + "IsLatest": True, + "LastModified": mocker.Mock(), + } + ] + fake_delete_markers = [] + + service.s3_service.list_all_object_versions.return_value = ( + fake_versions, + fake_delete_markers, + ) + service.s3_service.get_object_tags_versioned.return_value = [ + {"Key": "autodelete", "Value": "true"} + ] + service.csv_generator.generate_s3_inventory_csv.return_value = "csv-data" + + service.process_s3_content() + + assert service.s3_service.upload_file_obj.call_count == 2 From 1974a3bcea4559b3191d83410a0159fdad20c162 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Tue, 10 Feb 2026 15:09:46 +0000 Subject: [PATCH 03/43] [PRMP-939] updated name --- .github/workflows/base-lambdas-reusable-deploy-all.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/base-lambdas-reusable-deploy-all.yml b/.github/workflows/base-lambdas-reusable-deploy-all.yml index 3b6d16fadf..7ae4922e09 100644 --- a/.github/workflows/base-lambdas-reusable-deploy-all.yml +++ b/.github/workflows/base-lambdas-reusable-deploy-all.yml @@ -848,7 +848,7 @@ jobs: build_branch: ${{ inputs.build_branch }} sandbox: ${{ inputs.sandbox }} lambda_handler_name: report_s3_content_handler - lambda_aws_name: reportS3ContentLambda + lambda_aws_name: ReportS3Content lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} From d99d87bfbe7fc9e6548c8d4af1225f3934afaf9e Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Tue, 10 Feb 2026 16:43:00 +0000 Subject: [PATCH 04/43] [PRMP-939] adjusted ack max workers --- lambdas/services/reporting/report_s3_content_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 1df6290cf8..00008a6df6 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -16,7 +16,7 @@ def __init__(self): self.statistic_reports_bucket = os.getenv("STATISTICAL_REPORTS_BUCKET") self.s3_service = S3Service() self.csv_generator = CsvReportGenerator() - self.max_objects = 100000 #To avoid prod from melting + self.max_objects = 4500000 #To avoid prod from melting def _fetch_tags(self, bucket, version): tags = self.s3_service.get_object_tags_versioned( From 886fca311f4b3d2e7165f76ed92855940f1b32fa Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Wed, 11 Feb 2026 13:58:19 +0000 Subject: [PATCH 05/43] [PRMP-939] optimizing --- .../services/reporting/report_s3_content_service.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 00008a6df6..a5d01b0eba 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -28,12 +28,16 @@ def _fetch_tags(self, bucket, version): def process_s3_content(self): for bucket in [self.lloyd_george_bucket, self.bulk_staging_store]: logger.info(f"Listing versions for bucket {bucket}") - versions, delete_markers = self.s3_service.list_all_object_versions(bucket) - + # versions, delete_markers = self.s3_service.list_all_object_versions(bucket) + versions = self.s3_service.list_all_objects(bucket) + delete_markers = [] if len(versions) > self.max_objects: logger.warning(f"Limiting versions from {len(versions)} to {self.max_objects}") versions = versions[: self.max_objects] - + # versions = [ + # v for v in versions + # if v["IsLatest"] + # ] logger.info(f"Fetching tags in parallel for {len(versions)} versions") with ThreadPoolExecutor(max_workers=20) as executor: From 5c572992d750071fdb8562ae68b3c4c1373e3b5e Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Thu, 12 Feb 2026 10:51:03 +0000 Subject: [PATCH 06/43] [PRMP-939] trying to create ecs task --- .../base-lambdas-reusable-deploy-all.yml | 14 +++ .github/workflows/full-deploy-to-pre-prod.yml | 11 +++ .github/workflows/full-deploy-to-prod.yml | 10 +++ .github/workflows/lambdas-dev-to-main-ci.yml | 17 ++++ .github/workflows/s3-base-data-collection.yml | 90 +++++++++++++++++++ .../s3-data-collection-deploy-to-sandbox.yml | 58 ++++++++++++ lambdas/ecs/s3_data_collection/Dockerfile | 15 ++++ lambdas/handlers/report_s3_content_handler.py | 13 +++ .../reporting/report_s3_content_service.py | 4 +- 9 files changed, 230 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/s3-base-data-collection.yml create mode 100644 .github/workflows/s3-data-collection-deploy-to-sandbox.yml create mode 100644 lambdas/ecs/s3_data_collection/Dockerfile diff --git a/.github/workflows/base-lambdas-reusable-deploy-all.yml b/.github/workflows/base-lambdas-reusable-deploy-all.yml index 7ae4922e09..59c0b3d383 100644 --- a/.github/workflows/base-lambdas-reusable-deploy-all.yml +++ b/.github/workflows/base-lambdas-reusable-deploy-all.yml @@ -434,6 +434,20 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + deploy_s3_data_collection_lambda: + name: Deploy S3 data collection lambda + uses: ./.github/workflows/base-lambdas-reusable-deploy.yml + with: + environment: ${{ inputs.environment}} + python_version: ${{ inputs.python_version }} + build_branch: ${{ inputs.build_branch}} + sandbox: ${{ inputs.sandbox }} + lambda_handler_name: data_collection_handler + lambda_aws_name: ReportS3Content + lambda_layer_names: "core_lambda_layer,data_lambda_layer" + secrets: + AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + deploy_statistical_report_lambda: name: Deploy statistical report lambda uses: ./.github/workflows/base-lambdas-reusable-deploy.yml diff --git a/.github/workflows/full-deploy-to-pre-prod.yml b/.github/workflows/full-deploy-to-pre-prod.yml index de251f2c25..d121c2be97 100644 --- a/.github/workflows/full-deploy-to-pre-prod.yml +++ b/.github/workflows/full-deploy-to-pre-prod.yml @@ -136,6 +136,17 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + deploy_s3_data_collection: + name: Deploy S3 Data Collection + needs: [ "tag_and_release" ] + uses: ./.github/workflows/s3-base-data-collection.yml + with: + build_branch: ${{ needs.tag_and_release.outputs.version }} + environment: pre-prod + sandbox: pre-prod + secrets: + AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + run_fhir_api_e2e_tests: name: Run FHIR API E2E Tests needs: ["deploy_all_lambdas"] diff --git a/.github/workflows/full-deploy-to-prod.yml b/.github/workflows/full-deploy-to-prod.yml index b9dae923ee..f2a43132e6 100644 --- a/.github/workflows/full-deploy-to-prod.yml +++ b/.github/workflows/full-deploy-to-prod.yml @@ -75,3 +75,13 @@ jobs: sandbox: prod secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + + deploy_s3_data_collection: + name: Deploy S3 Data Collection + uses: ./.github/workflows/s3_base-data-collection.yml + with: + build_branch: ${{ inputs.tag_version }} + environment: prod + sandbox: prod + secrets: + AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} diff --git a/.github/workflows/lambdas-dev-to-main-ci.yml b/.github/workflows/lambdas-dev-to-main-ci.yml index f67055b175..f5b38a651e 100644 --- a/.github/workflows/lambdas-dev-to-main-ci.yml +++ b/.github/workflows/lambdas-dev-to-main-ci.yml @@ -80,6 +80,18 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + deploy_s3_data_collection: + name: Deploy S3 Data Collection + needs: [ "run_tests" ] + uses: ./.github/workflows/s3-base-data-collection.yml + if: github.ref == 'refs/heads/main' + with: + build_branch: ${{ github.event.pull_request.head.ref }} + environment: development + sandbox: ndr-dev + secrets: + AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + notify-slack: name: Notify Slack on Failure runs-on: ubuntu-latest @@ -91,6 +103,7 @@ jobs: publish_all_lambda_layers, deploy_all_lambdas, deploy_data_collection, + deploy_s3_data_collection, ] if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' steps: @@ -160,6 +173,10 @@ jobs: { "type": "mrkdwn", "text": "*deploy_data_collection:* ${{ needs.deploy_data_collection.result == 'success' && ':white_check_mark:' || ':x:' }}" + }, + { + "type": "mrkdwn", + "text": "*deploy_s3_data_collection:* ${{ needs.deploy_s3_data_collection.result == 'success' && ':white_check_mark:' || ':x:' }}" } ] }, diff --git a/.github/workflows/s3-base-data-collection.yml b/.github/workflows/s3-base-data-collection.yml new file mode 100644 index 0000000000..d089900472 --- /dev/null +++ b/.github/workflows/s3-base-data-collection.yml @@ -0,0 +1,90 @@ +name: "Z-BASE Deploy S3 Data Collection: Build data collection image" + +run-name: "${{ github.event.inputs.build_branch }} | ${{ github.event.inputs.environment }} | ${{ github.event.inputs.sandbox }}" + +on: + workflow_call: + inputs: + build_branch: + required: true + type: string + environment: + required: true + type: string + sandbox: + required: true + type: string + secrets: + AWS_ASSUME_ROLE: + required: true + +permissions: + pull-requests: write + id-token: write # This is required for requesting the JWT + contents: read # This is required for actions/checkout + +jobs: + s3_data_collection_build_docker_image: + runs-on: ubuntu-latest + environment: ${{ inputs.environment }} + defaults: + run: + working-directory: lambdas + + steps: + - uses: actions/checkout@v6 + with: + repository: "NHSDigital/national-document-repository" + ref: ${{ inputs.build_branch }} + fetch-depth: "0" + + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v5 + with: + role-to-assume: ${{ secrets.AWS_ASSUME_ROLE }} + role-skip-session-tagging: true + aws-region: ${{ vars.AWS_REGION }} + mask-aws-account-id: true + + - name: Login to Amazon ECR + id: login-ecr + uses: aws-actions/amazon-ecr-login@v2 + + - name: Build, tag, and push image to Amazon ECR + id: build-image + env: + ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} + ECR_REPOSITORY: ${{ inputs.sandbox }}-s3-data-collection + IMAGE_TAG: latest + IMAGE_TAG_SHA: ${{ github.sha }} + run: | + docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA -f ecs/s3_data_collection/Dockerfile . + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA + echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" >> $GITHUB_OUTPUT + + # Looks like the ECS does not check for image updates, as such we need to force a new task definition to run the new image + # We will always use the "latest" image tag so we do not need to modify the task-definition + - name: Download task definition + id: download-task + run: | + aws ecs describe-task-definition --task-definition ${{ inputs.sandbox }}-task-s3-data-collection --query taskDefinition > task-definition.json + echo "revision=$(cat task-definition.json | jq .revision)" >> $GITHUB_OUTPUT + + - name: Fill in the new image ID in the Amazon ECS task definition + id: task-def + uses: aws-actions/amazon-ecs-render-task-definition@v1 + with: + task-definition: task-definition.json + container-name: ${{ inputs.sandbox }}-container-s3-data-collection + image: ${{ steps.build-image.outputs.image }} + + - name: Register new ECS task definition revision + run: | + aws ecs register-task-definition --cli-input-json file://task-definition.json + + + - name: De-register previous revision + run: | + aws ecs deregister-task-definition \ + --task-definition ${{ inputs.sandbox }}-task-s3-data-collection:${{ steps.download-task.outputs.revision }} diff --git a/.github/workflows/s3-data-collection-deploy-to-sandbox.yml b/.github/workflows/s3-data-collection-deploy-to-sandbox.yml new file mode 100644 index 0000000000..20693494a4 --- /dev/null +++ b/.github/workflows/s3-data-collection-deploy-to-sandbox.yml @@ -0,0 +1,58 @@ +name: "SANDBOX S3 Data Collection - Publish Data Collection Image to ECR" + +run-name: "${{ github.event.inputs.build_branch }} | ${{ github.event.inputs.sandbox }} | ${{ github.event.inputs.environment }}" + +on: + workflow_dispatch: + inputs: + build_branch: + description: "Feature branch to push." + required: true + type: string + default: "main" + sandbox: + description: "Which Sandbox to push to." + required: true + type: string + default: "ndr" + environment: + description: "Which Environment settings to use." + required: true + type: string + default: "development" + workflow_call: + inputs: + build_branch: + description: "Feature branch to push." + required: true + type: string + default: "main" + sandbox: + description: "Which Sandbox to push to." + required: true + type: string + default: "ndr" + environment: + description: "Which Environment settings to use." + required: true + type: string + default: "development" + secrets: + AWS_ASSUME_ROLE: + required: true + +permissions: + pull-requests: write + id-token: write # This is required for requesting the JWT + contents: read # This is required for actions/checkout + +jobs: + push_image: + name: Push Image + uses: ./.github/workflows/s3-base-data-collection.yml + with: + build_branch: ${{ inputs.build_branch }} + environment: ${{ inputs.environment }} + sandbox: ${{ inputs.sandbox }} + secrets: + AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} diff --git a/lambdas/ecs/s3_data_collection/Dockerfile b/lambdas/ecs/s3_data_collection/Dockerfile new file mode 100644 index 0000000000..81417fa22d --- /dev/null +++ b/lambdas/ecs/s3_data_collection/Dockerfile @@ -0,0 +1,15 @@ +FROM python:3.11 + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 +ENV PYTHONPATH=/lambdas + +WORKDIR /lambdas +COPY ../../requirements /lambdas/requirements + +RUN pip install -r requirements/layers/requirements_core_lambda_layer.txt +RUN pip install -r requirements/layers/requirements_data_lambda_layer.txt + +COPY ../../ /lambdas + +ENTRYPOINT ["python", "-m", "handlers.report_s3_content_handler"] diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py index 70de3ffbc9..74077f7a75 100644 --- a/lambdas/handlers/report_s3_content_handler.py +++ b/lambdas/handlers/report_s3_content_handler.py @@ -20,3 +20,16 @@ def lambda_handler(event, context): service.process_s3_content( ) + + + +class _EcsContext: + aws_request_id = "ecs-run" + function_name = "ReportS3ContentEcsTask" + invoked_function_arn = "ecs://ReportS3ContentEcsTask" + log_group_name = "ecs" + log_stream_name = "ecs" + + +if __name__ == "__main__": + lambda_handler({}, _EcsContext()) diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index a5d01b0eba..241b23b011 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -28,8 +28,8 @@ def _fetch_tags(self, bucket, version): def process_s3_content(self): for bucket in [self.lloyd_george_bucket, self.bulk_staging_store]: logger.info(f"Listing versions for bucket {bucket}") - # versions, delete_markers = self.s3_service.list_all_object_versions(bucket) - versions = self.s3_service.list_all_objects(bucket) + versions, delete_markers = self.s3_service.list_all_object_versions(bucket) + # versions = self.s3_service.list_all_objects(bucket) delete_markers = [] if len(versions) > self.max_objects: logger.warning(f"Limiting versions from {len(versions)} to {self.max_objects}") From 362e398afc6de6f474a41219ffa1a5a50c76fa4b Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Thu, 12 Feb 2026 12:55:07 +0000 Subject: [PATCH 07/43] [PRMP-939] Removed Deployment of lambda since it is an ecs task now --- .../base-lambdas-reusable-deploy-all.yml | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/base-lambdas-reusable-deploy-all.yml b/.github/workflows/base-lambdas-reusable-deploy-all.yml index 59c0b3d383..c2ec863b83 100644 --- a/.github/workflows/base-lambdas-reusable-deploy-all.yml +++ b/.github/workflows/base-lambdas-reusable-deploy-all.yml @@ -853,16 +853,16 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - deploy_report_s3_content_lambda: - name: Deploy Report S3 Content Lambda - uses: ./.github/workflows/base-lambdas-reusable-deploy.yml - with: - environment: ${{ inputs.environment }} - python_version: ${{ inputs.python_version }} - build_branch: ${{ inputs.build_branch }} - sandbox: ${{ inputs.sandbox }} - lambda_handler_name: report_s3_content_handler - lambda_aws_name: ReportS3Content - lambda_layer_names: "core_lambda_layer" - secrets: - AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} +# deploy_report_s3_content_lambda: +# name: Deploy Report S3 Content Lambda +# uses: ./.github/workflows/base-lambdas-reusable-deploy.yml +# with: +# environment: ${{ inputs.environment }} +# python_version: ${{ inputs.python_version }} +# build_branch: ${{ inputs.build_branch }} +# sandbox: ${{ inputs.sandbox }} +# lambda_handler_name: report_s3_content_handler +# lambda_aws_name: ReportS3Content +# lambda_layer_names: "core_lambda_layer" +# secrets: +# AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} From 484c6ef5b1f1d6efe8ed66ac2c47b3085d8b7706 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Thu, 12 Feb 2026 14:15:56 +0000 Subject: [PATCH 08/43] [PRMP-939] updated ecs task docker file --- .github/workflows/s3-base-data-collection.yml | 52 ++++++++++++++----- lambdas/ecs/s3_data_collection/Dockerfile | 4 +- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/.github/workflows/s3-base-data-collection.yml b/.github/workflows/s3-base-data-collection.yml index d089900472..80b6c4c3d9 100644 --- a/.github/workflows/s3-base-data-collection.yml +++ b/.github/workflows/s3-base-data-collection.yml @@ -20,8 +20,8 @@ on: permissions: pull-requests: write - id-token: write # This is required for requesting the JWT - contents: read # This is required for actions/checkout + id-token: write + contents: read jobs: s3_data_collection_build_docker_image: @@ -58,33 +58,61 @@ jobs: IMAGE_TAG: latest IMAGE_TAG_SHA: ${{ github.sha }} run: | - docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA -f ecs/s3_data_collection/Dockerfile . + set -euo pipefail + + docker build \ + -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG \ + -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA \ + -f ecs/s3_data_collection/Dockerfile \ + . + docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" >> $GITHUB_OUTPUT - # Looks like the ECS does not check for image updates, as such we need to force a new task definition to run the new image - # We will always use the "latest" image tag so we do not need to modify the task-definition - - name: Download task definition + - name: Download current task definition (raw) id: download-task run: | - aws ecs describe-task-definition --task-definition ${{ inputs.sandbox }}-task-s3-data-collection --query taskDefinition > task-definition.json - echo "revision=$(cat task-definition.json | jq .revision)" >> $GITHUB_OUTPUT + set -euo pipefail + + aws ecs describe-task-definition \ + --task-definition ${{ inputs.sandbox }}-task-s3-data-collection \ + --query taskDefinition \ + > task-definition-raw.json + + echo "revision=$(jq -r .revision task-definition-raw.json)" >> $GITHUB_OUTPUT - - name: Fill in the new image ID in the Amazon ECS task definition + - name: Render task definition with new image id: task-def uses: aws-actions/amazon-ecs-render-task-definition@v1 with: - task-definition: task-definition.json + task-definition: task-definition-raw.json container-name: ${{ inputs.sandbox }}-container-s3-data-collection image: ${{ steps.build-image.outputs.image }} + - name: Sanitize task definition JSON for registration + run: | + set -euo pipefail + + jq 'del( + .taskDefinitionArn, + .revision, + .status, + .requiresAttributes, + .compatibilities, + .registeredAt, + .registeredBy + )' \ + "${{ steps.task-def.outputs.task-definition }}" \ + > task-definition.json + - name: Register new ECS task definition revision run: | + set -euo pipefail aws ecs register-task-definition --cli-input-json file://task-definition.json - - - name: De-register previous revision + - name: De-register previous revision (optional) run: | + set -euo pipefail aws ecs deregister-task-definition \ --task-definition ${{ inputs.sandbox }}-task-s3-data-collection:${{ steps.download-task.outputs.revision }} diff --git a/lambdas/ecs/s3_data_collection/Dockerfile b/lambdas/ecs/s3_data_collection/Dockerfile index 81417fa22d..29cf7891ee 100644 --- a/lambdas/ecs/s3_data_collection/Dockerfile +++ b/lambdas/ecs/s3_data_collection/Dockerfile @@ -5,11 +5,11 @@ ENV PYTHONUNBUFFERED=1 ENV PYTHONPATH=/lambdas WORKDIR /lambdas -COPY ../../requirements /lambdas/requirements +COPY requirements /lambdas/requirements RUN pip install -r requirements/layers/requirements_core_lambda_layer.txt RUN pip install -r requirements/layers/requirements_data_lambda_layer.txt -COPY ../../ /lambdas +COPY . /lambdas ENTRYPOINT ["python", "-m", "handlers.report_s3_content_handler"] From 10fb3be0af844f587e17b7b8a53367c03f597b17 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Thu, 12 Feb 2026 14:39:45 +0000 Subject: [PATCH 09/43] [PRMP-939] testing --- .github/workflows/s3-base-data-collection.yml | 61 ++++++++++++++++--- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/.github/workflows/s3-base-data-collection.yml b/.github/workflows/s3-base-data-collection.yml index 80b6c4c3d9..f46f7f2047 100644 --- a/.github/workflows/s3-base-data-collection.yml +++ b/.github/workflows/s3-base-data-collection.yml @@ -53,6 +53,7 @@ jobs: - name: Build, tag, and push image to Amazon ECR id: build-image env: + AWS_REGION: ${{ vars.AWS_REGION }} ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} ECR_REPOSITORY: ${{ inputs.sandbox }}-s3-data-collection IMAGE_TAG: latest @@ -60,27 +61,58 @@ jobs: run: | set -euo pipefail + echo "AWS_REGION=$AWS_REGION" + echo "ECR_REGISTRY=$ECR_REGISTRY" + echo "ECR_REPOSITORY=$ECR_REPOSITORY" + echo "Tags: $IMAGE_TAG and $IMAGE_TAG_SHA" + echo "Dockerfile: ecs/s3_data_collection/Dockerfile" + echo "Build context: $(pwd)" + + # Build (context is lambdas/) docker build \ - -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG \ - -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA \ + -t "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" \ + -t "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" \ -f ecs/s3_data_collection/Dockerfile \ . - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG - docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA + # Push both tags + docker push "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" + docker push "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" + + # Output the immutable tag for task definition update echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" >> $GITHUB_OUTPUT + - name: Verify image exists in ECR (debug) + env: + AWS_REGION: ${{ vars.AWS_REGION }} + REPO: ${{ inputs.sandbox }}-s3-data-collection + run: | + set -euo pipefail + echo "Checking ECR images for repo: $REPO in region: $AWS_REGION" + aws ecr describe-images \ + --region "$AWS_REGION" \ + --repository-name "$REPO" \ + --query "imageDetails[].{tags:imageTags,pushedAt:imagePushedAt,digest:imageDigest}" \ + --output table + - name: Download current task definition (raw) id: download-task + env: + AWS_REGION: ${{ vars.AWS_REGION }} run: | set -euo pipefail aws ecs describe-task-definition \ - --task-definition ${{ inputs.sandbox }}-task-s3-data-collection \ + --region "$AWS_REGION" \ + --task-definition "${{ inputs.sandbox }}-task-s3-data-collection" \ --query taskDefinition \ > task-definition-raw.json - echo "revision=$(jq -r .revision task-definition-raw.json)" >> $GITHUB_OUTPUT + echo "previous_revision=$(jq -r .revision task-definition-raw.json)" >> $GITHUB_OUTPUT + echo "family=$(jq -r .family task-definition-raw.json)" >> $GITHUB_OUTPUT + + echo "Downloaded task definition:" + jq '{family,revision,executionRoleArn,taskRoleArn,containerDefinitions:[.containerDefinitions[]|{name,image}]}' task-definition-raw.json - name: Render task definition with new image id: task-def @@ -90,10 +122,11 @@ jobs: container-name: ${{ inputs.sandbox }}-container-s3-data-collection image: ${{ steps.build-image.outputs.image }} - - name: Sanitize task definition JSON for registration + - name: Sanitize rendered task definition JSON run: | set -euo pipefail + # The render action outputs a file path; sanitize that file for register-task-definition jq 'del( .taskDefinitionArn, .revision, @@ -106,13 +139,23 @@ jobs: "${{ steps.task-def.outputs.task-definition }}" \ > task-definition.json + echo "Sanitized task definition (family + container image):" + jq '{family,executionRoleArn,taskRoleArn,containerDefinitions:[.containerDefinitions[]|{name,image,command,entryPoint}]}' task-definition.json + - name: Register new ECS task definition revision + env: + AWS_REGION: ${{ vars.AWS_REGION }} run: | set -euo pipefail - aws ecs register-task-definition --cli-input-json file://task-definition.json + aws ecs register-task-definition \ + --region "$AWS_REGION" \ + --cli-input-json file://task-definition.json - name: De-register previous revision (optional) + env: + AWS_REGION: ${{ vars.AWS_REGION }} run: | set -euo pipefail aws ecs deregister-task-definition \ - --task-definition ${{ inputs.sandbox }}-task-s3-data-collection:${{ steps.download-task.outputs.revision }} + --region "$AWS_REGION" \ + --task-definition "${{ inputs.sandbox }}-task-s3-data-collection:${{ steps.download-task.outputs.previous_revision }}" From d8830c0a8a00831e4a8574fa679fd5986cf37b60 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Thu, 12 Feb 2026 14:49:23 +0000 Subject: [PATCH 10/43] [PRMP-939] testing --- .github/workflows/full-deploy-to-sandbox.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/full-deploy-to-sandbox.yml b/.github/workflows/full-deploy-to-sandbox.yml index bf5621cf20..c4311253d1 100644 --- a/.github/workflows/full-deploy-to-sandbox.yml +++ b/.github/workflows/full-deploy-to-sandbox.yml @@ -166,6 +166,17 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + deploy_s3_data_collection: + name: Deploy S3 Data Collection + uses: ./.github/workflows/s3-base-data-collection.yml + needs: ["deploy_all_lambdas"] + with: + build_branch: ${{ inputs.build_branch }} + environment: ${{ inputs.environment }} + sandbox: ${{ inputs.sandbox }} + secrets: + AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + bulk_upload: name: "Run Bulk Upload" if: ${{ inputs.bulk_upload }} From 16e2518a6f6f012dd2141dd9c583b788f7bb9839 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Thu, 12 Feb 2026 14:57:12 +0000 Subject: [PATCH 11/43] [PRMP-939] testing --- .github/workflows/s3-base-data-collection.yml | 59 +++---------------- 1 file changed, 7 insertions(+), 52 deletions(-) diff --git a/.github/workflows/s3-base-data-collection.yml b/.github/workflows/s3-base-data-collection.yml index f46f7f2047..b60eea399c 100644 --- a/.github/workflows/s3-base-data-collection.yml +++ b/.github/workflows/s3-base-data-collection.yml @@ -1,7 +1,5 @@ name: "Z-BASE Deploy S3 Data Collection: Build data collection image" -run-name: "${{ github.event.inputs.build_branch }} | ${{ github.event.inputs.environment }} | ${{ github.event.inputs.sandbox }}" - on: workflow_call: inputs: @@ -53,7 +51,6 @@ jobs: - name: Build, tag, and push image to Amazon ECR id: build-image env: - AWS_REGION: ${{ vars.AWS_REGION }} ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} ECR_REPOSITORY: ${{ inputs.sandbox }}-s3-data-collection IMAGE_TAG: latest @@ -61,72 +58,41 @@ jobs: run: | set -euo pipefail - echo "AWS_REGION=$AWS_REGION" - echo "ECR_REGISTRY=$ECR_REGISTRY" - echo "ECR_REPOSITORY=$ECR_REPOSITORY" - echo "Tags: $IMAGE_TAG and $IMAGE_TAG_SHA" - echo "Dockerfile: ecs/s3_data_collection/Dockerfile" - echo "Build context: $(pwd)" - - # Build (context is lambdas/) docker build \ -t "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" \ -t "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" \ -f ecs/s3_data_collection/Dockerfile \ . - # Push both tags docker push "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" docker push "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" - # Output the immutable tag for task definition update echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" >> $GITHUB_OUTPUT - - name: Verify image exists in ECR (debug) - env: - AWS_REGION: ${{ vars.AWS_REGION }} - REPO: ${{ inputs.sandbox }}-s3-data-collection - run: | - set -euo pipefail - echo "Checking ECR images for repo: $REPO in region: $AWS_REGION" - aws ecr describe-images \ - --region "$AWS_REGION" \ - --repository-name "$REPO" \ - --query "imageDetails[].{tags:imageTags,pushedAt:imagePushedAt,digest:imageDigest}" \ - --output table - - - name: Download current task definition (raw) + - name: Download current task definition id: download-task - env: - AWS_REGION: ${{ vars.AWS_REGION }} run: | set -euo pipefail aws ecs describe-task-definition \ - --region "$AWS_REGION" \ - --task-definition "${{ inputs.sandbox }}-task-s3-data-collection" \ + --task-definition ${{ inputs.sandbox }}-task-s3-data-collection \ --query taskDefinition \ > task-definition-raw.json - echo "previous_revision=$(jq -r .revision task-definition-raw.json)" >> $GITHUB_OUTPUT - echo "family=$(jq -r .family task-definition-raw.json)" >> $GITHUB_OUTPUT - - echo "Downloaded task definition:" - jq '{family,revision,executionRoleArn,taskRoleArn,containerDefinitions:[.containerDefinitions[]|{name,image}]}' task-definition-raw.json + echo "revision=$(jq -r .revision task-definition-raw.json)" >> $GITHUB_OUTPUT - name: Render task definition with new image id: task-def uses: aws-actions/amazon-ecs-render-task-definition@v1 with: - task-definition: task-definition-raw.json + task-definition: lambdas/task-definition-raw.json container-name: ${{ inputs.sandbox }}-container-s3-data-collection image: ${{ steps.build-image.outputs.image }} - - name: Sanitize rendered task definition JSON + - name: Sanitize task definition JSON run: | set -euo pipefail - # The render action outputs a file path; sanitize that file for register-task-definition jq 'del( .taskDefinitionArn, .revision, @@ -139,23 +105,12 @@ jobs: "${{ steps.task-def.outputs.task-definition }}" \ > task-definition.json - echo "Sanitized task definition (family + container image):" - jq '{family,executionRoleArn,taskRoleArn,containerDefinitions:[.containerDefinitions[]|{name,image,command,entryPoint}]}' task-definition.json - - name: Register new ECS task definition revision - env: - AWS_REGION: ${{ vars.AWS_REGION }} run: | - set -euo pipefail aws ecs register-task-definition \ - --region "$AWS_REGION" \ --cli-input-json file://task-definition.json - - name: De-register previous revision (optional) - env: - AWS_REGION: ${{ vars.AWS_REGION }} + - name: Deregister previous revision run: | - set -euo pipefail aws ecs deregister-task-definition \ - --region "$AWS_REGION" \ - --task-definition "${{ inputs.sandbox }}-task-s3-data-collection:${{ steps.download-task.outputs.previous_revision }}" + --task-definition ${{ inputs.sandbox }}-task-s3-data-collection:${{ steps.download-task.outputs.revision }} From 66a3cdb5b23f0fec9ceed533d9fce732aeceb828 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Thu, 12 Feb 2026 15:09:12 +0000 Subject: [PATCH 12/43] [PRMP-939] testing --- .github/workflows/s3-base-data-collection.yml | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/s3-base-data-collection.yml b/.github/workflows/s3-base-data-collection.yml index b60eea399c..9209416501 100644 --- a/.github/workflows/s3-base-data-collection.yml +++ b/.github/workflows/s3-base-data-collection.yml @@ -1,5 +1,7 @@ name: "Z-BASE Deploy S3 Data Collection: Build data collection image" +run-name: "${{ github.event.inputs.build_branch }} | ${{ github.event.inputs.environment }} | ${{ github.event.inputs.sandbox }}" + on: workflow_call: inputs: @@ -67,29 +69,29 @@ jobs: docker push "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" docker push "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" - echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" >> $GITHUB_OUTPUT + echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" >> "$GITHUB_OUTPUT" - - name: Download current task definition + - name: Download current task definition (raw) id: download-task run: | set -euo pipefail aws ecs describe-task-definition \ - --task-definition ${{ inputs.sandbox }}-task-s3-data-collection \ + --task-definition "${{ inputs.sandbox }}-task-s3-data-collection" \ --query taskDefinition \ > task-definition-raw.json - echo "revision=$(jq -r .revision task-definition-raw.json)" >> $GITHUB_OUTPUT + echo "revision=$(jq -r .revision task-definition-raw.json)" >> "$GITHUB_OUTPUT" - name: Render task definition with new image id: task-def uses: aws-actions/amazon-ecs-render-task-definition@v1 with: - task-definition: lambdas/task-definition-raw.json + task-definition: ./lambdas/task-definition-raw.json container-name: ${{ inputs.sandbox }}-container-s3-data-collection image: ${{ steps.build-image.outputs.image }} - - name: Sanitize task definition JSON + - name: Sanitize task definition JSON for registration run: | set -euo pipefail @@ -107,10 +109,11 @@ jobs: - name: Register new ECS task definition revision run: | - aws ecs register-task-definition \ - --cli-input-json file://task-definition.json + set -euo pipefail + aws ecs register-task-definition --cli-input-json file://task-definition.json - - name: Deregister previous revision + - name: De-register previous revision run: | + set -euo pipefail aws ecs deregister-task-definition \ - --task-definition ${{ inputs.sandbox }}-task-s3-data-collection:${{ steps.download-task.outputs.revision }} + --task-definition "${{ inputs.sandbox }}-task-s3-data-collection:${{ steps.download-task.outputs.revision }}" From d4c6d0ab4e24819dfa1008740dd7f3d3e1f4fe42 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Thu, 12 Feb 2026 15:10:45 +0000 Subject: [PATCH 13/43] [PRMP-939] testing --- .github/workflows/full-deploy-to-sandbox.yml | 4 +- .../reporting/report_s3_content_service.py | 274 +++++++++++++++--- 2 files changed, 233 insertions(+), 45 deletions(-) diff --git a/.github/workflows/full-deploy-to-sandbox.yml b/.github/workflows/full-deploy-to-sandbox.yml index c4311253d1..16e15bd9cb 100644 --- a/.github/workflows/full-deploy-to-sandbox.yml +++ b/.github/workflows/full-deploy-to-sandbox.yml @@ -167,13 +167,13 @@ jobs: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} deploy_s3_data_collection: - name: Deploy S3 Data Collection + name: "Deploy S3 Data Collection (ECS task image)" uses: ./.github/workflows/s3-base-data-collection.yml needs: ["deploy_all_lambdas"] with: build_branch: ${{ inputs.build_branch }} - environment: ${{ inputs.environment }} sandbox: ${{ inputs.sandbox }} + environment: ${{ inputs.environment }} secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 241b23b011..57482ea4ee 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -1,62 +1,250 @@ +import gzip +import io +import json import os -from concurrent.futures import ThreadPoolExecutor, as_completed -from io import BytesIO +from typing import Iterable, Optional from services.base.s3_service import S3Service -from services.reporting.csv_report_generator_service import CsvReportGenerator from utils.audit_logging_setup import LoggingService logger = LoggingService(__name__) class ReportS3ContentService: + """ + Reads S3 Inventory outputs (manifest + shard files) from the STATISTICAL_REPORTS_BUCKET, + then merges shards into ONE CSV per bucket. + + Inventory input location (within STATISTICAL_REPORTS_BUCKET): + unrefined-reports/s3-inventory//.../manifest.json + unrefined-reports/s3-inventory//.../ + + Output (within STATISTICAL_REPORTS_BUCKET): + unrefined-reports/s3-content-report/-inventory.csv + """ + + INVENTORY_BASE_PREFIX = "unrefined-reports/s3-inventory/" + OUTPUT_PREFIX = "unrefined-reports/s3-content-report/" + + # Multipart upload tuning + MULTIPART_MIN_PART_SIZE = 8 * 1024 * 1024 # 8MB (>= 5MB required by S3) + READ_CHUNK_SIZE = 1024 * 1024 # 1MB (not used directly but kept for tuning) + def __init__(self): + self.statistical_reports_bucket = os.environ["STATISTICAL_REPORTS_BUCKET"] self.lloyd_george_bucket = os.getenv("LLOYD_GEORGE_BUCKET_NAME") self.bulk_staging_store = os.getenv("BULK_STAGING_BUCKET_NAME") - self.statistic_reports_bucket = os.getenv("STATISTICAL_REPORTS_BUCKET") self.s3_service = S3Service() - self.csv_generator = CsvReportGenerator() - self.max_objects = 4500000 #To avoid prod from melting - - def _fetch_tags(self, bucket, version): - tags = self.s3_service.get_object_tags_versioned( - bucket, version["Key"], version["VersionId"] - ) - version["Tags"] = tags - return version def process_s3_content(self): - for bucket in [self.lloyd_george_bucket, self.bulk_staging_store]: - logger.info(f"Listing versions for bucket {bucket}") - versions, delete_markers = self.s3_service.list_all_object_versions(bucket) - # versions = self.s3_service.list_all_objects(bucket) - delete_markers = [] - if len(versions) > self.max_objects: - logger.warning(f"Limiting versions from {len(versions)} to {self.max_objects}") - versions = versions[: self.max_objects] - # versions = [ - # v for v in versions - # if v["IsLatest"] - # ] - logger.info(f"Fetching tags in parallel for {len(versions)} versions") - - with ThreadPoolExecutor(max_workers=20) as executor: - futures = [ - executor.submit(self._fetch_tags, bucket, v) for v in versions - ] - for _ in as_completed(futures): - pass - - logger.info(f"Generating CSV for bucket {bucket}") - csv_content = self.csv_generator.generate_s3_inventory_csv( - bucket, versions, delete_markers + jobs = [ + self.lloyd_george_bucket, + self.bulk_staging_store, + ] + + for bucket_name in jobs: + if not bucket_name: + logger.warning("Bucket name env var missing; skipping job") + continue + + inventory_prefix = f"{self.INVENTORY_BASE_PREFIX}{bucket_name}/" + output_key = f"{self.OUTPUT_PREFIX}{bucket_name}-inventory.csv" + + logger.info( + f"Processing S3 Inventory merge for bucket_name={bucket_name} " + f"inventory_prefix={inventory_prefix}" + ) + + manifest_key = self._find_latest_manifest_key( + bucket=self.statistical_reports_bucket, + prefix=inventory_prefix, + ) + + if not manifest_key: + logger.warning( + f"No manifest.json found under s3://{self.statistical_reports_bucket}/{inventory_prefix} " + f"for {bucket_name}. Inventory may not have delivered yet." + ) + continue + + manifest = self._read_json( + bucket=self.statistical_reports_bucket, + key=manifest_key, + ) + + shard_keys = self._extract_shard_keys(manifest) + if not shard_keys: + logger.warning(f"Manifest {manifest_key} contained no shard keys for {bucket_name}") + continue + + header_line = self._build_header_from_manifest(manifest) + + logger.info( + f"Merging {len(shard_keys)} shards into s3://{self.statistical_reports_bucket}/{output_key} " + f"(manifest={manifest_key})" + ) + + self._multipart_upload_merged_csv( + source_bucket=self.statistical_reports_bucket, + dest_bucket=self.statistical_reports_bucket, + dest_key=output_key, + shard_keys=shard_keys, + header_line=header_line, + ) + + logger.info(f"Completed merged inventory CSV for {bucket_name}") + + # ------------------------- + # Inventory helpers + # ------------------------- + + def _find_latest_manifest_key(self, *, bucket: str, prefix: str) -> Optional[str]: + """ + Find most recently modified object ending with 'manifest.json' under a prefix. + """ + paginator = self.s3_service.client.get_paginator("list_objects_v2") + latest = None + + for page in paginator.paginate(Bucket=bucket, Prefix=prefix): + for obj in page.get("Contents", []): + key = obj["Key"] + if not key.endswith("manifest.json"): + continue + if latest is None or obj["LastModified"] > latest["LastModified"]: + latest = obj + + return latest["Key"] if latest else None + + def _read_json(self, *, bucket: str, key: str) -> dict: + resp = self.s3_service.client.get_object(Bucket=bucket, Key=key) + body = resp["Body"].read() + return json.loads(body) + + def _extract_shard_keys(self, manifest: dict) -> list[str]: + """ + Typical S3 Inventory manifest: + { + "files": [ + {"key":"unrefined-reports/s3-inventory//.../data/part-00000.csv.gz", ...}, + ... + ], + "fileSchema": "Bucket, Key, VersionId, ..." + } + + We support common variants ("files"/"fileList", "key"/"Key"). + """ + files = manifest.get("files") or manifest.get("fileList") or [] + shard_keys: list[str] = [] + + for f in files: + if isinstance(f, dict): + if "key" in f: + shard_keys.append(f["key"]) + elif "Key" in f: + shard_keys.append(f["Key"]) + + return shard_keys + + def _build_header_from_manifest(self, manifest: dict) -> Optional[str]: + """ + If 'fileSchema' exists, write it as a CSV header row. + This gives you a single file that's self-describing. + """ + schema = manifest.get("fileSchema") + if not schema or not isinstance(schema, str): + return None + schema = schema.strip() + if not schema: + return None + return schema + "\n" + + # ------------------------- + # Stream shard content + # ------------------------- + + def _open_text_stream_for_object(self, *, bucket: str, key: str) -> io.TextIOBase: + """ + Returns a text stream for the object body, transparently handling .gz. + """ + resp = self.s3_service.client.get_object(Bucket=bucket, Key=key) + body = resp["Body"] # StreamingBody + + if key.endswith(".gz"): + gz = gzip.GzipFile(fileobj=body) + return io.TextIOWrapper(gz, encoding="utf-8", newline="") + return io.TextIOWrapper(body, encoding="utf-8", newline="") + + # ------------------------- + # Merge + multipart upload + # ------------------------- + + def _multipart_upload_merged_csv( + self, + *, + source_bucket: str, + dest_bucket: str, + dest_key: str, + shard_keys: Iterable[str], + header_line: Optional[str], + ) -> None: + s3 = self.s3_service.client + + create = s3.create_multipart_upload(Bucket=dest_bucket, Key=dest_key) + upload_id = create["UploadId"] + parts = [] + + part_number = 1 + buf = io.BytesIO() + + def flush_part(): + nonlocal part_number + data = buf.getvalue() + if not data: + return + resp = s3.upload_part( + Bucket=dest_bucket, + Key=dest_key, + UploadId=upload_id, + PartNumber=part_number, + Body=data, ) + parts.append({"ETag": resp["ETag"], "PartNumber": part_number}) + part_number += 1 + buf.seek(0) + buf.truncate(0) + + try: + # Write header once (if we have it) + if header_line: + buf.write(header_line.encode("utf-8")) + if buf.tell() >= self.MULTIPART_MIN_PART_SIZE: + flush_part() + + # Inventory shard files generally do NOT contain a header row, + # so concatenation is correct. + for shard_key in shard_keys: + logger.info(f"Reading inventory shard: s3://{source_bucket}/{shard_key}") + stream = self._open_text_stream_for_object(bucket=source_bucket, key=shard_key) + + for line in stream: + buf.write(line.encode("utf-8")) + if buf.tell() >= self.MULTIPART_MIN_PART_SIZE: + flush_part() + + # Final part + flush_part() - logger.info(f"Uploading report for bucket {bucket}") - self.s3_service.upload_file_obj( - BytesIO(csv_content.encode("utf-8")), - self.statistic_reports_bucket, - f"s3-content-report/{bucket}-inventory.csv", + s3.complete_multipart_upload( + Bucket=dest_bucket, + Key=dest_key, + UploadId=upload_id, + MultipartUpload={"Parts": parts}, ) - logger.info(f"Completed report for {bucket}") + except Exception as e: + logger.error(f"Failed merged upload to s3://{dest_bucket}/{dest_key}: {e}") + try: + s3.abort_multipart_upload(Bucket=dest_bucket, Key=dest_key, UploadId=upload_id) + except Exception: + pass + raise From e509ecb78c7a61279d06ce691c5253965ab19656 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Thu, 12 Feb 2026 15:45:01 +0000 Subject: [PATCH 14/43] [PRMP-939] testing --- .github/workflows/s3-base-data-collection.yml | 4 +- .../reporting/report_s3_content_service.py | 274 +++--------------- 2 files changed, 45 insertions(+), 233 deletions(-) diff --git a/.github/workflows/s3-base-data-collection.yml b/.github/workflows/s3-base-data-collection.yml index 9209416501..4d53e7e1c2 100644 --- a/.github/workflows/s3-base-data-collection.yml +++ b/.github/workflows/s3-base-data-collection.yml @@ -87,7 +87,7 @@ jobs: id: task-def uses: aws-actions/amazon-ecs-render-task-definition@v1 with: - task-definition: ./lambdas/task-definition-raw.json + task-definition: lambdas/task-definition-raw.json container-name: ${{ inputs.sandbox }}-container-s3-data-collection image: ${{ steps.build-image.outputs.image }} @@ -112,7 +112,7 @@ jobs: set -euo pipefail aws ecs register-task-definition --cli-input-json file://task-definition.json - - name: De-register previous revision + - name: De-register previous revision (optional) run: | set -euo pipefail aws ecs deregister-task-definition \ diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 57482ea4ee..8802e27b18 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -1,250 +1,62 @@ -import gzip -import io -import json import os -from typing import Iterable, Optional +from concurrent.futures import ThreadPoolExecutor, as_completed +from io import BytesIO from services.base.s3_service import S3Service +from services.reporting.csv_report_generator_service import CsvReportGenerator from utils.audit_logging_setup import LoggingService logger = LoggingService(__name__) class ReportS3ContentService: - """ - Reads S3 Inventory outputs (manifest + shard files) from the STATISTICAL_REPORTS_BUCKET, - then merges shards into ONE CSV per bucket. - - Inventory input location (within STATISTICAL_REPORTS_BUCKET): - unrefined-reports/s3-inventory//.../manifest.json - unrefined-reports/s3-inventory//.../ - - Output (within STATISTICAL_REPORTS_BUCKET): - unrefined-reports/s3-content-report/-inventory.csv - """ - - INVENTORY_BASE_PREFIX = "unrefined-reports/s3-inventory/" - OUTPUT_PREFIX = "unrefined-reports/s3-content-report/" - - # Multipart upload tuning - MULTIPART_MIN_PART_SIZE = 8 * 1024 * 1024 # 8MB (>= 5MB required by S3) - READ_CHUNK_SIZE = 1024 * 1024 # 1MB (not used directly but kept for tuning) - def __init__(self): - self.statistical_reports_bucket = os.environ["STATISTICAL_REPORTS_BUCKET"] self.lloyd_george_bucket = os.getenv("LLOYD_GEORGE_BUCKET_NAME") self.bulk_staging_store = os.getenv("BULK_STAGING_BUCKET_NAME") + self.statistic_reports_bucket = os.getenv("STATISTICAL_REPORTS_BUCKET") self.s3_service = S3Service() + self.csv_generator = CsvReportGenerator() + self.max_objects = 4500000 #To avoid prod from melting - def process_s3_content(self): - jobs = [ - self.lloyd_george_bucket, - self.bulk_staging_store, - ] - - for bucket_name in jobs: - if not bucket_name: - logger.warning("Bucket name env var missing; skipping job") - continue - - inventory_prefix = f"{self.INVENTORY_BASE_PREFIX}{bucket_name}/" - output_key = f"{self.OUTPUT_PREFIX}{bucket_name}-inventory.csv" - - logger.info( - f"Processing S3 Inventory merge for bucket_name={bucket_name} " - f"inventory_prefix={inventory_prefix}" - ) - - manifest_key = self._find_latest_manifest_key( - bucket=self.statistical_reports_bucket, - prefix=inventory_prefix, - ) - - if not manifest_key: - logger.warning( - f"No manifest.json found under s3://{self.statistical_reports_bucket}/{inventory_prefix} " - f"for {bucket_name}. Inventory may not have delivered yet." - ) - continue - - manifest = self._read_json( - bucket=self.statistical_reports_bucket, - key=manifest_key, - ) - - shard_keys = self._extract_shard_keys(manifest) - if not shard_keys: - logger.warning(f"Manifest {manifest_key} contained no shard keys for {bucket_name}") - continue - - header_line = self._build_header_from_manifest(manifest) - - logger.info( - f"Merging {len(shard_keys)} shards into s3://{self.statistical_reports_bucket}/{output_key} " - f"(manifest={manifest_key})" - ) - - self._multipart_upload_merged_csv( - source_bucket=self.statistical_reports_bucket, - dest_bucket=self.statistical_reports_bucket, - dest_key=output_key, - shard_keys=shard_keys, - header_line=header_line, - ) - - logger.info(f"Completed merged inventory CSV for {bucket_name}") + def _fetch_tags(self, bucket, version): + tags = self.s3_service.get_object_tags_versioned( + bucket, version["Key"], version["VersionId"] + ) + version["Tags"] = tags + return version - # ------------------------- - # Inventory helpers - # ------------------------- - - def _find_latest_manifest_key(self, *, bucket: str, prefix: str) -> Optional[str]: - """ - Find most recently modified object ending with 'manifest.json' under a prefix. - """ - paginator = self.s3_service.client.get_paginator("list_objects_v2") - latest = None - - for page in paginator.paginate(Bucket=bucket, Prefix=prefix): - for obj in page.get("Contents", []): - key = obj["Key"] - if not key.endswith("manifest.json"): - continue - if latest is None or obj["LastModified"] > latest["LastModified"]: - latest = obj - - return latest["Key"] if latest else None - - def _read_json(self, *, bucket: str, key: str) -> dict: - resp = self.s3_service.client.get_object(Bucket=bucket, Key=key) - body = resp["Body"].read() - return json.loads(body) - - def _extract_shard_keys(self, manifest: dict) -> list[str]: - """ - Typical S3 Inventory manifest: - { - "files": [ - {"key":"unrefined-reports/s3-inventory//.../data/part-00000.csv.gz", ...}, - ... - ], - "fileSchema": "Bucket, Key, VersionId, ..." - } - - We support common variants ("files"/"fileList", "key"/"Key"). - """ - files = manifest.get("files") or manifest.get("fileList") or [] - shard_keys: list[str] = [] - - for f in files: - if isinstance(f, dict): - if "key" in f: - shard_keys.append(f["key"]) - elif "Key" in f: - shard_keys.append(f["Key"]) - - return shard_keys - - def _build_header_from_manifest(self, manifest: dict) -> Optional[str]: - """ - If 'fileSchema' exists, write it as a CSV header row. - This gives you a single file that's self-describing. - """ - schema = manifest.get("fileSchema") - if not schema or not isinstance(schema, str): - return None - schema = schema.strip() - if not schema: - return None - return schema + "\n" - - # ------------------------- - # Stream shard content - # ------------------------- - - def _open_text_stream_for_object(self, *, bucket: str, key: str) -> io.TextIOBase: - """ - Returns a text stream for the object body, transparently handling .gz. - """ - resp = self.s3_service.client.get_object(Bucket=bucket, Key=key) - body = resp["Body"] # StreamingBody - - if key.endswith(".gz"): - gz = gzip.GzipFile(fileobj=body) - return io.TextIOWrapper(gz, encoding="utf-8", newline="") - return io.TextIOWrapper(body, encoding="utf-8", newline="") - - # ------------------------- - # Merge + multipart upload - # ------------------------- - - def _multipart_upload_merged_csv( - self, - *, - source_bucket: str, - dest_bucket: str, - dest_key: str, - shard_keys: Iterable[str], - header_line: Optional[str], - ) -> None: - s3 = self.s3_service.client - - create = s3.create_multipart_upload(Bucket=dest_bucket, Key=dest_key) - upload_id = create["UploadId"] - parts = [] - - part_number = 1 - buf = io.BytesIO() - - def flush_part(): - nonlocal part_number - data = buf.getvalue() - if not data: - return - resp = s3.upload_part( - Bucket=dest_bucket, - Key=dest_key, - UploadId=upload_id, - PartNumber=part_number, - Body=data, + def process_s3_content(self): + for bucket in [self.lloyd_george_bucket, self.bulk_staging_store]: + logger.info(f"Listing versions for bucket {bucket}") + versions, delete_markers = self.s3_service.list_all_object_versions(bucket) + # versions = self.s3_service.list_all_objects(bucket) + delete_markers = [] + if len(versions) > self.max_objects: + logger.warning(f"Limiting versions from {len(versions)} to {self.max_objects}") + versions = versions[: self.max_objects] + # versions = [ + # v for v in versions + # if v["IsLatest"] + # ] + logger.info(f"Fetching tags in parallel for {len(versions)} versions") + + with ThreadPoolExecutor(max_workers=20) as executor: + futures = [ + executor.submit(self._fetch_tags, bucket, v) for v in versions + ] + for _ in as_completed(futures): + pass + + logger.info(f"Generating CSV for bucket {bucket}") + csv_content = self.csv_generator.generate_s3_inventory_csv( + bucket, versions, delete_markers ) - parts.append({"ETag": resp["ETag"], "PartNumber": part_number}) - part_number += 1 - buf.seek(0) - buf.truncate(0) - - try: - # Write header once (if we have it) - if header_line: - buf.write(header_line.encode("utf-8")) - if buf.tell() >= self.MULTIPART_MIN_PART_SIZE: - flush_part() - - # Inventory shard files generally do NOT contain a header row, - # so concatenation is correct. - for shard_key in shard_keys: - logger.info(f"Reading inventory shard: s3://{source_bucket}/{shard_key}") - stream = self._open_text_stream_for_object(bucket=source_bucket, key=shard_key) - - for line in stream: - buf.write(line.encode("utf-8")) - if buf.tell() >= self.MULTIPART_MIN_PART_SIZE: - flush_part() - - # Final part - flush_part() - s3.complete_multipart_upload( - Bucket=dest_bucket, - Key=dest_key, - UploadId=upload_id, - MultipartUpload={"Parts": parts}, + logger.info(f"Uploading report for bucket {bucket}") + self.s3_service.upload_file_obj( + BytesIO(csv_content.encode("utf-8")), + self.statistic_reports_bucket, + f"s3-content-report/{bucket}-inventory.csv", ) - except Exception as e: - logger.error(f"Failed merged upload to s3://{dest_bucket}/{dest_key}: {e}") - try: - s3.abort_multipart_upload(Bucket=dest_bucket, Key=dest_key, UploadId=upload_id) - except Exception: - pass - raise + logger.info(f"Completed report for {bucket}") \ No newline at end of file From a194113f9ee84db66f36094522c8c2383330c0f4 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 10:59:33 +0000 Subject: [PATCH 15/43] [PRMP-939] testing --- lambdas/ecs/s3_data_collection/Dockerfile | 2 +- lambdas/ecs/s3_data_collection/__init__.py | 0 lambdas/ecs/s3_data_collection/main.py | 23 +++++++++++++++++++ lambdas/handlers/report_s3_content_handler.py | 20 ++++++++-------- 4 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 lambdas/ecs/s3_data_collection/__init__.py create mode 100644 lambdas/ecs/s3_data_collection/main.py diff --git a/lambdas/ecs/s3_data_collection/Dockerfile b/lambdas/ecs/s3_data_collection/Dockerfile index 29cf7891ee..6c0e5ec097 100644 --- a/lambdas/ecs/s3_data_collection/Dockerfile +++ b/lambdas/ecs/s3_data_collection/Dockerfile @@ -12,4 +12,4 @@ RUN pip install -r requirements/layers/requirements_data_lambda_layer.txt COPY . /lambdas -ENTRYPOINT ["python", "-m", "handlers.report_s3_content_handler"] +ENTRYPOINT ["python", "ecs/s3_data_collection/main.py"] diff --git a/lambdas/ecs/s3_data_collection/__init__.py b/lambdas/ecs/s3_data_collection/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lambdas/ecs/s3_data_collection/main.py b/lambdas/ecs/s3_data_collection/main.py new file mode 100644 index 0000000000..14ae36f82e --- /dev/null +++ b/lambdas/ecs/s3_data_collection/main.py @@ -0,0 +1,23 @@ +import importlib +import logging +import sys + +from services.reporting.report_s3_content_service import ReportS3ContentService + + +def setup_logging_for_local_script(): + importlib.reload(logging) + logging.basicConfig( + level=logging.INFO, + format="[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s", + datefmt="%d/%b/%Y %H:%M:%S", + stream=sys.stdout, + ) + + +if __name__ == "__main__": + setup_logging_for_local_script() + logging.getLogger(__name__).info("Starting Report S3 content ECS task") + + service = ReportS3ContentService() + service.process_s3_content() diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py index 74077f7a75..70eb87dcdc 100644 --- a/lambdas/handlers/report_s3_content_handler.py +++ b/lambdas/handlers/report_s3_content_handler.py @@ -23,13 +23,13 @@ def lambda_handler(event, context): -class _EcsContext: - aws_request_id = "ecs-run" - function_name = "ReportS3ContentEcsTask" - invoked_function_arn = "ecs://ReportS3ContentEcsTask" - log_group_name = "ecs" - log_stream_name = "ecs" - - -if __name__ == "__main__": - lambda_handler({}, _EcsContext()) +# class _EcsContext: +# aws_request_id = "ecs-run" +# function_name = "ReportS3ContentEcsTask" +# invoked_function_arn = "ecs://ReportS3ContentEcsTask" +# log_group_name = "ecs" +# log_stream_name = "ecs" +# +# +# if __name__ == "__main__": +# lambda_handler({}, _EcsContext()) From 6b5098a7122aabe4002dba8a1ac69f3d88b14d7e Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 14:02:49 +0000 Subject: [PATCH 16/43] [PRMP-939] removed deploy of ECS in sandbox --- .github/workflows/full-deploy-to-sandbox.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.github/workflows/full-deploy-to-sandbox.yml b/.github/workflows/full-deploy-to-sandbox.yml index 16e15bd9cb..bf5621cf20 100644 --- a/.github/workflows/full-deploy-to-sandbox.yml +++ b/.github/workflows/full-deploy-to-sandbox.yml @@ -166,17 +166,6 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - deploy_s3_data_collection: - name: "Deploy S3 Data Collection (ECS task image)" - uses: ./.github/workflows/s3-base-data-collection.yml - needs: ["deploy_all_lambdas"] - with: - build_branch: ${{ inputs.build_branch }} - sandbox: ${{ inputs.sandbox }} - environment: ${{ inputs.environment }} - secrets: - AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - bulk_upload: name: "Run Bulk Upload" if: ${{ inputs.bulk_upload }} From 125630bc3c25cf585a9b184964da6a9af01592af Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 14:09:11 +0000 Subject: [PATCH 17/43] [PRMP-939] formated code --- lambdas/handlers/report_s3_content_handler.py | 5 ++--- lambdas/services/base/s3_service.py | 1 - .../reporting/csv_report_generator_service.py | 7 ++++--- .../reporting/report_s3_content_service.py | 16 +++++++++++----- .../handlers/test_report_s3_content_handler.py | 8 +++++--- .../test_csv_report_generator_service.py | 7 +++++-- .../reporting/test_report_s3_content_service.py | 5 ++--- 7 files changed, 29 insertions(+), 20 deletions(-) diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py index 70eb87dcdc..5396df7590 100644 --- a/lambdas/handlers/report_s3_content_handler.py +++ b/lambdas/handlers/report_s3_content_handler.py @@ -7,6 +7,7 @@ logger = LoggingService(__name__) + @ensure_environment_variables(names=["LLOYD_GEORGE_BUCKET_NAME"]) @ensure_environment_variables(names=["BULK_STAGING_BUCKET_NAME"]) @ensure_environment_variables(names=["STATISTICAL_REPORTS_BUCKET"]) @@ -18,9 +19,7 @@ def lambda_handler(event, context): service = ReportS3ContentService() - service.process_s3_content( - ) - + service.process_s3_content() # class _EcsContext: diff --git a/lambdas/services/base/s3_service.py b/lambdas/services/base/s3_service.py index 7f14b22535..7d39123566 100644 --- a/lambdas/services/base/s3_service.py +++ b/lambdas/services/base/s3_service.py @@ -296,4 +296,3 @@ def get_object_tags_versioned(self, bucket: str, key: str, version_id: str | Non return response.get("TagSet", []) except ClientError: return [] - diff --git a/lambdas/services/reporting/csv_report_generator_service.py b/lambdas/services/reporting/csv_report_generator_service.py index 683ede526e..dfb00e6ac4 100644 --- a/lambdas/services/reporting/csv_report_generator_service.py +++ b/lambdas/services/reporting/csv_report_generator_service.py @@ -1,5 +1,6 @@ import csv from io import StringIO + from utils.audit_logging_setup import LoggingService logger = LoggingService(__name__) @@ -24,7 +25,7 @@ def generate_s3_inventory_csv(self, bucket, versions, delete_markers) -> str: "etag", "storage_class", "tags", - ] + ], ) for version in versions: @@ -43,7 +44,7 @@ def generate_s3_inventory_csv(self, bucket, versions, delete_markers) -> str: version.get("ETag"), version.get("StorageClass"), tag_str, - ] + ], ) for marker in delete_markers: @@ -59,7 +60,7 @@ def generate_s3_inventory_csv(self, bucket, versions, delete_markers) -> str: None, None, "", - ] + ], ) logger.info(f"Finished CSV generation for {bucket}") diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 8802e27b18..77aaed82ac 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -16,11 +16,13 @@ def __init__(self): self.statistic_reports_bucket = os.getenv("STATISTICAL_REPORTS_BUCKET") self.s3_service = S3Service() self.csv_generator = CsvReportGenerator() - self.max_objects = 4500000 #To avoid prod from melting + self.max_objects = 4500000 # To avoid prod from melting def _fetch_tags(self, bucket, version): tags = self.s3_service.get_object_tags_versioned( - bucket, version["Key"], version["VersionId"] + bucket, + version["Key"], + version["VersionId"], ) version["Tags"] = tags return version @@ -32,7 +34,9 @@ def process_s3_content(self): # versions = self.s3_service.list_all_objects(bucket) delete_markers = [] if len(versions) > self.max_objects: - logger.warning(f"Limiting versions from {len(versions)} to {self.max_objects}") + logger.warning( + f"Limiting versions from {len(versions)} to {self.max_objects}" + ) versions = versions[: self.max_objects] # versions = [ # v for v in versions @@ -49,7 +53,9 @@ def process_s3_content(self): logger.info(f"Generating CSV for bucket {bucket}") csv_content = self.csv_generator.generate_s3_inventory_csv( - bucket, versions, delete_markers + bucket, + versions, + delete_markers, ) logger.info(f"Uploading report for bucket {bucket}") @@ -59,4 +65,4 @@ def process_s3_content(self): f"s3-content-report/{bucket}-inventory.csv", ) - logger.info(f"Completed report for {bucket}") \ No newline at end of file + logger.info(f"Completed report for {bucket}") diff --git a/lambdas/tests/unit/handlers/test_report_s3_content_handler.py b/lambdas/tests/unit/handlers/test_report_s3_content_handler.py index 75976cb2f4..d431ba0d3e 100644 --- a/lambdas/tests/unit/handlers/test_report_s3_content_handler.py +++ b/lambdas/tests/unit/handlers/test_report_s3_content_handler.py @@ -1,5 +1,7 @@ -import pytest from types import SimpleNamespace + +import pytest + from lambdas.handlers.report_s3_content_handler import lambda_handler @@ -21,7 +23,7 @@ def lambda_context(): def test_lambda_handler_invokes_service(mocker, lambda_context): mock_service_cls = mocker.patch( - "lambdas.handlers.report_s3_content_handler.ReportS3ContentService" + "lambdas.handlers.report_s3_content_handler.ReportS3ContentService", ) mock_service = mock_service_cls.return_value @@ -33,7 +35,7 @@ def test_lambda_handler_invokes_service(mocker, lambda_context): def test_lambda_handler_runs_without_event_data(mocker, lambda_context): mock_service_cls = mocker.patch( - "lambdas.handlers.report_s3_content_handler.ReportS3ContentService" + "lambdas.handlers.report_s3_content_handler.ReportS3ContentService", ) mock_service = mock_service_cls.return_value diff --git a/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py b/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py index fba9fd9cf3..e8f62c3c8e 100644 --- a/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py +++ b/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py @@ -1,4 +1,5 @@ from datetime import datetime, timezone + from services.reporting.csv_report_generator_service import CsvReportGenerator @@ -15,12 +16,14 @@ def test_generate_s3_inventory_csv(): "ETag": "etag1", "StorageClass": "STANDARD", "Tags": [{"Key": "autodelete", "Value": "true"}], - } + }, ] delete_markers = [] - csv_output = generator.generate_s3_inventory_csv("bucket-a", versions, delete_markers) + csv_output = generator.generate_s3_inventory_csv( + "bucket-a", versions, delete_markers + ) assert "bucket-a" in csv_output assert "file1.txt" in csv_output diff --git a/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py b/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py index 5c8c8354f3..c2d5688ebe 100644 --- a/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py +++ b/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py @@ -1,4 +1,3 @@ -from unittest.mock import MagicMock from services.reporting.report_s3_content_service import ReportS3ContentService @@ -16,7 +15,7 @@ def test_process_s3_content(mocker): "VersionId": "v1", "IsLatest": True, "LastModified": mocker.Mock(), - } + }, ] fake_delete_markers = [] @@ -25,7 +24,7 @@ def test_process_s3_content(mocker): fake_delete_markers, ) service.s3_service.get_object_tags_versioned.return_value = [ - {"Key": "autodelete", "Value": "true"} + {"Key": "autodelete", "Value": "true"}, ] service.csv_generator.generate_s3_inventory_csv.return_value = "csv-data" From 030300368ec1df9586d47f5e1793ffd5138de309 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 14:14:51 +0000 Subject: [PATCH 18/43] [PRMP-939] formated code --- lambdas/services/reporting/report_s3_content_service.py | 5 ----- .../services/reporting/test_csv_report_generator_service.py | 4 +++- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 77aaed82ac..61f4afab21 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -31,17 +31,12 @@ def process_s3_content(self): for bucket in [self.lloyd_george_bucket, self.bulk_staging_store]: logger.info(f"Listing versions for bucket {bucket}") versions, delete_markers = self.s3_service.list_all_object_versions(bucket) - # versions = self.s3_service.list_all_objects(bucket) delete_markers = [] if len(versions) > self.max_objects: logger.warning( f"Limiting versions from {len(versions)} to {self.max_objects}" ) versions = versions[: self.max_objects] - # versions = [ - # v for v in versions - # if v["IsLatest"] - # ] logger.info(f"Fetching tags in parallel for {len(versions)} versions") with ThreadPoolExecutor(max_workers=20) as executor: diff --git a/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py b/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py index e8f62c3c8e..2e5034f414 100644 --- a/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py +++ b/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py @@ -22,7 +22,9 @@ def test_generate_s3_inventory_csv(): delete_markers = [] csv_output = generator.generate_s3_inventory_csv( - "bucket-a", versions, delete_markers + "bucket-a", + versions, + delete_markers, ) assert "bucket-a" in csv_output From fb512eeb674419d8137c502a0355ffa1b7f9f8bf Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 14:20:46 +0000 Subject: [PATCH 19/43] [PRMP-939] formated code --- lambdas/handlers/report_s3_content_handler.py | 14 +------------- .../reporting/report_s3_content_service.py | 4 +--- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py index 5396df7590..a690ea9ec9 100644 --- a/lambdas/handlers/report_s3_content_handler.py +++ b/lambdas/handlers/report_s3_content_handler.py @@ -19,16 +19,4 @@ def lambda_handler(event, context): service = ReportS3ContentService() - service.process_s3_content() - - -# class _EcsContext: -# aws_request_id = "ecs-run" -# function_name = "ReportS3ContentEcsTask" -# invoked_function_arn = "ecs://ReportS3ContentEcsTask" -# log_group_name = "ecs" -# log_stream_name = "ecs" -# -# -# if __name__ == "__main__": -# lambda_handler({}, _EcsContext()) + service.process_s3_content() \ No newline at end of file diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 61f4afab21..8a92a9e91b 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -33,9 +33,7 @@ def process_s3_content(self): versions, delete_markers = self.s3_service.list_all_object_versions(bucket) delete_markers = [] if len(versions) > self.max_objects: - logger.warning( - f"Limiting versions from {len(versions)} to {self.max_objects}" - ) + logger.warning(f"Limiting versions from {len(versions)} to {self.max_objects}") versions = versions[: self.max_objects] logger.info(f"Fetching tags in parallel for {len(versions)} versions") From e7589e8e596204fec096574d254e0324f56a770a Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 14:22:26 +0000 Subject: [PATCH 20/43] [PRMP-939] formated code --- lambdas/handlers/report_s3_content_handler.py | 2 +- lambdas/services/reporting/report_s3_content_service.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py index a690ea9ec9..7990bfe6b5 100644 --- a/lambdas/handlers/report_s3_content_handler.py +++ b/lambdas/handlers/report_s3_content_handler.py @@ -19,4 +19,4 @@ def lambda_handler(event, context): service = ReportS3ContentService() - service.process_s3_content() \ No newline at end of file + service.process_s3_content() diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 8a92a9e91b..61f4afab21 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -33,7 +33,9 @@ def process_s3_content(self): versions, delete_markers = self.s3_service.list_all_object_versions(bucket) delete_markers = [] if len(versions) > self.max_objects: - logger.warning(f"Limiting versions from {len(versions)} to {self.max_objects}") + logger.warning( + f"Limiting versions from {len(versions)} to {self.max_objects}" + ) versions = versions[: self.max_objects] logger.info(f"Fetching tags in parallel for {len(versions)} versions") From 6d066e7e9c15de9dd0ecd59b9e1edc7a1cb0d5cf Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 14:26:42 +0000 Subject: [PATCH 21/43] [PRMP-939] formated code --- lambdas/services/reporting/report_s3_content_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 61f4afab21..077bca7ac9 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -34,7 +34,7 @@ def process_s3_content(self): delete_markers = [] if len(versions) > self.max_objects: logger.warning( - f"Limiting versions from {len(versions)} to {self.max_objects}" + f"Limiting versions from {len(versions)} to {self.max_objects}", ) versions = versions[: self.max_objects] logger.info(f"Fetching tags in parallel for {len(versions)} versions") From df4f665c33ed2eab45bc02bcad96bd33d1c65580 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 14:45:25 +0000 Subject: [PATCH 22/43] [PRMP-939] improved test coverage --- .../unit/services/base/test_s3_service.py | 240 +++++++++++++++--- 1 file changed, 208 insertions(+), 32 deletions(-) diff --git a/lambdas/tests/unit/services/base/test_s3_service.py b/lambdas/tests/unit/services/base/test_s3_service.py index b9e9aa2cb0..f175204c1d 100755 --- a/lambdas/tests/unit/services/base/test_s3_service.py +++ b/lambdas/tests/unit/services/base/test_s3_service.py @@ -41,7 +41,7 @@ def mock_service(mocker, set_env): mocker.patch("services.base.iam_service.IAMService") service = S3Service(custom_aws_role="mock_arn_custom_role") service.expiration_time = datetime.datetime.now( - datetime.timezone.utc + datetime.timezone.utc, ) + datetime.timedelta(hours=1) yield service S3Service._instance = None @@ -99,7 +99,9 @@ def test_download_file(mock_service, mock_client): mock_service.download_file(MOCK_BUCKET, TEST_FILE_KEY, TEST_DOWNLOAD_PATH) mock_client.download_file.assert_called_once_with( - MOCK_BUCKET, TEST_FILE_KEY, TEST_DOWNLOAD_PATH + MOCK_BUCKET, + TEST_FILE_KEY, + TEST_DOWNLOAD_PATH, ) @@ -107,7 +109,9 @@ def test_upload_file(mock_service, mock_client): mock_service.upload_file(TEST_FILE_NAME, MOCK_BUCKET, TEST_FILE_KEY) mock_client.upload_file.assert_called_with( - TEST_FILE_NAME, MOCK_BUCKET, TEST_FILE_KEY + TEST_FILE_NAME, + MOCK_BUCKET, + TEST_FILE_KEY, ) @@ -115,11 +119,17 @@ def test_upload_file_with_extra_args(mock_service, mock_client): test_extra_args = {"mock_tag": 123, "apple": "red", "banana": "true"} mock_service.upload_file_with_extra_args( - TEST_FILE_NAME, MOCK_BUCKET, TEST_FILE_KEY, test_extra_args + TEST_FILE_NAME, + MOCK_BUCKET, + TEST_FILE_KEY, + test_extra_args, ) mock_client.upload_file.assert_called_with( - TEST_FILE_NAME, MOCK_BUCKET, TEST_FILE_KEY, test_extra_args + TEST_FILE_NAME, + MOCK_BUCKET, + TEST_FILE_KEY, + test_extra_args, ) @@ -161,7 +171,8 @@ def test_delete_object(mock_service, mock_client): mock_service.delete_object(s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME) mock_client.delete_object_assert_called_once_with( - Bucket=MOCK_BUCKET, Key=TEST_FILE_NAME + Bucket=MOCK_BUCKET, + Key=TEST_FILE_NAME, ) @@ -198,7 +209,9 @@ def test_get_tag_value(mock_service, mock_client): mock_client.get_object_tagging.return_value = mock_response actual = mock_service.get_tag_value( - s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME, tag_key=test_tag_key + s3_bucket_name=MOCK_BUCKET, + file_key=TEST_FILE_NAME, + tag_key=test_tag_key, ) expected = test_tag_value assert actual == expected @@ -210,7 +223,8 @@ def test_get_tag_value(mock_service, mock_client): def test_get_tag_value_raises_error_when_specified_tag_is_missing( - mock_service, mock_client + mock_service, + mock_client, ): test_tag_key = "tag_key" @@ -225,7 +239,9 @@ def test_get_tag_value_raises_error_when_specified_tag_is_missing( with pytest.raises(TagNotFoundException): mock_service.get_tag_value( - s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME, tag_key=test_tag_key + s3_bucket_name=MOCK_BUCKET, + file_key=TEST_FILE_NAME, + tag_key=test_tag_key, ) @@ -247,7 +263,8 @@ def test_file_exist_on_s3_return_true_if_object_exists(mock_service, mock_client expected = True actual = mock_service.file_exist_on_s3( - s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME + s3_bucket_name=MOCK_BUCKET, + file_key=TEST_FILE_NAME, ) assert actual == expected @@ -258,7 +275,8 @@ def test_file_exist_on_s3_return_true_if_object_exists(mock_service, mock_client def test_file_exist_on_s3_return_false_if_object_does_not_exist( - mock_service, mock_client + mock_service, + mock_client, ): mock_error = ClientError( {"Error": {"Code": "403", "Message": "Forbidden"}}, @@ -269,7 +287,8 @@ def test_file_exist_on_s3_return_false_if_object_does_not_exist( expected = False actual = mock_service.file_exist_on_s3( - s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME + s3_bucket_name=MOCK_BUCKET, + file_key=TEST_FILE_NAME, ) assert actual == expected @@ -281,7 +300,8 @@ def test_file_exist_on_s3_return_false_if_object_does_not_exist( def test_file_exist_on_s3_raises_client_error_if_unexpected_response( - mock_service, mock_client + mock_service, + mock_client, ): mock_error = ClientError( {"Error": {"Code": "500", "Message": "Internal Server Error"}}, @@ -292,7 +312,8 @@ def test_file_exist_on_s3_raises_client_error_if_unexpected_response( with pytest.raises(ClientError): mock_service.file_exist_on_s3( - s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME + s3_bucket_name=MOCK_BUCKET, + file_key=TEST_FILE_NAME, ) mock_client.head_object.assert_called_with( @@ -336,7 +357,8 @@ def test_created_custom_client_when_client_role_is_passed(mocker): mocker.patch("boto3.client") iam_service_instance = mocker.MagicMock() iam_service = mocker.patch( - "services.base.s3_service.IAMService", return_value=iam_service_instance + "services.base.s3_service.IAMService", + return_value=iam_service_instance, ) mock_expiration_time = datetime.datetime.now(datetime.timezone.utc) custom_client_mock = mocker.MagicMock() @@ -353,7 +375,9 @@ def test_created_custom_client_when_client_role_is_passed(mocker): def test_list_all_objects_return_a_list_of_file_details( - mock_service, mock_client, mock_list_objects_paginate + mock_service, + mock_client, + mock_list_objects_paginate, ): mock_list_objects_paginate.return_value = [MOCK_LIST_OBJECTS_RESPONSE] expected = MOCK_LIST_OBJECTS_RESPONSE["Contents"] @@ -367,12 +391,14 @@ def test_list_all_objects_return_a_list_of_file_details( def test_list_all_objects_handles_paginated_responses( - mock_service, mock_client, mock_list_objects_paginate + mock_service, + mock_client, + mock_list_objects_paginate, ): mock_list_objects_paginate.return_value = MOCK_LIST_OBJECTS_PAGINATED_RESPONSES expected = flatten( - [page["Contents"] for page in MOCK_LIST_OBJECTS_PAGINATED_RESPONSES] + [page["Contents"] for page in MOCK_LIST_OBJECTS_PAGINATED_RESPONSES], ) actual = mock_service.list_all_objects(MOCK_BUCKET) @@ -381,7 +407,9 @@ def test_list_all_objects_handles_paginated_responses( def test_list_all_objects_raises_client_error_if_unexpected_response( - mock_service, mock_client, mock_list_objects_paginate + mock_service, + mock_client, + mock_list_objects_paginate, ): mock_error = ClientError( {"Error": {"Code": "500", "Message": "Internal Server Error"}}, @@ -413,7 +441,8 @@ def test_file_size_return_int(mock_service, mock_client): expected = "3191" actual = mock_service.get_file_size( - s3_bucket_name=MOCK_BUCKET, object_key=TEST_FILE_NAME + s3_bucket_name=MOCK_BUCKET, + object_key=TEST_FILE_NAME, ) assert actual == expected @@ -436,10 +465,12 @@ def test_save_or_create_file(mock_service, mock_client): def test_returns_binary_file_content_when_file_exists( - mock_service, mock_client, mocker + mock_service, + mock_client, + mocker, ): mock_client.get_object.return_value = { - "Body": mocker.Mock(read=lambda: b"file-content") + "Body": mocker.Mock(read=lambda: b"file-content"), } @@ -455,7 +486,10 @@ def test_upload_file_obj_success(mock_service, mock_client): extra_args = {"ContentType": "application/pdf"} mock_service.upload_file_obj( - file_obj, MOCK_BUCKET, TEST_FILE_KEY, extra_args=extra_args + file_obj, + MOCK_BUCKET, + TEST_FILE_KEY, + extra_args=extra_args, ) mock_client.upload_fileobj.assert_called_once_with( @@ -470,7 +504,8 @@ def test_upload_file_obj_raises_client_error(mock_service, mock_client): file_obj = BytesIO(b"sample file content") mock_client.upload_fileobj.side_effect = ClientError( - {"Error": {"Code": "403", "Message": "Forbidden"}}, "UploadFileObj" + {"Error": {"Code": "403", "Message": "Forbidden"}}, + "UploadFileObj", ) with pytest.raises(ClientError): @@ -492,7 +527,8 @@ def test_get_object_stream_returns_body_stream(mock_service, mock_client, mocker assert result == mock_stream mock_client.get_object.assert_called_once_with( - Bucket=MOCK_BUCKET, Key=TEST_FILE_KEY + Bucket=MOCK_BUCKET, + Key=TEST_FILE_KEY, ) @@ -530,15 +566,18 @@ def test_get_head_object_returns_metadata(mock_service, mock_client): assert result == mock_response mock_client.head_object.assert_called_once_with( - Bucket=MOCK_BUCKET, Key=TEST_FILE_KEY + Bucket=MOCK_BUCKET, + Key=TEST_FILE_KEY, ) def test_get_head_object_raises_client_error_when_object_not_found( - mock_service, mock_client + mock_service, + mock_client, ): mock_error = ClientError( - {"Error": {"Code": "404", "Message": "Not Found"}}, "HeadObject" + {"Error": {"Code": "404", "Message": "Not Found"}}, + "HeadObject", ) mock_client.head_object.side_effect = mock_error @@ -546,15 +585,18 @@ def test_get_head_object_raises_client_error_when_object_not_found( mock_service.get_head_object(bucket=MOCK_BUCKET, key=TEST_FILE_KEY) mock_client.head_object.assert_called_once_with( - Bucket=MOCK_BUCKET, Key=TEST_FILE_KEY + Bucket=MOCK_BUCKET, + Key=TEST_FILE_KEY, ) def test_get_head_object_raises_client_error_on_access_denied( - mock_service, mock_client + mock_service, + mock_client, ): mock_error = ClientError( - {"Error": {"Code": "403", "Message": "Forbidden"}}, "HeadObject" + {"Error": {"Code": "403", "Message": "Forbidden"}}, + "HeadObject", ) mock_client.head_object.side_effect = mock_error @@ -562,7 +604,8 @@ def test_get_head_object_raises_client_error_on_access_denied( mock_service.get_head_object(bucket=MOCK_BUCKET, key=TEST_FILE_KEY) mock_client.head_object.assert_called_once_with( - Bucket=MOCK_BUCKET, Key=TEST_FILE_KEY + Bucket=MOCK_BUCKET, + Key=TEST_FILE_KEY, ) @@ -597,3 +640,136 @@ def test_copy_across_bucket_retries_on_409_conflict(mock_service, mock_client): "StorageClass": "INTELLIGENT_TIERING", } mock_client.copy_object.assert_called_with(**expected_call) + + +def test_list_all_object_versions_returns_versions_and_delete_markers( + mock_service, mock_client +): + paginator = mock_client.get_paginator.return_value + + page_1 = { + "Versions": [ + {"Key": "a.txt", "VersionId": "v1"}, + {"Key": "a.txt", "VersionId": "v2"}, + ], + "DeleteMarkers": [ + {"Key": "b.txt", "VersionId": "d1"}, + ], + } + page_2 = { + "Versions": [ + {"Key": "c.txt", "VersionId": "v3"}, + ], + "DeleteMarkers": [], + } + + paginator.paginate.return_value = [page_1, page_2] + + versions, delete_markers = mock_service.list_all_object_versions(MOCK_BUCKET) + + assert versions == page_1["Versions"] + page_2["Versions"] + assert delete_markers == page_1["DeleteMarkers"] + page_2["DeleteMarkers"] + + mock_client.get_paginator.assert_called_once_with("list_object_versions") + paginator.paginate.assert_called_once_with(Bucket=MOCK_BUCKET) + + +def test_list_all_object_versions_handles_missing_keys_as_empty_lists( + mock_service, mock_client +): + paginator = mock_client.get_paginator.return_value + paginator.paginate.return_value = [ + {}, + {"Versions": [{"Key": "a.txt", "VersionId": "v1"}]}, + {"DeleteMarkers": [{"Key": "b.txt", "VersionId": "d1"}]}, + ] + + versions, delete_markers = mock_service.list_all_object_versions(MOCK_BUCKET) + + assert versions == [{"Key": "a.txt", "VersionId": "v1"}] + assert delete_markers == [{"Key": "b.txt", "VersionId": "d1"}] + + mock_client.get_paginator.assert_called_once_with("list_object_versions") + paginator.paginate.assert_called_once_with(Bucket=MOCK_BUCKET) + + +def test_get_object_tags_versioned_with_version_id_calls_get_object_tagging_with_version( + mock_service, mock_client +): + mock_client.get_object_tagging.return_value = { + "TagSet": [{"Key": "k", "Value": "v"}], + } + + result = mock_service.get_object_tags_versioned( + bucket=MOCK_BUCKET, + key=TEST_FILE_KEY, + version_id="ver-123", + ) + + assert result == [{"Key": "k", "Value": "v"}] + mock_client.get_object_tagging.assert_called_once_with( + Bucket=MOCK_BUCKET, + Key=TEST_FILE_KEY, + VersionId="ver-123", + ) + + +def test_get_object_tags_versioned_without_version_id_calls_get_object_tagging_without_version( + mock_service, mock_client +): + mock_client.get_object_tagging.return_value = { + "TagSet": [{"Key": "k2", "Value": "v2"}], + } + + result = mock_service.get_object_tags_versioned( + bucket=MOCK_BUCKET, + key=TEST_FILE_KEY, + version_id=None, + ) + + assert result == [{"Key": "k2", "Value": "v2"}] + mock_client.get_object_tagging.assert_called_once_with( + Bucket=MOCK_BUCKET, + Key=TEST_FILE_KEY, + ) + + +def test_get_object_tags_versioned_returns_empty_list_on_client_error( + mock_service, mock_client +): + mock_client.get_object_tagging.side_effect = ClientError( + {"Error": {"Code": "403", "Message": "Forbidden"}}, + "GetObjectTagging", + ) + + result = mock_service.get_object_tags_versioned( + bucket=MOCK_BUCKET, + key=TEST_FILE_KEY, + version_id="ver-123", + ) + + assert result == [] + mock_client.get_object_tagging.assert_called_once_with( + Bucket=MOCK_BUCKET, + Key=TEST_FILE_KEY, + VersionId="ver-123", + ) + + +def test_get_object_tags_versioned_returns_empty_list_when_tagset_missing( + mock_service, mock_client +): + mock_client.get_object_tagging.return_value = {} + + result = mock_service.get_object_tags_versioned( + bucket=MOCK_BUCKET, + key=TEST_FILE_KEY, + version_id="ver-123", + ) + + assert result == [] + mock_client.get_object_tagging.assert_called_once_with( + Bucket=MOCK_BUCKET, + Key=TEST_FILE_KEY, + VersionId="ver-123", + ) From 0c20a5718a793fecc1c1298bcdc9b90c5649b792 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 14:48:22 +0000 Subject: [PATCH 23/43] [PRMP-939] linting --- lambdas/tests/unit/services/base/test_s3_service.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lambdas/tests/unit/services/base/test_s3_service.py b/lambdas/tests/unit/services/base/test_s3_service.py index f175204c1d..79b4082285 100755 --- a/lambdas/tests/unit/services/base/test_s3_service.py +++ b/lambdas/tests/unit/services/base/test_s3_service.py @@ -643,7 +643,7 @@ def test_copy_across_bucket_retries_on_409_conflict(mock_service, mock_client): def test_list_all_object_versions_returns_versions_and_delete_markers( - mock_service, mock_client + mock_service, mock_client, ): paginator = mock_client.get_paginator.return_value @@ -675,7 +675,7 @@ def test_list_all_object_versions_returns_versions_and_delete_markers( def test_list_all_object_versions_handles_missing_keys_as_empty_lists( - mock_service, mock_client + mock_service, mock_client, ): paginator = mock_client.get_paginator.return_value paginator.paginate.return_value = [ @@ -694,7 +694,7 @@ def test_list_all_object_versions_handles_missing_keys_as_empty_lists( def test_get_object_tags_versioned_with_version_id_calls_get_object_tagging_with_version( - mock_service, mock_client + mock_service, mock_client, ): mock_client.get_object_tagging.return_value = { "TagSet": [{"Key": "k", "Value": "v"}], @@ -715,7 +715,7 @@ def test_get_object_tags_versioned_with_version_id_calls_get_object_tagging_with def test_get_object_tags_versioned_without_version_id_calls_get_object_tagging_without_version( - mock_service, mock_client + mock_service, mock_client, ): mock_client.get_object_tagging.return_value = { "TagSet": [{"Key": "k2", "Value": "v2"}], @@ -735,7 +735,7 @@ def test_get_object_tags_versioned_without_version_id_calls_get_object_tagging_w def test_get_object_tags_versioned_returns_empty_list_on_client_error( - mock_service, mock_client + mock_service, mock_client, ): mock_client.get_object_tagging.side_effect = ClientError( {"Error": {"Code": "403", "Message": "Forbidden"}}, @@ -757,7 +757,7 @@ def test_get_object_tags_versioned_returns_empty_list_on_client_error( def test_get_object_tags_versioned_returns_empty_list_when_tagset_missing( - mock_service, mock_client + mock_service, mock_client, ): mock_client.get_object_tagging.return_value = {} From b6b6eeb4160d51ba7c0dccd3003b99685f2f14ba Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 14:51:43 +0000 Subject: [PATCH 24/43] [PRMP-939] linting --- .../unit/services/base/test_s3_service.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lambdas/tests/unit/services/base/test_s3_service.py b/lambdas/tests/unit/services/base/test_s3_service.py index 79b4082285..8751299644 100755 --- a/lambdas/tests/unit/services/base/test_s3_service.py +++ b/lambdas/tests/unit/services/base/test_s3_service.py @@ -643,7 +643,8 @@ def test_copy_across_bucket_retries_on_409_conflict(mock_service, mock_client): def test_list_all_object_versions_returns_versions_and_delete_markers( - mock_service, mock_client, + mock_service, + mock_client, ): paginator = mock_client.get_paginator.return_value @@ -675,7 +676,8 @@ def test_list_all_object_versions_returns_versions_and_delete_markers( def test_list_all_object_versions_handles_missing_keys_as_empty_lists( - mock_service, mock_client, + mock_service, + mock_client, ): paginator = mock_client.get_paginator.return_value paginator.paginate.return_value = [ @@ -694,7 +696,8 @@ def test_list_all_object_versions_handles_missing_keys_as_empty_lists( def test_get_object_tags_versioned_with_version_id_calls_get_object_tagging_with_version( - mock_service, mock_client, + mock_service, + mock_client, ): mock_client.get_object_tagging.return_value = { "TagSet": [{"Key": "k", "Value": "v"}], @@ -715,7 +718,8 @@ def test_get_object_tags_versioned_with_version_id_calls_get_object_tagging_with def test_get_object_tags_versioned_without_version_id_calls_get_object_tagging_without_version( - mock_service, mock_client, + mock_service, + mock_client, ): mock_client.get_object_tagging.return_value = { "TagSet": [{"Key": "k2", "Value": "v2"}], @@ -735,7 +739,8 @@ def test_get_object_tags_versioned_without_version_id_calls_get_object_tagging_w def test_get_object_tags_versioned_returns_empty_list_on_client_error( - mock_service, mock_client, + mock_service, + mock_client, ): mock_client.get_object_tagging.side_effect = ClientError( {"Error": {"Code": "403", "Message": "Forbidden"}}, @@ -757,7 +762,8 @@ def test_get_object_tags_versioned_returns_empty_list_on_client_error( def test_get_object_tags_versioned_returns_empty_list_when_tagset_missing( - mock_service, mock_client, + mock_service, + mock_client, ): mock_client.get_object_tagging.return_value = {} From 91ff386528299682aa671aeccb3b613ce2b1c98c Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 15:21:51 +0000 Subject: [PATCH 25/43] [PRMP-939] removed lloyd george bucket from reports3 content --- .../workflows/base-lambdas-reusable-deploy-all.yml | 14 -------------- lambdas/handlers/report_s3_content_handler.py | 1 - .../reporting/report_s3_content_service.py | 3 +-- 3 files changed, 1 insertion(+), 17 deletions(-) diff --git a/.github/workflows/base-lambdas-reusable-deploy-all.yml b/.github/workflows/base-lambdas-reusable-deploy-all.yml index a05da66110..874cc51f4b 100644 --- a/.github/workflows/base-lambdas-reusable-deploy-all.yml +++ b/.github/workflows/base-lambdas-reusable-deploy-all.yml @@ -852,17 +852,3 @@ jobs: lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - -# deploy_report_s3_content_lambda: -# name: Deploy Report S3 Content Lambda -# uses: ./.github/workflows/base-lambdas-reusable-deploy.yml -# with: -# environment: ${{ inputs.environment }} -# python_version: ${{ inputs.python_version }} -# build_branch: ${{ inputs.build_branch }} -# sandbox: ${{ inputs.sandbox }} -# lambda_handler_name: report_s3_content_handler -# lambda_aws_name: ReportS3Content -# lambda_layer_names: "core_lambda_layer" -# secrets: -# AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py index 7990bfe6b5..0ffb4cb277 100644 --- a/lambdas/handlers/report_s3_content_handler.py +++ b/lambdas/handlers/report_s3_content_handler.py @@ -8,7 +8,6 @@ logger = LoggingService(__name__) -@ensure_environment_variables(names=["LLOYD_GEORGE_BUCKET_NAME"]) @ensure_environment_variables(names=["BULK_STAGING_BUCKET_NAME"]) @ensure_environment_variables(names=["STATISTICAL_REPORTS_BUCKET"]) @override_error_check diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 077bca7ac9..b5c7c94d1e 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -11,7 +11,6 @@ class ReportS3ContentService: def __init__(self): - self.lloyd_george_bucket = os.getenv("LLOYD_GEORGE_BUCKET_NAME") self.bulk_staging_store = os.getenv("BULK_STAGING_BUCKET_NAME") self.statistic_reports_bucket = os.getenv("STATISTICAL_REPORTS_BUCKET") self.s3_service = S3Service() @@ -28,7 +27,7 @@ def _fetch_tags(self, bucket, version): return version def process_s3_content(self): - for bucket in [self.lloyd_george_bucket, self.bulk_staging_store]: + for bucket in [self.bulk_staging_store]: logger.info(f"Listing versions for bucket {bucket}") versions, delete_markers = self.s3_service.list_all_object_versions(bucket) delete_markers = [] From c7ae3cec8c267575ff670eebc605485606d8e1b7 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 16:04:49 +0000 Subject: [PATCH 26/43] [PRMP-939] adressed comments and removed handlers --- .../base-lambdas-reusable-deploy-all.yml | 14 ------ ...ection.yml => base-s3-data-collection.yml} | 0 .github/workflows/full-deploy-to-pre-prod.yml | 2 +- .github/workflows/full-deploy-to-prod.yml | 2 +- .github/workflows/lambdas-dev-to-main-ci.yml | 2 +- .../s3-data-collection-deploy-to-sandbox.yml | 2 +- lambdas/handlers/report_s3_content_handler.py | 21 --------- .../test_report_s3_content_handler.py | 45 ------------------- 8 files changed, 4 insertions(+), 84 deletions(-) rename .github/workflows/{s3-base-data-collection.yml => base-s3-data-collection.yml} (100%) delete mode 100644 lambdas/handlers/report_s3_content_handler.py delete mode 100644 lambdas/tests/unit/handlers/test_report_s3_content_handler.py diff --git a/.github/workflows/base-lambdas-reusable-deploy-all.yml b/.github/workflows/base-lambdas-reusable-deploy-all.yml index 874cc51f4b..32d347ae45 100644 --- a/.github/workflows/base-lambdas-reusable-deploy-all.yml +++ b/.github/workflows/base-lambdas-reusable-deploy-all.yml @@ -434,20 +434,6 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - deploy_s3_data_collection_lambda: - name: Deploy S3 data collection lambda - uses: ./.github/workflows/base-lambdas-reusable-deploy.yml - with: - environment: ${{ inputs.environment}} - python_version: ${{ inputs.python_version }} - build_branch: ${{ inputs.build_branch}} - sandbox: ${{ inputs.sandbox }} - lambda_handler_name: data_collection_handler - lambda_aws_name: ReportS3Content - lambda_layer_names: "core_lambda_layer,data_lambda_layer" - secrets: - AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - deploy_statistical_report_lambda: name: Deploy statistical report lambda uses: ./.github/workflows/base-lambdas-reusable-deploy.yml diff --git a/.github/workflows/s3-base-data-collection.yml b/.github/workflows/base-s3-data-collection.yml similarity index 100% rename from .github/workflows/s3-base-data-collection.yml rename to .github/workflows/base-s3-data-collection.yml diff --git a/.github/workflows/full-deploy-to-pre-prod.yml b/.github/workflows/full-deploy-to-pre-prod.yml index d121c2be97..ac6864ba62 100644 --- a/.github/workflows/full-deploy-to-pre-prod.yml +++ b/.github/workflows/full-deploy-to-pre-prod.yml @@ -139,7 +139,7 @@ jobs: deploy_s3_data_collection: name: Deploy S3 Data Collection needs: [ "tag_and_release" ] - uses: ./.github/workflows/s3-base-data-collection.yml + uses: ./.github/workflows/base-s3-data-collection.yml with: build_branch: ${{ needs.tag_and_release.outputs.version }} environment: pre-prod diff --git a/.github/workflows/full-deploy-to-prod.yml b/.github/workflows/full-deploy-to-prod.yml index f2a43132e6..2e4e91415b 100644 --- a/.github/workflows/full-deploy-to-prod.yml +++ b/.github/workflows/full-deploy-to-prod.yml @@ -78,7 +78,7 @@ jobs: deploy_s3_data_collection: name: Deploy S3 Data Collection - uses: ./.github/workflows/s3_base-data-collection.yml + uses: ./.github/workflows/base-s3-data-collection.yml with: build_branch: ${{ inputs.tag_version }} environment: prod diff --git a/.github/workflows/lambdas-dev-to-main-ci.yml b/.github/workflows/lambdas-dev-to-main-ci.yml index f5b38a651e..f6be9cceca 100644 --- a/.github/workflows/lambdas-dev-to-main-ci.yml +++ b/.github/workflows/lambdas-dev-to-main-ci.yml @@ -83,7 +83,7 @@ jobs: deploy_s3_data_collection: name: Deploy S3 Data Collection needs: [ "run_tests" ] - uses: ./.github/workflows/s3-base-data-collection.yml + uses: ./.github/workflows/base-s3-data-collection.yml if: github.ref == 'refs/heads/main' with: build_branch: ${{ github.event.pull_request.head.ref }} diff --git a/.github/workflows/s3-data-collection-deploy-to-sandbox.yml b/.github/workflows/s3-data-collection-deploy-to-sandbox.yml index 20693494a4..05f9508411 100644 --- a/.github/workflows/s3-data-collection-deploy-to-sandbox.yml +++ b/.github/workflows/s3-data-collection-deploy-to-sandbox.yml @@ -49,7 +49,7 @@ permissions: jobs: push_image: name: Push Image - uses: ./.github/workflows/s3-base-data-collection.yml + uses: ./.github/workflows/base-s3-data-collection.yml with: build_branch: ${{ inputs.build_branch }} environment: ${{ inputs.environment }} diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py deleted file mode 100644 index 0ffb4cb277..0000000000 --- a/lambdas/handlers/report_s3_content_handler.py +++ /dev/null @@ -1,21 +0,0 @@ -from services.reporting.report_s3_content_service import ReportS3ContentService -from utils.audit_logging_setup import LoggingService -from utils.decorators.ensure_env_var import ensure_environment_variables -from utils.decorators.handle_lambda_exceptions import handle_lambda_exceptions -from utils.decorators.override_error_check import override_error_check -from utils.decorators.set_audit_arg import set_request_context_for_logging - -logger = LoggingService(__name__) - - -@ensure_environment_variables(names=["BULK_STAGING_BUCKET_NAME"]) -@ensure_environment_variables(names=["STATISTICAL_REPORTS_BUCKET"]) -@override_error_check -@handle_lambda_exceptions -@set_request_context_for_logging -def lambda_handler(event, context): - logger.info("Report S3 content lambda invoked") - - service = ReportS3ContentService() - - service.process_s3_content() diff --git a/lambdas/tests/unit/handlers/test_report_s3_content_handler.py b/lambdas/tests/unit/handlers/test_report_s3_content_handler.py deleted file mode 100644 index d431ba0d3e..0000000000 --- a/lambdas/tests/unit/handlers/test_report_s3_content_handler.py +++ /dev/null @@ -1,45 +0,0 @@ -from types import SimpleNamespace - -import pytest - -from lambdas.handlers.report_s3_content_handler import lambda_handler - - -@pytest.fixture(autouse=True) -def patch_env_vars(monkeypatch): - env_vars = { - "LLOYD_GEORGE_BUCKET_NAME": "bucket-a", - "STATISTICAL_REPORTS_BUCKET": "bucket-b", - "BULK_STAGING_BUCKET_NAME": "bucket-c", - } - for key, value in env_vars.items(): - monkeypatch.setenv(key, value) - - -@pytest.fixture -def lambda_context(): - return SimpleNamespace(aws_request_id="test-request-id") - - -def test_lambda_handler_invokes_service(mocker, lambda_context): - mock_service_cls = mocker.patch( - "lambdas.handlers.report_s3_content_handler.ReportS3ContentService", - ) - mock_service = mock_service_cls.return_value - - lambda_handler({}, lambda_context) - - mock_service_cls.assert_called_once() - mock_service.process_s3_content.assert_called_once() - - -def test_lambda_handler_runs_without_event_data(mocker, lambda_context): - mock_service_cls = mocker.patch( - "lambdas.handlers.report_s3_content_handler.ReportS3ContentService", - ) - mock_service = mock_service_cls.return_value - - lambda_handler({}, lambda_context) - - mock_service_cls.assert_called_once() - mock_service.process_s3_content.assert_called_once() From 706270584fc887ddffc301c8a10c5d522a48dde6 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Fri, 13 Feb 2026 16:22:59 +0000 Subject: [PATCH 27/43] [PRMP-939] fixed test --- .../reporting/test_report_s3_content_service.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py b/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py index c2d5688ebe..7ceb59751e 100644 --- a/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py +++ b/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py @@ -1,9 +1,8 @@ from services.reporting.report_s3_content_service import ReportS3ContentService -def test_process_s3_content(mocker): +def test_process_s3_content_uploads_single_bucket_report(mocker): service = ReportS3ContentService() - service.lloyd_george_bucket = "bucket-a" service.bulk_staging_store = "bucket-b" service.statistic_reports_bucket = "reports-bucket" service.s3_service = mocker.Mock() @@ -17,12 +16,8 @@ def test_process_s3_content(mocker): "LastModified": mocker.Mock(), }, ] - fake_delete_markers = [] - service.s3_service.list_all_object_versions.return_value = ( - fake_versions, - fake_delete_markers, - ) + service.s3_service.list_all_object_versions.return_value = (fake_versions, []) service.s3_service.get_object_tags_versioned.return_value = [ {"Key": "autodelete", "Value": "true"}, ] @@ -30,4 +25,4 @@ def test_process_s3_content(mocker): service.process_s3_content() - assert service.s3_service.upload_file_obj.call_count == 2 + service.s3_service.upload_file_obj.assert_called_once() From 6222c7c722d146031113251f0377c916037def8a Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 09:11:17 +0000 Subject: [PATCH 28/43] [PRMP-939] fix sonar --- lambdas/ecs/s3_data_collection/Dockerfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lambdas/ecs/s3_data_collection/Dockerfile b/lambdas/ecs/s3_data_collection/Dockerfile index 6c0e5ec097..346165068b 100644 --- a/lambdas/ecs/s3_data_collection/Dockerfile +++ b/lambdas/ecs/s3_data_collection/Dockerfile @@ -10,6 +10,10 @@ COPY requirements /lambdas/requirements RUN pip install -r requirements/layers/requirements_core_lambda_layer.txt RUN pip install -r requirements/layers/requirements_data_lambda_layer.txt -COPY . /lambdas +COPY ecs/ /lambdas/ecs/ +COPY handlers/ /lambdas/handlers/ +COPY services/ /lambdas/services/ +COPY repositories/ /lambdas/repositories/ +COPY utils/ /lambdas/utils/ ENTRYPOINT ["python", "ecs/s3_data_collection/main.py"] From 36f6149bba074bced336902d751f8175de178696 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 09:27:19 +0000 Subject: [PATCH 29/43] [PRMP-939] deploy to sandbox --- .github/workflows/full-deploy-to-sandbox.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/full-deploy-to-sandbox.yml b/.github/workflows/full-deploy-to-sandbox.yml index bf5621cf20..84dc228e93 100644 --- a/.github/workflows/full-deploy-to-sandbox.yml +++ b/.github/workflows/full-deploy-to-sandbox.yml @@ -166,6 +166,17 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + deploy_s3_data_collection: + name: "Deploy S3 Data Collection (ECS task image)" + uses: ./.github/workflows/s3-base-data-collection.yml + needs: [ "deploy_all_lambdas" ] + with: + build_branch: ${{ inputs.build_branch }} + sandbox: ${{ inputs.sandbox }} + environment: ${{ inputs.environment }} + secrets: + AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + bulk_upload: name: "Run Bulk Upload" if: ${{ inputs.bulk_upload }} From c0c096707af116e3037ef1ad767745caae244619 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 09:27:27 +0000 Subject: [PATCH 30/43] Revert "[PRMP-939] deploy to sandbox" This reverts commit 36f6149bba074bced336902d751f8175de178696. --- .github/workflows/full-deploy-to-sandbox.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.github/workflows/full-deploy-to-sandbox.yml b/.github/workflows/full-deploy-to-sandbox.yml index 84dc228e93..bf5621cf20 100644 --- a/.github/workflows/full-deploy-to-sandbox.yml +++ b/.github/workflows/full-deploy-to-sandbox.yml @@ -166,17 +166,6 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - deploy_s3_data_collection: - name: "Deploy S3 Data Collection (ECS task image)" - uses: ./.github/workflows/s3-base-data-collection.yml - needs: [ "deploy_all_lambdas" ] - with: - build_branch: ${{ inputs.build_branch }} - sandbox: ${{ inputs.sandbox }} - environment: ${{ inputs.environment }} - secrets: - AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - bulk_upload: name: "Run Bulk Upload" if: ${{ inputs.bulk_upload }} From 95526b99282aaca9999e2c28221eb7c33e59470c Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 09:55:05 +0000 Subject: [PATCH 31/43] Revert "Merge remote-tracking branch 'origin/main' into PRMP-939" This reverts commit 611d03c3f273cca76239c69f7e13dd94e234e809, reversing changes made to 6222c7c722d146031113251f0377c916037def8a. --- Makefile | 12 - app/.eslintrc | 3 +- .../download_lloyd_george_workflow.cy.js | 6 +- .../ReviewDetailsAddMoreChoiceStage.test.tsx | 94 ++--- .../ReviewDetailsAddMoreChoiceStage.tsx | 17 +- .../ExistingRecordTable.test.tsx | 6 - .../ExistingRecordTable.tsx | 2 +- .../ReviewDetailsAssessmentStage.test.tsx | 195 ++++++---- .../ReviewDetailsAssessmentStage.tsx | 49 +-- .../ReviewDetailsDocumentSelectOrderStage.tsx | 1 - .../ReviewDetailsPatientSearchStage.tsx | 12 +- .../ReviewsDetailsStage.tsx | 15 +- .../DocumentSelectOrderStage.tsx | 18 +- .../DocumentUploadCompleteStage.scss | 6 - .../DocumentUploadCompleteStage.tsx | 117 +++--- .../DocumentUploadLloydGeorgePreview.tsx | 7 +- .../LloydGeorgeViewRecordStage.tsx | 1 - .../documentView/DocumentView.test.tsx | 24 +- .../documentView/DocumentView.tsx | 14 +- .../PatientVerifyPage.test.tsx | 8 +- .../generic/createdBy/createdBy.test.tsx | 79 ---- .../generic/createdBy/createdBy.tsx | 20 - .../recordLoader/RecordLoader.test.tsx | 6 + .../generic/recordLoader/RecordLoader.tsx | 16 +- ...ectronicHealthRecordAttachmentsConfig.json | 6 +- app/src/config/lettersAndDocumentsConfig.json | 6 +- app/src/config/lloydGeorgeConfig.json | 8 +- .../requests/getDocumentSearchResults.ts | 1 - app/src/helpers/test/testBuilders.ts | 1 - app/src/helpers/utils/documentType.ts | 6 +- app/src/helpers/utils/documentUpload.test.ts | 349 ----------------- app/src/helpers/utils/documentUpload.ts | 60 --- app/src/helpers/utils/errorCodes.ts | 2 - .../helpers/utils/fileUploadErrorMessages.ts | 2 +- app/src/helpers/utils/formatDate.test.ts | 350 +++++++++++++++--- app/src/helpers/utils/formatDate.ts | 21 -- .../documentUploadPage/DocumentUploadPage.tsx | 54 ++- .../LloydGeorgeRecordPage.test.tsx | 4 - .../pages/privacyPage/PrivacyPage.test.tsx | 9 +- .../serverErrorPage/ServerErrorPage.test.tsx | 18 +- .../pages/serverErrorPage/ServerErrorPage.tsx | 19 +- app/src/types/generic/searchResult.ts | 1 - .../types/pages/UploadDocumentsPage/types.ts | 1 - lambdas/models/document_reference.py | 14 +- .../create_document_reference_service.py | 79 ++-- .../document_reference_search_service.py | 1 - lambdas/services/feature_flags_service.py | 17 +- .../post_fhir_document_reference_service.py | 28 +- .../update_document_reference_service.py | 58 ++- .../test_upload_document_fhir_api_success.py | 36 +- .../tests/e2e/api/test_upload_document_api.py | 64 +--- lambdas/tests/e2e/helpers/data_helper.py | 42 +-- .../helpers/data/dynamo/dynamo_responses.py | 11 +- .../test_create_document_reference_service.py | 171 ++++----- .../test_document_reference_search_service.py | 2 - .../services/test_feature_flags_service.py | 42 +-- .../services/test_pdf_stitching_service.py | 7 - ..._fhir_document_reference_search_service.py | 74 ---- ...dm_post_fhir_document_reference_service.py | 329 ++++------------ ...t_pdm_upload_document_reference_service.py | 134 +++---- ...st_post_fhir_document_reference_service.py | 239 ++++-------- .../test_update_document_reference_service.py | 71 ++-- 62 files changed, 1052 insertions(+), 2013 deletions(-) delete mode 100644 app/src/components/generic/createdBy/createdBy.test.tsx delete mode 100644 app/src/components/generic/createdBy/createdBy.tsx diff --git a/Makefile b/Makefile index aedadecb40..7dd4df5c7c 100644 --- a/Makefile +++ b/Makefile @@ -309,25 +309,13 @@ docker-down: docker-compose -f ./app/docker-compose.yml down cypress-open: -ifeq ($(CONTAINER), true) xvfb-run -- npm --prefix ./app run cypress -else - npm --prefix ./app run cypress -endif cypress-run: -ifeq ($(CONTAINER), true) xvfb-run -- npm --prefix ./app run cypress-run -else - npm --prefix ./app run cypress-run -endif cypress-report: -ifeq ($(CONTAINER), true) xvfb-run -- npm --prefix ./app run cypress-report -else - npm --prefix ./app run cypress-report -endif install-cypress: npm install --save-dev cypress diff --git a/app/.eslintrc b/app/.eslintrc index 0853cd6b61..ce1616713e 100644 --- a/app/.eslintrc +++ b/app/.eslintrc @@ -84,8 +84,7 @@ "import/no-extraneous-dependencies": [ "error", { "devDependencies": true } - ], - "@typescript-eslint/explicit-function-return-type": "off" + ] } }, { diff --git a/app/cypress/e2e/0-ndr-core-tests/gp_user_workflows/download_lloyd_george_workflow.cy.js b/app/cypress/e2e/0-ndr-core-tests/gp_user_workflows/download_lloyd_george_workflow.cy.js index 87ad495249..f36f814113 100644 --- a/app/cypress/e2e/0-ndr-core-tests/gp_user_workflows/download_lloyd_george_workflow.cy.js +++ b/app/cypress/e2e/0-ndr-core-tests/gp_user_workflows/download_lloyd_george_workflow.cy.js @@ -267,7 +267,7 @@ describe('GP Workflow: View Lloyd George record', () => { statusCode: 200, body: { references: singleTestFile, - nextPageToken: 'abc', + nextPageToken: 'abc' }, }).as('searchDocumentReferences'); @@ -360,7 +360,7 @@ describe('GP Workflow: View Lloyd George record', () => { statusCode: 200, body: { jobStatus: 'Pending' }, }); - if (pendingCounts >= 10) { + if (pendingCounts >= 3) { req.alias = 'documentManifestThirdTimePending'; } }); @@ -372,7 +372,7 @@ describe('GP Workflow: View Lloyd George record', () => { cy.getByTestId('toggle-selection-btn').click(); cy.getByTestId('download-selected-files-btn').click(); - cy.wait('@documentManifestThirdTimePending', { timeout: 20000 }); + cy.wait('@documentManifestThirdTimePending'); cy.title().should('have.string', 'Service error'); cy.url().should('have.string', '/server-error?encodedError='); diff --git a/app/src/components/blocks/_admin/reviewDetailsAddMoreChoiceStage/ReviewDetailsAddMoreChoiceStage.test.tsx b/app/src/components/blocks/_admin/reviewDetailsAddMoreChoiceStage/ReviewDetailsAddMoreChoiceStage.test.tsx index a5e6d4ded8..fdb159e703 100644 --- a/app/src/components/blocks/_admin/reviewDetailsAddMoreChoiceStage/ReviewDetailsAddMoreChoiceStage.test.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsAddMoreChoiceStage/ReviewDetailsAddMoreChoiceStage.test.tsx @@ -1,18 +1,11 @@ import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest'; -import { runAxeTest } from '../../../../helpers/test/axeTestHelper'; -import * as documentTypeModule from '../../../../helpers/utils/documentType'; -import { ReviewDetails } from '../../../../types/generic/reviews'; +import { afterEach, beforeEach, describe, expect, it, vi, Mock } from 'vitest'; import ReviewDetailsAddMoreChoiceStage from './ReviewDetailsAddMoreChoiceStage'; -import { DOCUMENT_TYPE } from '../../../../helpers/utils/documentType'; +import { runAxeTest } from '../../../../helpers/test/axeTestHelper'; const mockNavigate = vi.fn(); const mockReviewId = 'test-review-123'; -const testData = { - yesText: 'Yes, I have more scanned paper notes to add for this patient', - noText: "No, I don't have anymore scanned paper notes to add for this patient", -}; vi.mock('react-router-dom', async (): Promise => { const actual = await vi.importActual('react-router-dom'); @@ -23,23 +16,10 @@ vi.mock('react-router-dom', async (): Promise => { }; }); -describe('ReviewDetailsAddMoreChoiceStage', () => { - const mockReviewData = { - snomedCode: DOCUMENT_TYPE.LLOYD_GEORGE, - } as ReviewDetails; - +describe('ReviewDetailsAddMoreChoicePage', () => { beforeEach(() => { vi.clearAllMocks(); import.meta.env.VITE_ENVIRONMENT = 'vitest'; - const mockGetConfig = vi.spyOn(documentTypeModule, 'getConfigForDocType'); - mockGetConfig.mockReturnValue({ - ...documentTypeModule.getConfigForDocType(DOCUMENT_TYPE.LLOYD_GEORGE), - multifileZipped: true, - content: { - addMoreFilesRadioNoText: testData.noText, - addMoreFilesRadioYesText: testData.yesText, - }, - } as any); }); afterEach(() => { @@ -48,29 +28,29 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { describe('Rendering', () => { it('renders the page heading correctly', () => { - render(); + render(); expect( screen.getByRole('heading', { - name: "Do you want to add more files to this patient's record?", + name: 'Do you want to add more files to this patients record?', }), ).toBeInTheDocument(); }); it('renders back button with correct text', () => { - render(); + render(); expect(screen.getByText('Go back')).toBeInTheDocument(); }); it('renders both radio button options', () => { - render(); + render(); const yesRadio = screen.getByRole('radio', { - name: testData.yesText, + name: /Yes I have more scanned paper records to add for this patient/i, }); const noRadio = screen.getByRole('radio', { - name: testData.noText, + name: /No, I don't have anymore scanned paper records to add for this patient/i, }); expect(yesRadio).toBeInTheDocument(); @@ -80,13 +60,13 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { }); it('renders continue button', () => { - render(); + render(); expect(screen.getByRole('button', { name: 'Continue' })).toBeInTheDocument(); }); it('does not show error message initially', () => { - render(); + render(); expect(screen.queryByText('Select an option')).not.toBeInTheDocument(); }); @@ -94,7 +74,7 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { describe('Error Handling', () => { it('displays error message when continue is clicked without selection', async () => { - render(); + render(); const continueButton = screen.getByRole('button', { name: 'Continue' }); await userEvent.click(continueButton); @@ -105,7 +85,7 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { }); it('does not navigate when no selection is made', async () => { - render(); + render(); const continueButton = screen.getByRole('button', { name: 'Continue' }); await userEvent.click(continueButton); @@ -117,7 +97,7 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { }); it('clears error message when yes radio button is selected', async () => { - render(); + render(); const continueButton = screen.getByRole('button', { name: 'Continue' }); await userEvent.click(continueButton); @@ -127,7 +107,7 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { }); const yesRadio = screen.getByRole('radio', { - name: testData.yesText, + name: /Yes I have more scanned paper records to add for this patient/i, }); await userEvent.click(yesRadio); @@ -137,7 +117,7 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { }); it('clears error message when no radio button is selected', async () => { - render(); + render(); const continueButton = screen.getByRole('button', { name: 'Continue' }); await userEvent.click(continueButton); @@ -147,7 +127,7 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { }); const noRadio = screen.getByRole('radio', { - name: testData.noText, + name: /No, I don't have anymore scanned paper records to add for this patient/i, }); await userEvent.click(noRadio); @@ -159,10 +139,10 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { describe('User Interactions', () => { it('allows selecting the yes radio button', async () => { - render(); + render(); const yesRadio = screen.getByRole('radio', { - name: testData.yesText, + name: /Yes I have more scanned paper records to add for this patient/i, }); await userEvent.click(yesRadio); @@ -172,10 +152,10 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { }); it('allows selecting the no radio button', async () => { - render(); + render(); const noRadio = screen.getByRole('radio', { - name: testData.noText, + name: /No, I don't have anymore scanned paper records to add for this patient/i, }); await userEvent.click(noRadio); @@ -185,13 +165,13 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { }); it('allows changing selection from yes to no', async () => { - render(); + render(); const yesRadio = screen.getByRole('radio', { - name: testData.yesText, + name: /Yes I have more scanned paper records to add for this patient/i, }); const noRadio = screen.getByRole('radio', { - name: testData.noText, + name: /No, I don't have anymore scanned paper records to add for this patient/i, }); await userEvent.click(yesRadio); @@ -207,7 +187,7 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { }); it('prevents default form submission', async () => { - render(); + render(); const form = screen.getByRole('button', { name: 'Continue' }).closest('form'); const submitHandler = vi.fn((e: Event) => e.preventDefault()); @@ -222,10 +202,10 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { describe('Navigation', () => { it('navigates to add more files when yes is selected', async () => { - render(); + render(); const yesRadio = screen.getByRole('radio', { - name: testData.yesText, + name: /Yes I have more scanned paper records to add for this patient/i, }); await userEvent.click(yesRadio); @@ -249,7 +229,7 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { render(); const noRadio = screen.getByRole('radio', { - name: testData.noText, + name: /No, I don't have anymore scanned paper records to add for this patient/i, }); await userEvent.click(noRadio); @@ -273,7 +253,7 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { render(); const noRadio = screen.getByRole('radio', { - name: testData.noText, + name: /No, I don't have anymore scanned paper records to add for this patient/i, }); await userEvent.click(noRadio); @@ -297,7 +277,7 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { render(); const noRadio = screen.getByRole('radio', { - name: testData.noText, + name: /No, I don't have anymore scanned paper records to add for this patient/i, }); await userEvent.click(noRadio); @@ -315,18 +295,14 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { describe('Accessibility', () => { it('passes axe accessibility tests in initial state', async () => { - const { container } = render( - , - ); + const { container } = render(); const results = await runAxeTest(container); expect(results).toHaveNoViolations(); }); it('passes axe accessibility tests in error state', async () => { - const { container } = render( - , - ); + const { container } = render(); const continueButton = screen.getByRole('button', { name: 'Continue' }); await userEvent.click(continueButton); @@ -340,12 +316,10 @@ describe('ReviewDetailsAddMoreChoiceStage', () => { }); it('passes axe accessibility tests with radio button selected', async () => { - const { container } = render( - , - ); + const { container } = render(); const yesRadio = screen.getByRole('radio', { - name: testData.yesText, + name: /Yes I have more scanned paper records to add for this patient/i, }); await userEvent.click(yesRadio); diff --git a/app/src/components/blocks/_admin/reviewDetailsAddMoreChoiceStage/ReviewDetailsAddMoreChoiceStage.tsx b/app/src/components/blocks/_admin/reviewDetailsAddMoreChoiceStage/ReviewDetailsAddMoreChoiceStage.tsx index 28925082b7..ebc1bd609e 100644 --- a/app/src/components/blocks/_admin/reviewDetailsAddMoreChoiceStage/ReviewDetailsAddMoreChoiceStage.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsAddMoreChoiceStage/ReviewDetailsAddMoreChoiceStage.tsx @@ -4,7 +4,6 @@ import { useNavigate, useParams } from 'react-router-dom'; import { navigateUrlParam, routeChildren } from '../../../../types/generic/routes'; import BackButton from '../../../generic/backButton/BackButton'; import { ReviewDetails } from '../../../../types/generic/reviews'; -import { getConfigForDocType } from '../../../../helpers/utils/documentType'; type ReviewDetailsAddMoreChoicePageProps = { reviewData: ReviewDetails | null; @@ -20,13 +19,6 @@ const ReviewDetailsAddMoreChoiceStage: React.FC(); - if (!reviewData) { - navigate(routeChildren.ADMIN_REVIEW); - return <>; - } - - const reviewConfig = getConfigForDocType(reviewData?.snomedCode || ''); - const handleContinue = (): void => { if (!addMoreChoice || !reviewId) { setShowError(true); @@ -41,7 +33,7 @@ const ReviewDetailsAddMoreChoiceStage: React.FC 1 + reviewData!.files!.length > 1 ? routeChildren.ADMIN_REVIEW_UPLOAD_FILE_ORDER : routeChildren.ADMIN_REVIEW_UPLOAD, { reviewId }, @@ -62,7 +54,7 @@ const ReviewDetailsAddMoreChoiceStage: React.FC
- Do you want to add more files to this patient's record? + Do you want to add more files to this patients record? - {reviewConfig.content.addMoreFilesRadioYesText} + Yes I have more scanned paper records to add for this patient - {reviewConfig.content.addMoreFilesRadioNoText} + No, I don't have anymore scanned paper records to add for this + patient
diff --git a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ExistingRecordTable.test.tsx b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ExistingRecordTable.test.tsx index 07db8d1a50..d0376f8e98 100644 --- a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ExistingRecordTable.test.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ExistingRecordTable.test.tsx @@ -14,7 +14,6 @@ describe('ExistingRecordTable', () => { fileName: 'existing-file-1.pdf', id: 'file-id-1', created: '2024-01-01', - author: 'Y1234', virusScannerResult: 'Clean', fileSize: 1024, version: '1', @@ -25,7 +24,6 @@ describe('ExistingRecordTable', () => { fileName: 'existing-file-2.pdf', id: 'file-id-2', created: '2024-01-02', - author: 'Y1234', virusScannerResult: 'Clean', fileSize: 2048, version: '1', @@ -36,7 +34,6 @@ describe('ExistingRecordTable', () => { fileName: 'existing-file-3.pdf', id: 'file-id-3', created: '2024-01-03', - author: 'Y1234', virusScannerResult: 'Clean', fileSize: 3072, version: '1', @@ -240,7 +237,6 @@ describe('ExistingRecordTable', () => { fileName: 'file-with-special-chars_123.pdf', id: 'special-id', created: '2024-01-01', - author: 'Y1234', virusScannerResult: 'Clean', fileSize: 1024, version: '1', @@ -263,7 +259,6 @@ describe('ExistingRecordTable', () => { 'this-is-a-very-long-filename-that-might-cause-layout-issues-in-the-table.pdf', id: 'long-id', created: '2024-01-01', - author: 'Y1234', virusScannerResult: 'Clean', fileSize: 1024, version: '1', @@ -292,7 +287,6 @@ describe('ExistingRecordTable', () => { fileName: 'file-with-params.pdf', id: 'file-id-with-special-chars-abc123', created: '2024-01-01', - author: 'Y1234', virusScannerResult: 'Clean', fileSize: 1024, version: '1', diff --git a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ExistingRecordTable.tsx b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ExistingRecordTable.tsx index 86bd6fea06..84dadd7d70 100644 --- a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ExistingRecordTable.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ExistingRecordTable.tsx @@ -14,7 +14,7 @@ const ExistingRecordTable = ({ return (

Existing files

- +
Filename diff --git a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.test.tsx b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.test.tsx index c5c1f4c1d3..af9ed6b839 100644 --- a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.test.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.test.tsx @@ -1,5 +1,6 @@ import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { act } from 'react'; import { describe, expect, it, Mock, vi } from 'vitest'; import ReviewDetailsAssessmentStage from './ReviewDetailsAssessmentStage'; import { DOWNLOAD_STAGE } from '../../../../types/generic/downloadStage'; @@ -135,7 +136,6 @@ const createMockReviewData = ( created: '2023-12-01T10:00:00Z', virusScannerResult: 'Clean', id: 'existing-1', - author: 'Y1234', fileSize: 1024, version: '1', documentSnomedCodeType: snomedCode, @@ -175,14 +175,15 @@ const createMockUploadDocuments = (): ReviewUploadDocument[] => [ }, ]; -describe('ReviewDetailsAssessmentStage', () => { +describe('ReviewDetailsAssessmentPage', () => { beforeEach(() => { vi.clearAllMocks(); - mockUsePatientDetailsContext.mockReturnValue([null, mockSetPatientDetails]); }); describe('Rendering', () => { it('displays spinner when reviewData is null', () => { + mockUsePatientDetailsContext.mockReturnValue([null, mockSetPatientDetails]); + render( { }); it('displays spinner only when uploadDocuments is null/undefined or reviewData is null', () => { + mockUsePatientDetailsContext.mockReturnValue([null, mockSetPatientDetails]); + const { rerender } = render( { />, ); - expect(screen.getByText(/Review the new Scanned paper notes/i)).toBeInTheDocument(); + expect( + screen.getByText(/Review the new and existing Scanned paper notes/i), + ).toBeInTheDocument(); }); - it('renders page title for review the new scanned paper notes', () => { + it('renders page title for review with existing and new files', () => { + mockUsePatientDetailsContext.mockReturnValue([null, mockSetPatientDetails]); + render( { />, ); - expect(screen.getByText(/Review the new scanned paper notes/)).toBeInTheDocument(); + expect( + screen.getByText(/Review the new and existing Scanned paper notes/i), + ).toBeInTheDocument(); }); it('renders accept/reject radio buttons when only canBeDiscarded is true', () => { + mockUsePatientDetailsContext.mockReturnValue([null, mockSetPatientDetails]); + render( { uploadDocuments={createMockUploadDocuments()} downloadStage={DOWNLOAD_STAGE.SUCCEEDED} setDownloadStage={mockSetDownloadStage} - hasExistingRecordInStorage={true} + hasExistingRecordInStorage={false} />, ); @@ -261,7 +272,30 @@ describe('ReviewDetailsAssessmentStage', () => { expect(screen.getByRole('radio', { name: 'Reject record' })).toBeInTheDocument(); }); + it('renders add-all and choose-files radio buttons when no existing record', () => { + mockUsePatientDetailsContext.mockReturnValue([null, mockSetPatientDetails]); + + render( + , + ); + + expect(screen.getByLabelText('Add all these files')).toBeInTheDocument(); + expect(screen.getByLabelText('Choose which files to add')).toBeInTheDocument(); + expect( + screen.queryByText(/I don't need these files, they are duplicates/), + ).not.toBeInTheDocument(); + }); + it('renders all radio options when has existing record in storage', () => { + mockUsePatientDetailsContext.mockReturnValue([null, mockSetPatientDetails]); + render( { name: /Add all files to the existing Scanned paper notes/i, }), ).toBeInTheDocument(); + expect( + screen.getByRole('radio', { name: /Choose which files to add to the existing/i }), + ).toBeInTheDocument(); expect( screen.getByRole('radio', { name: /I don't need these files, they are duplicates/i, @@ -286,6 +323,8 @@ describe('ReviewDetailsAssessmentStage', () => { }); it('displays existing files table when available', () => { + mockUsePatientDetailsContext.mockReturnValue([null, mockSetPatientDetails]); + render( { }); it('displays new files table', () => { + mockUsePatientDetailsContext.mockReturnValue([null, mockSetPatientDetails]); + render( { }); it('displays "all files" viewing message by default', () => { + mockUsePatientDetailsContext.mockReturnValue([null, mockSetPatientDetails]); + render( { uploadDocuments={createMockUploadDocuments()} downloadStage={DOWNLOAD_STAGE.SUCCEEDED} setDownloadStage={mockSetDownloadStage} - hasExistingRecordInStorage={true} + hasExistingRecordInStorage={false} />, ); @@ -374,7 +417,9 @@ describe('ReviewDetailsAssessmentStage', () => { ); const viewButtons = screen.getAllByRole('button', { name: /View/i }); - await user.click(viewButtons[1]); + await act(async () => { + await user.click(viewButtons[1]); + }); await waitFor(() => { expect(mockSetDownloadStage).toHaveBeenCalledWith(DOWNLOAD_STAGE.PENDING); @@ -399,7 +444,9 @@ describe('ReviewDetailsAssessmentStage', () => { ); const viewButtons = screen.getAllByRole('button', { name: /View/i }); - await user.click(viewButtons[1]); + await act(async () => { + await user.click(viewButtons[1]); + }); await waitFor(() => { expect(mockGetReviewById).toHaveBeenCalled(); @@ -424,7 +471,9 @@ describe('ReviewDetailsAssessmentStage', () => { ); const viewButtons = screen.getAllByRole('button', { name: /View/i }); - await user.click(viewButtons[1]); + await act(async () => { + await user.click(viewButtons[1]); + }); await waitFor(() => { expect( @@ -457,7 +506,9 @@ describe('ReviewDetailsAssessmentStage', () => { const existingFileViewButton = screen.getByTestId('existing-record-table'); const viewButton = existingFileViewButton.querySelector('button'); - await user.click(viewButton!); + await act(async () => { + await user.click(viewButton!); + }); await waitFor(() => { expect( @@ -522,7 +573,9 @@ describe('ReviewDetailsAssessmentStage', () => { ); const viewButtons = screen.getAllByRole('button', { name: /View duplicate.pdf/i }); - await user.click(viewButtons[0]); // Click first duplicate + await act(async () => { + await user.click(viewButtons[0]); // Click first duplicate + }); await waitFor(() => { expect(screen.getByText(/\(new files\)/)).toBeInTheDocument(); @@ -572,7 +625,6 @@ describe('ReviewDetailsAssessmentStage', () => { created: '2023-12-01T10:00:00Z', virusScannerResult: 'Clean', id: 'existing-1', - author: 'Y1234', fileSize: 1024, version: '1', documentSnomedCodeType: '16521000000101' as DOCUMENT_TYPE, @@ -596,7 +648,9 @@ describe('ReviewDetailsAssessmentStage', () => { const existingFileViewButton = screen.getByTestId('existing-record-table'); const viewButton = existingFileViewButton.querySelector('button'); - await user.click(viewButton!); + await act(async () => { + await user.click(viewButton!); + }); await waitFor(() => { expect(screen.getByText(/\(existing files\)/)).toBeInTheDocument(); @@ -636,6 +690,28 @@ describe('ReviewDetailsAssessmentStage', () => { expect(addAllRadio).toBeChecked(); }); + it('allows selecting choose-files option', async () => { + const user = userEvent.setup(); + + render( + , + ); + + const chooseFilesRadio = screen.getByLabelText( + /Choose which files to add to the existing/i, + ); + await user.click(chooseFilesRadio); + + expect(chooseFilesRadio).toBeChecked(); + }); + it('allows selecting duplicate option', async () => { const user = userEvent.setup(); @@ -673,7 +749,7 @@ describe('ReviewDetailsAssessmentStage', () => { uploadDocuments={createMockUploadDocuments()} downloadStage={DOWNLOAD_STAGE.SUCCEEDED} setDownloadStage={mockSetDownloadStage} - hasExistingRecordInStorage={true} + hasExistingRecordInStorage={false} />, ); @@ -698,7 +774,7 @@ describe('ReviewDetailsAssessmentStage', () => { uploadDocuments={createMockUploadDocuments()} downloadStage={DOWNLOAD_STAGE.SUCCEEDED} setDownloadStage={mockSetDownloadStage} - hasExistingRecordInStorage={true} + hasExistingRecordInStorage={false} />, ); @@ -761,6 +837,34 @@ describe('ReviewDetailsAssessmentStage', () => { ); }); + it('navigates to choose which files when choose-files is selected', async () => { + const user = userEvent.setup(); + + render( + , + ); + + const chooseFilesRadio = screen.getByRole('radio', { + name: /Choose which files to add to the existing/i, + }); + await user.click(chooseFilesRadio); + + const continueButton = screen.getByRole('button', { name: 'Continue' }); + await user.click(continueButton); + + expect(mockedUseNavigate).toHaveBeenCalledWith( + '/admin/reviews/test-review-id.v1/files', + undefined, + ); + }); + it('navigates to no files choice when duplicate is selected', async () => { const user = userEvent.setup(); @@ -799,7 +903,7 @@ describe('ReviewDetailsAssessmentStage', () => { uploadDocuments={createMockUploadDocuments()} downloadStage={DOWNLOAD_STAGE.SUCCEEDED} setDownloadStage={mockSetDownloadStage} - hasExistingRecordInStorage={true} + hasExistingRecordInStorage={false} />, ); @@ -904,7 +1008,9 @@ describe('ReviewDetailsAssessmentStage', () => { ); const viewButtons = screen.getAllByRole('button', { name: /View/i }); - await user.click(viewButtons[1]); + await act(async () => { + await user.click(viewButtons[1]); + }); await waitFor(() => { expect(mockedUseNavigate).toHaveBeenCalledWith('/session-expired'); @@ -928,7 +1034,9 @@ describe('ReviewDetailsAssessmentStage', () => { ); const viewButtons = screen.getAllByRole('button', { name: /View/i }); - await user.click(viewButtons[1]); + await act(async () => { + await user.click(viewButtons[1]); + }); await waitFor(() => { expect(mockedUseNavigate).toHaveBeenCalledWith( @@ -975,7 +1083,7 @@ describe('ReviewDetailsAssessmentStage', () => { uploadDocuments={singleUploadDoc} downloadStage={DOWNLOAD_STAGE.SUCCEEDED} setDownloadStage={mockSetDownloadStage} - hasExistingRecordInStorage={true} + hasExistingRecordInStorage={false} />, ); @@ -1040,7 +1148,7 @@ describe('ReviewDetailsAssessmentStage', () => { uploadDocuments={multiUploadDocs} downloadStage={DOWNLOAD_STAGE.SUCCEEDED} setDownloadStage={mockSetDownloadStage} - hasExistingRecordInStorage={true} + hasExistingRecordInStorage={false} />, ); @@ -1075,47 +1183,4 @@ describe('ReviewDetailsAssessmentStage', () => { expect(screen.getByTestId('back-button')).toBeInTheDocument(); }); }); - - describe('Redirect behavior when no existing record in storage', () => { - it('redirects to add more choice page with replace option when hasExistingRecordInStorage is false', async () => { - vi.useFakeTimers(); - - render( - , - ); - - // Fast-forward timers to trigger the setTimeout - await vi.advanceTimersByTimeAsync(0); - - expect(mockedUseNavigate).toHaveBeenCalledWith( - '/admin/reviews/test-review-id.v1/add-more-choice', - { replace: true }, - ); - - vi.useRealTimers(); - }); - - it('renders empty fragment when redirecting', () => { - const { container } = render( - , - ); - - // Should render empty fragment (no content) - expect(container.firstChild).toBeNull(); - }); - }); }); diff --git a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.tsx b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.tsx index a0267f8ae9..340e70abbb 100644 --- a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.tsx @@ -12,10 +12,7 @@ import Spinner from '../../../generic/spinner/Spinner'; import ExistingRecordTable from './ExistingRecordTable'; import useBaseAPIHeaders from '../../../../helpers/hooks/useBaseAPIHeaders'; import useBaseAPIUrl from '../../../../helpers/hooks/useBaseAPIUrl'; -import { - getFormattedDateFromString, - getFormattedDateTimeFromString, -} from '../../../../helpers/utils/formatDate'; +import { getFormattedDateFromString } from '../../../../helpers/utils/formatDate'; import { GetDocumentReviewDto, ReviewDetails, @@ -31,7 +28,6 @@ import DocumentUploadLloydGeorgePreview from '../../_documentUpload/documentUplo import { AxiosError } from 'axios'; import { errorToParams } from '../../../../helpers/utils/errorToParams'; import PatientSummary, { PatientInfo } from '../../../generic/patientSummary/PatientSummary'; -import { CreatedByText } from '../../../generic/createdBy/createdBy'; type FileAction = 'add-all' | 'choose-files' | 'duplicate' | 'accept' | 'reject' | ''; @@ -66,20 +62,10 @@ const ReviewDetailsAssessmentStage = ({ const baseUrl = useBaseAPIUrl(); const baseHeaders = useBaseAPIHeaders(); - if (!hasExistingRecordInStorage && reviewId !== undefined) { - setTimeout(() => { - navigateUrlParam(routeChildren.ADMIN_REVIEW_ADD_MORE_CHOICE, { reviewId }, navigate, { - replace: true, - }); - }, 0); - return <>; - } - const handleExistingFileView = async (filename: string, id: string): Promise => { if (!reviewData) { return; } - if (isLocal) { const file = reviewData.existingFiles?.find((f) => f.fileName === filename); if (!file) { @@ -223,7 +209,8 @@ const ReviewDetailsAssessmentStage = ({ if (reviewConfig.canBeUpdated === false && reviewConfig.canBeDiscarded) { pageTitle = 'Do you want to accept these records?'; } else if (reviewConfig.canBeUpdated && reviewConfig.canBeDiscarded) { - pageTitle = reviewConfig.content.reviewAssessmentPageTitle as string; + const andExisting = reviewData.existingFiles!.length > 0 ? ' and existing ' : ' '; + pageTitle = `Review the new${andExisting}${reviewTypeLabel.toSentenceCase()}`; } else { pageTitle = `Review the ${reviewTypeLabel.toSentenceCase()}`; } @@ -270,6 +257,15 @@ const ReviewDetailsAssessmentStage = ({ > Add all files to the existing {reviewTypeLabel.toSentenceCase()} + { + setFileAction(e.currentTarget.value as FileAction); + }} + > + Choose which files to add to the existing {reviewTypeLabel.toSentenceCase()} + You are currently viewing: all files

+ f.file.name.endsWith('.pdf'))} setMergedPdfBlob={(): void => {}} stitchedBlobLoaded={(): void => {}} - isReview={true} documentConfig={reviewConfig} - > - - + /> )} @@ -448,17 +438,8 @@ const ReviewDetailsAssessmentStage = ({ )} setMergedPdfBlob={(): void => {}} stitchedBlobLoaded={(): void => {}} - isReview={true} documentConfig={reviewConfig} - > - - + /> )} )} diff --git a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.tsx b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.tsx index 6bca6a24ab..2ca7a98cad 100644 --- a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.tsx @@ -65,7 +65,6 @@ const ReviewDetailsDocumentSelectOrderStage = ({ confirmFiles={(): void => {}} onSuccess={onSuccess} isReview={true} - reviewData={reviewData} /> ); }; diff --git a/app/src/components/blocks/_admin/reviewDetailsPatientSearchStage/ReviewDetailsPatientSearchStage.tsx b/app/src/components/blocks/_admin/reviewDetailsPatientSearchStage/ReviewDetailsPatientSearchStage.tsx index 8bfe9e4440..ecd22965ab 100644 --- a/app/src/components/blocks/_admin/reviewDetailsPatientSearchStage/ReviewDetailsPatientSearchStage.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsPatientSearchStage/ReviewDetailsPatientSearchStage.tsx @@ -29,9 +29,8 @@ import { RecordLayout } from '../../../generic/recordCard/RecordCard'; import { RecordLoader, RecordLoaderProps } from '../../../generic/recordLoader/RecordLoader'; import { getConfigForDocType } from '../../../../helpers/utils/documentType'; import { DOWNLOAD_STAGE } from '../../../../types/generic/downloadStage'; +import { getFormattedDateFromString } from '../../../../helpers/utils/formatDate'; import { ReviewUploadDocument } from '../../../../types/pages/UploadDocumentsPage/types'; -import { getFormattedDateTimeFromString } from '../../../../helpers/utils/formatDate'; -import { CreatedByCard } from '../../../generic/createdBy/createdBy'; export const incorrectFormatMessage = "Enter patient's 10 digit NHS number"; @@ -138,6 +137,7 @@ const ReviewDetailsPatientSearchStage = ({ const recordDetailsProps: RecordLoaderProps = { downloadStage: DOWNLOAD_STAGE.SUCCEEDED, + lastUpdated: getFormattedDateFromString(reviewData.lastUpdated), childrenIfFailiure:

Failure: failed to load documents

, fileName: !reviewConfig.multifileReview && reviewData.files?.length === 1 @@ -236,13 +236,7 @@ const ReviewDetailsPatientSearchStage = ({ setMergedPdfBlob={(): void => {}} documentConfig={reviewConfig} isReview={true} - > - - + /> ); diff --git a/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.tsx b/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.tsx index 619d31e5b5..6dbd256d43 100644 --- a/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.tsx +++ b/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.tsx @@ -7,7 +7,7 @@ import useConfig from '../../../../helpers/hooks/useConfig'; import useRole from '../../../../helpers/hooks/useRole'; import useTitle from '../../../../helpers/hooks/useTitle'; import { getConfigForDocType } from '../../../../helpers/utils/documentType'; -import { getFormattedDateTimeFromString } from '../../../../helpers/utils/formatDate'; +import { getFormattedDateFromString } from '../../../../helpers/utils/formatDate'; import { setFullScreen } from '../../../../helpers/utils/fullscreen'; import { handleSearch as handlePatientSearch } from '../../../../helpers/utils/handlePatientSearch'; import { usePatientDetailsContext } from '../../../../providers/patientProvider/PatientProvider'; @@ -35,7 +35,6 @@ import { errorToParams } from '../../../../helpers/utils/errorToParams'; import waitForSeconds from '../../../../helpers/utils/waitForSeconds'; import DocumentUploadLloydGeorgePreview from '../../_documentUpload/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview'; import { NHS_NUMBER_UNKNOWN } from '../../../../helpers/constants/numbers'; -import { CreatedByCard } from '../../../generic/createdBy/createdBy'; export type ReviewsDetailsStageProps = { reviewData: ReviewDetails; @@ -107,9 +106,9 @@ const ReviewsDetailsStage = ({ anchor.remove(); } }; - const recordDetailsProps: RecordLoaderProps = { downloadStage, + lastUpdated: getFormattedDateFromString(reviewData.lastUpdated), childrenIfFailiure:

Failure: failed to load documents

, fileName: !reviewConfig.multifileReview && reviewData.files && reviewData.files.length === 1 @@ -335,15 +334,7 @@ const ReviewsDetailsStage = ({ setMergedPdfBlob={(): void => {}} documentConfig={reviewConfig} isReview={true} - > - - + /> diff --git a/app/src/components/blocks/_documentUpload/documentSelectOrderStage/DocumentSelectOrderStage.tsx b/app/src/components/blocks/_documentUpload/documentSelectOrderStage/DocumentSelectOrderStage.tsx index db09b81626..e209f9be97 100644 --- a/app/src/components/blocks/_documentUpload/documentSelectOrderStage/DocumentSelectOrderStage.tsx +++ b/app/src/components/blocks/_documentUpload/documentSelectOrderStage/DocumentSelectOrderStage.tsx @@ -24,9 +24,6 @@ import ErrorBox from '../../../layout/errorBox/ErrorBox'; import DocumentUploadLloydGeorgePreview from '../documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview'; import SpinnerButton from '../../../generic/spinnerButton/SpinnerButton'; import { DOCUMENT_TYPE_CONFIG } from '../../../../helpers/utils/documentType'; -import { CreatedByText } from '../../../generic/createdBy/createdBy'; -import { getFormattedDateTimeFromString } from '../../../../helpers/utils/formatDate'; -import { ReviewDetails } from '../../../../types/generic/reviews'; type Props = { documents: UploadDocument[] | ReviewUploadDocument[]; @@ -37,7 +34,6 @@ type Props = { confirmFiles: () => void; onSuccess?: () => void; isReview?: boolean; - reviewData?: ReviewDetails; }; type FormData = { @@ -55,7 +51,6 @@ const DocumentSelectOrderStage = ({ confirmFiles, onSuccess, isReview = false, - reviewData, }: Readonly): JSX.Element => { const navigate = useEnhancedNavigate(); const journey = getJourney(); @@ -477,18 +472,7 @@ const DocumentSelectOrderStage = ({ setStitchedBlobLoaded(loaded); }} documentConfig={documentConfig} - isReview={isReview} - > - {isReview && reviewData && ( - - )} - + /> {documents.length > 0 && stitchedBlobLoaded && ( + {showFiles && ( +
+ {failedDocuments.map((doc) => ( +
+ {doc.file.name} +
+
+ ))} +
+ )} +
+

What you need to do

- We uploaded {documents.length - failedDocuments.length} out of{' '} - {documents.length} files. -
- {failedDocuments.length} files could not be uploaded. + You must note which files uploaded successfully, then return to the + patient's record to upload any files that failed.

-

There may be a problem with your files.

- -
-

Files that could not be uploaded

- - - {showFiles && ( -
- {failedDocuments.map((doc) => ( -
-

{doc.file.name}

-
- ))} -
- )} - -

What you need to do

-

You must note which files did not upload.

- -

- Remove any passwords from files and check that all files open correctly. - Then return to the patient's record to upload them again. -

- -

Get help

-

- Contact your local IT support desk to resolve the problems with these - files. -

- - -
- + + ) : ( <>

What happens next

diff --git a/app/src/components/blocks/_documentUpload/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview.tsx b/app/src/components/blocks/_documentUpload/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview.tsx index 5e4fd0ac0d..0f476dabc3 100644 --- a/app/src/components/blocks/_documentUpload/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview.tsx +++ b/app/src/components/blocks/_documentUpload/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview.tsx @@ -12,7 +12,6 @@ type Props = { documentConfig: DOCUMENT_TYPE_CONFIG; isReview?: boolean; showCurrentlyViewingText?: boolean; - children?: React.ReactNode; }; const DocumentUploadLloydGeorgePreview = ({ @@ -22,7 +21,6 @@ const DocumentUploadLloydGeorgePreview = ({ documentConfig, isReview = false, showCurrentlyViewingText, - children, }: Props): JSX.Element => { const [mergedPdfUrl, setMergedPdfUrl] = useState(''); const journey = getJourney(); @@ -74,8 +72,8 @@ const DocumentUploadLloydGeorgePreview = ({ {documentConfig.stitched ? ( <>

- {documentConfig.content.stitchedPreviewFirstParagraph} - + This shows how these {documentConfig.displayName} will look when + combined into a single document.{' '} {journey === 'update' && `Any files added will appear after the existing ${documentConfig.displayName}.`}

@@ -108,7 +106,6 @@ const DocumentUploadLloydGeorgePreview = ({ )} )} - {isReview && <>{children}} {documents && mergedPdfUrl && ( )} diff --git a/app/src/components/blocks/_lloydGeorge/lloydGeorgeViewRecordStage/LloydGeorgeViewRecordStage.tsx b/app/src/components/blocks/_lloydGeorge/lloydGeorgeViewRecordStage/LloydGeorgeViewRecordStage.tsx index d3f6fccea3..acdcab34f0 100644 --- a/app/src/components/blocks/_lloydGeorge/lloydGeorgeViewRecordStage/LloydGeorgeViewRecordStage.tsx +++ b/app/src/components/blocks/_lloydGeorge/lloydGeorgeViewRecordStage/LloydGeorgeViewRecordStage.tsx @@ -169,7 +169,6 @@ const LloydGeorgeViewRecordStage = ({ patientDetails, lloydGeorgeConfig as DOCUMENT_TYPE_CONFIG, ), - author: 'Y1234', version: 'mock-version-id', created: new Date().toISOString(), fileSize: 12345, diff --git a/app/src/components/blocks/_patientDocuments/documentView/DocumentView.test.tsx b/app/src/components/blocks/_patientDocuments/documentView/DocumentView.test.tsx index 3e7eecfb9b..4ab60d1b95 100644 --- a/app/src/components/blocks/_patientDocuments/documentView/DocumentView.test.tsx +++ b/app/src/components/blocks/_patientDocuments/documentView/DocumentView.test.tsx @@ -51,7 +51,6 @@ const EMBEDDED_PDF_VIEWER_TITLE = 'Embedded PDF Viewer'; const mockDocumentReference: DocumentReference = { id: 'test-id', fileName: 'test-document.pdf', - author: 'Y12345', created: '2023-01-01T10:00:00Z', url: 'https://example.com/document.pdf', contentType: 'application/pdf', @@ -62,20 +61,6 @@ const mockDocumentReference: DocumentReference = { isPdf: true, }; -const mockDocumentRefNotPDF: DocumentReference = { - id: 'test-id', - fileName: 'test-document.pdf', - author: 'Y12345', - created: '2023-01-01T10:00:00Z', - url: 'https://example.com/document.pdf', - contentType: '', - documentSnomedCodeType: DOCUMENT_TYPE.LLOYD_GEORGE, - version: '1', - virusScannerResult: 'clean', - fileSize: 1024, - isPdf: false, -}; - const mockPatientDetails = buildPatientDetails(); const simulateFullscreenChange = (isFullscreen: boolean): void => { @@ -237,8 +222,7 @@ describe('DocumentView', () => { it('displays formatted creation date', () => { renderComponent(); - expect(screen.queryByTestId('document-file-name')).not.toBeInTheDocument(); - expect(screen.getByText(/Created by practice:/)).toBeInTheDocument(); + expect(screen.getByText(/Last updated:/)).toBeInTheDocument(); }); it('displays document type label in record card', () => { @@ -248,12 +232,6 @@ describe('DocumentView', () => { buildDocumentConfig().content.viewDocumentTitle as string, ); }); - - it('displays file name, document is not a PDF', () => { - renderComponent(mockDocumentRefNotPDF); - - expect(screen.queryByTestId('document-file-name')).toBeInTheDocument(); - }); }); describe('Add Files functionality', () => { diff --git a/app/src/components/blocks/_patientDocuments/documentView/DocumentView.tsx b/app/src/components/blocks/_patientDocuments/documentView/DocumentView.tsx index 42988035c9..edac3e6364 100644 --- a/app/src/components/blocks/_patientDocuments/documentView/DocumentView.tsx +++ b/app/src/components/blocks/_patientDocuments/documentView/DocumentView.tsx @@ -72,17 +72,11 @@ const DocumentView = ({ return (
- {!documentReference.isPdf && ( -
- File name: {documentReference.fileName} -
- )}
- Created by practice: {documentReference.author} on{' '} - {getFormattedDate(new Date(documentReference.created))} + Filename: {documentReference.fileName} +
+
+ Last updated: {getFormattedDate(new Date(documentReference.created))}
diff --git a/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.test.tsx b/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.test.tsx index 1efc4e3f56..d5ad7801a8 100644 --- a/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.test.tsx +++ b/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.test.tsx @@ -316,12 +316,10 @@ describe('PatientVerifyPage', () => { }); await userEvent.click(confirmButton); - await waitFor(() => { - expect(screen.getByText('There is a problem')).toBeInTheDocument(); + await waitFor(async () => { + const results = await runAxeTest(document.body); + expect(results).toHaveNoViolations(); }); - - const results = await runAxeTest(document.body); - expect(results).toHaveNoViolations(); }); }); }); diff --git a/app/src/components/generic/createdBy/createdBy.test.tsx b/app/src/components/generic/createdBy/createdBy.test.tsx deleted file mode 100644 index b92f147efb..0000000000 --- a/app/src/components/generic/createdBy/createdBy.test.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { render, screen } from '@testing-library/react'; -import { CreatedByCard, CreatedByText } from './createdBy'; - -describe('createdBy.tsx', () => { - describe('CreatedByCard', () => { - const defaultProps = { - odsCode: 'Y12345', - dateUploaded: '2024-01-15', - }; - - it('renders the card with odsCode and dateUploaded', () => { - render(); - - expect( - screen.getByText( - `Created by practice ${defaultProps.odsCode} on ${defaultProps.dateUploaded}`, - ), - ).toBeInTheDocument(); - }); - - it('applies custom cssClass when provided', () => { - const customClass = 'custom-test-class'; - const { container } = render( - , - ); - - const cardContent = container.querySelector(`.${customClass}`); - expect(cardContent).toBeInTheDocument(); - }); - - it('renders without cssClass when not provided', () => { - const { container } = render(); - - const cardContent = container.firstChild; - expect(cardContent).not.toHaveClass('custom-test-class'); - }); - }); - - describe('CreatedByText', () => { - const defaultProps = { - odsCode: 'A98765', - dateUploaded: '2024-06-20', - }; - - it('renders the text with odsCode and dateUploaded', () => { - render(); - - expect( - screen.getByText( - `Created by practice ${defaultProps.odsCode} on ${defaultProps.dateUploaded}`, - ), - ).toBeInTheDocument(); - }); - - it('renders as a paragraph element', () => { - render(); - - const paragraph = screen.getByText(/Created by practice/); - expect(paragraph.tagName).toBe('P'); - }); - - it('applies custom cssClass when provided', () => { - const customClass = 'text-style-class'; - const { container } = render( - , - ); - - const paragraph = container.querySelector(`.${customClass}`); - expect(paragraph).toBeInTheDocument(); - }); - - it('renders without cssClass when not provided', () => { - const { container } = render(); - - const paragraph = container.firstChild; - expect(paragraph).not.toHaveClass('text-style-class'); - }); - }); -}); diff --git a/app/src/components/generic/createdBy/createdBy.tsx b/app/src/components/generic/createdBy/createdBy.tsx deleted file mode 100644 index 3102ebd63c..0000000000 --- a/app/src/components/generic/createdBy/createdBy.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { Card } from 'nhsuk-react-components'; -import { JSX } from 'react'; - -export type CreatedByProps = { - odsCode: string; - dateUploaded: string; - cssClass?: string; -}; - -export const CreatedByCard = ({ odsCode, dateUploaded, cssClass }: CreatedByProps): JSX.Element => ( - - Created by practice {odsCode} on {dateUploaded} - -); - -export const CreatedByText = ({ odsCode, dateUploaded, cssClass }: CreatedByProps): JSX.Element => ( -

- Created by practice {odsCode} on {dateUploaded} -

-); diff --git a/app/src/components/generic/recordLoader/RecordLoader.test.tsx b/app/src/components/generic/recordLoader/RecordLoader.test.tsx index 8cc2375b5d..586516627c 100644 --- a/app/src/components/generic/recordLoader/RecordLoader.test.tsx +++ b/app/src/components/generic/recordLoader/RecordLoader.test.tsx @@ -343,6 +343,12 @@ describe('RecordDetails', () => { }); describe('Edge Cases', () => { + it('handles empty string for lastUpdated', () => { + render(); + + expect(screen.getByText('Last updated:')).toBeInTheDocument(); + }); + it('handles long date strings', () => { const longDate = 'Wednesday, 25th December 2024 at 12:30:45pm GMT'; render(); diff --git a/app/src/components/generic/recordLoader/RecordLoader.tsx b/app/src/components/generic/recordLoader/RecordLoader.tsx index 3d8f5cfbcb..917c4dac49 100644 --- a/app/src/components/generic/recordLoader/RecordLoader.tsx +++ b/app/src/components/generic/recordLoader/RecordLoader.tsx @@ -4,7 +4,7 @@ import ProgressBar from '../progressBar/ProgressBar'; export type RecordLoaderProps = { downloadStage: DOWNLOAD_STAGE; - lastUpdated?: string; + lastUpdated: string; childrenIfFailiure: React.JSX.Element; fileName: string; downloadAction?: (e: React.MouseEvent) => void; @@ -23,10 +23,6 @@ export const RecordLoader = ({ fileName, }; - if (!lastUpdated && !fileName) { - return <>; - } - switch (downloadStage) { case DOWNLOAD_STAGE.INITIAL: case DOWNLOAD_STAGE.PENDING: @@ -52,7 +48,7 @@ export const RecordLoader = ({ }; export type RecordDetailsProps = { - lastUpdated?: string; + lastUpdated: string; fileName: string; downloadAction?: (e: React.MouseEvent) => void; }; @@ -65,11 +61,9 @@ export const RecordDetails = ({ return (
- {lastUpdated && ( -
-

Last updated: {lastUpdated}

-
- )} +
+

Last updated: {lastUpdated}

+
{fileName && (

diff --git a/app/src/config/electronicHealthRecordAttachmentsConfig.json b/app/src/config/electronicHealthRecordAttachmentsConfig.json index 143194f974..4fbc76278b 100644 --- a/app/src/config/electronicHealthRecordAttachmentsConfig.json +++ b/app/src/config/electronicHealthRecordAttachmentsConfig.json @@ -34,10 +34,6 @@ "previewUploadTitle": "Preview electronic health record attachment", "uploadFilesExtraParagraph": "", "reviewDocumentTitle": "EHR Attachments", - "skipDocumentLinkText": "Continue without uploading any EHR attachments", - "addMoreFilesRadioNoText": "", - "addMoreFilesRadioYesText": "", - "reviewAssessmentPageTitle": "", - "stitchedPreviewFirstParagraph": "" + "skipDocumentLinkText": "Continue without uploading any EHR attachments" } } \ No newline at end of file diff --git a/app/src/config/lettersAndDocumentsConfig.json b/app/src/config/lettersAndDocumentsConfig.json index 7cfca13cb1..98a7f42f72 100644 --- a/app/src/config/lettersAndDocumentsConfig.json +++ b/app/src/config/lettersAndDocumentsConfig.json @@ -32,10 +32,6 @@ "beforeYouUploadTitle": "Before you upload", "previewUploadTitle": "Preview your PDF files", "uploadFilesExtraParagraph": "", - "reviewDocumentTitle": "Letters and documents", - "addMoreFilesRadioNoText": "", - "addMoreFilesRadioYesText": "", - "reviewAssessmentPageTitle": "", - "stitchedPreviewFirstParagraph": "" + "reviewDocumentTitle": "Letters and documents" } } \ No newline at end of file diff --git a/app/src/config/lloydGeorgeConfig.json b/app/src/config/lloydGeorgeConfig.json index fcf835621a..a35946e31b 100644 --- a/app/src/config/lloydGeorgeConfig.json +++ b/app/src/config/lloydGeorgeConfig.json @@ -31,12 +31,8 @@ "confirmFilesTableTitle": "Scanned paper notes to upload", "confirmFilesTableParagraph": "", "beforeYouUploadTitle": "Before you upload", - "previewUploadTitle": "Preview existing scanned paper notes record", + "previewUploadTitle": "Preview these scanned paper notes", "uploadFilesExtraParagraph": "You can add a note to the patient's electronic health record to say their Lloyd George record is stored in this service. Use SNOMED code 16521000000101.", - "reviewDocumentTitle": "Scanned paper notes", - "addMoreFilesRadioNoText": "No, I don't have anymore scanned paper notes to add for this patient", - "addMoreFilesRadioYesText": "Yes, I have more scanned paper notes to add for this patient", - "reviewAssessmentPageTitle": "Review the new scanned paper notes", - "stitchedPreviewFirstParagraph": "This shows how the final notes will look when combined into a single document. " + "reviewDocumentTitle": "Scanned paper notes" } } \ No newline at end of file diff --git a/app/src/helpers/requests/getDocumentSearchResults.ts b/app/src/helpers/requests/getDocumentSearchResults.ts index 71840cb4ef..528b1e9676 100644 --- a/app/src/helpers/requests/getDocumentSearchResults.ts +++ b/app/src/helpers/requests/getDocumentSearchResults.ts @@ -44,7 +44,6 @@ const getDocumentSearchResults = async ({ fileName: 'document_1.pdf', created: '2023-01-01T12:00:00Z', virusScannerResult: 'CLEAN', - author: 'Y12345', id: 'mock-document-id-1', fileSize: 1024, version: '1.0', diff --git a/app/src/helpers/test/testBuilders.ts b/app/src/helpers/test/testBuilders.ts index e985aaf9ca..c53bd0fb99 100644 --- a/app/src/helpers/test/testBuilders.ts +++ b/app/src/helpers/test/testBuilders.ts @@ -110,7 +110,6 @@ const buildUploadSession = (documents: Array): UploadSession => const buildSearchResult = (searchResultOverride?: Partial): SearchResult => { const result: SearchResult = { - author: 'Y12345', fileName: 'fileName.pdf', created: moment().format(), virusScannerResult: 'Clean', diff --git a/app/src/helpers/utils/documentType.ts b/app/src/helpers/utils/documentType.ts index eb9c382f52..d1e60497c0 100644 --- a/app/src/helpers/utils/documentType.ts +++ b/app/src/helpers/utils/documentType.ts @@ -26,11 +26,7 @@ export type ContentKey = | 'uploadFilesBulletPoints' | 'skipDocumentLinkText' | 'confirmFilesTableTitle' - | 'confirmFilesTableParagraph' - | 'addMoreFilesRadioNoText' - | 'addMoreFilesRadioYesText' - | 'reviewAssessmentPageTitle' - | 'stitchedPreviewFirstParagraph'; + | 'confirmFilesTableParagraph'; export interface IndividualDocumentTypeContent extends Record {} // The individual config for each document type diff --git a/app/src/helpers/utils/documentUpload.test.ts b/app/src/helpers/utils/documentUpload.test.ts index 47b76db592..fb4e11fdc5 100644 --- a/app/src/helpers/utils/documentUpload.test.ts +++ b/app/src/helpers/utils/documentUpload.test.ts @@ -5,7 +5,6 @@ import { goToPreviousDocType, handleDocReviewStatusResult, handleDocStatusResult, - handleDocumentStatusUpdates, reduceDocumentsForUpload, startIntervalTimer, } from './documentUpload'; @@ -23,12 +22,6 @@ import { uploadDocumentForReview } from '../requests/documentReview'; import * as isLocal from './isLocal'; import { DocumentReviewStatus } from '../../types/blocks/documentReview'; import { buildDocumentConfig } from '../test/testBuilders'; -import { routes, routeChildren } from '../../types/generic/routes'; -import { - MAX_POLLING_TIME, - UPDATE_DOCUMENT_STATE_FREQUENCY_MILLISECONDS, -} from '../constants/network'; -import * as urlManipulations from './urlManipulations'; vi.mock('../requests/uploadDocuments'); vi.mock('../requests/documentReview'); @@ -420,33 +413,6 @@ describe('documentUpload', () => { expect(mockSetDocuments).toHaveBeenCalledTimes(1); }); - it('should update document state to ERROR when status is INVALID', () => { - const documentStatusResult = { - 'doc-ref-1': { - status: DOCUMENT_STATUS.INVALID as const, - error_code: 'ERR_INVALID', - }, - }; - - const mockDocs: UploadDocument[] = [ - { - ...mockDocuments[0], - ref: 'doc-ref-1', - state: DOCUMENT_UPLOAD_STATE.UPLOADING, - }, - ]; - - mockSetDocuments.mockImplementation((updateFn) => { - const result = updateFn(mockDocs); - expect(result[0].state).toBe(DOCUMENT_UPLOAD_STATE.ERROR); - expect(result[0].errorCode).toBe('ERR_INVALID'); - }); - - handleDocStatusResult(documentStatusResult, mockSetDocuments); - - expect(mockSetDocuments).toHaveBeenCalledTimes(1); - }); - it('should handle multiple documents with different statuses', () => { const documentStatusResult = { 'doc-ref-1': { status: DOCUMENT_STATUS.FINAL as const }, @@ -1065,319 +1031,4 @@ describe('documentUpload', () => { expect(mockSetShowSkipLink).not.toHaveBeenCalled(); }); }); - - describe('handleDocumentStatusUpdates', () => { - const mockNavigate = Object.assign(vi.fn(), { - withParams: vi.fn(), - }); - - let mockInterval: { current: number }; - let mockVirusRef: { current: boolean }; - let mockCompleteRef: { current: boolean }; - - beforeEach(() => { - vi.clearAllMocks(); - vi.spyOn(globalThis, 'clearInterval'); - vi.spyOn(window, 'clearInterval'); - vi.spyOn(urlManipulations, 'getJourney').mockReturnValue('new'); - mockInterval = { current: 1 }; - mockVirusRef = { current: false }; - mockCompleteRef = { current: false }; - }); - - it('should navigate to SERVER_ERROR when journey param is update but journey type does not match', () => { - vi.spyOn(urlManipulations, 'getJourney').mockReturnValue('update'); - - const intervalTimer = 123; - - handleDocumentStatusUpdates( - 'new', - mockNavigate, - intervalTimer, - mockInterval, - mockDocuments, - mockVirusRef, - mockCompleteRef, - ); - - expect(globalThis.clearInterval).toHaveBeenCalledWith(intervalTimer); - expect(mockNavigate).toHaveBeenCalledWith(routes.SERVER_ERROR); - }); - - it('should navigate to SERVER_ERROR when polling time exceeds MAX_POLLING_TIME', () => { - mockInterval.current = - Math.ceil(MAX_POLLING_TIME / UPDATE_DOCUMENT_STATE_FREQUENCY_MILLISECONDS) + 1; - - const intervalTimer = 456; - - handleDocumentStatusUpdates( - 'new', - mockNavigate, - intervalTimer, - mockInterval, - mockDocuments, - mockVirusRef, - mockCompleteRef, - ); - - expect(window.clearInterval).toHaveBeenCalledWith(intervalTimer); - expect(mockNavigate).toHaveBeenCalledWith(routes.SERVER_ERROR); - }); - - it('should return early when documents array is empty', () => { - handleDocumentStatusUpdates( - 'new', - mockNavigate, - 123, - mockInterval, - [], - mockVirusRef, - mockCompleteRef, - ); - - expect(mockNavigate).not.toHaveBeenCalled(); - expect(mockNavigate.withParams).not.toHaveBeenCalled(); - }); - - it('should navigate to DOCUMENT_UPLOAD_INFECTED when a document has virus', () => { - const documentsWithVirus: UploadDocument[] = [ - { - ...mockDocuments[0], - state: DOCUMENT_UPLOAD_STATE.INFECTED, - }, - ]; - - const intervalTimer = 789; - - handleDocumentStatusUpdates( - 'new', - mockNavigate, - intervalTimer, - mockInterval, - documentsWithVirus, - mockVirusRef, - mockCompleteRef, - ); - - expect(mockVirusRef.current).toBe(true); - expect(window.clearInterval).toHaveBeenCalledWith(intervalTimer); - expect(mockNavigate).toHaveBeenCalledWith(routeChildren.DOCUMENT_UPLOAD_INFECTED); - }); - - it('should not navigate to infected page again if virusReference is already true', () => { - const documentsWithVirus: UploadDocument[] = [ - { - ...mockDocuments[0], - state: DOCUMENT_UPLOAD_STATE.INFECTED, - }, - ]; - - mockVirusRef.current = true; - - handleDocumentStatusUpdates( - 'new', - mockNavigate, - 123, - mockInterval, - documentsWithVirus, - mockVirusRef, - mockCompleteRef, - ); - - expect(mockNavigate).not.toHaveBeenCalledWith(routeChildren.DOCUMENT_UPLOAD_INFECTED); - }); - - it('should navigate to SERVER_ERROR with error params when all documents have failed', () => { - const allFailedDocs: UploadDocument[] = [ - { - ...mockDocuments[0], - state: DOCUMENT_UPLOAD_STATE.ERROR, - errorCode: 'UC_4006', - }, - { - ...mockDocuments[1], - state: DOCUMENT_UPLOAD_STATE.ERROR, - errorCode: 'UC_4007', - }, - ]; - - handleDocumentStatusUpdates( - 'new', - mockNavigate, - 123, - mockInterval, - allFailedDocs, - mockVirusRef, - mockCompleteRef, - ); - - expect(mockNavigate).toHaveBeenCalledWith(expect.stringContaining(routes.SERVER_ERROR)); - expect(mockNavigate).toHaveBeenCalledWith(expect.stringContaining('?encodedError=')); - }); - - it('should navigate to DOCUMENT_UPLOAD_COMPLETED when all documents finished successfully', () => { - const allSucceededDocs: UploadDocument[] = [ - { - ...mockDocuments[0], - state: DOCUMENT_UPLOAD_STATE.SUCCEEDED, - }, - { - ...mockDocuments[1], - state: DOCUMENT_UPLOAD_STATE.SUCCEEDED, - }, - ]; - - const intervalTimer = 101; - - handleDocumentStatusUpdates( - 'new', - mockNavigate, - intervalTimer, - mockInterval, - allSucceededDocs, - mockVirusRef, - mockCompleteRef, - ); - - expect(mockCompleteRef.current).toBe(true); - expect(window.clearInterval).toHaveBeenCalledWith(intervalTimer); - expect(mockNavigate.withParams).toHaveBeenCalledWith( - routeChildren.DOCUMENT_UPLOAD_COMPLETED, - ); - }); - - it('should not navigate to completed page again if completeRef is already true', () => { - const allSucceededDocs: UploadDocument[] = [ - { - ...mockDocuments[0], - state: DOCUMENT_UPLOAD_STATE.SUCCEEDED, - }, - ]; - - mockCompleteRef.current = true; - - handleDocumentStatusUpdates( - 'new', - mockNavigate, - 123, - mockInterval, - allSucceededDocs, - mockVirusRef, - mockCompleteRef, - ); - - expect(mockNavigate.withParams).not.toHaveBeenCalled(); - }); - - it('should navigate to completed page when mix of succeeded and error documents', () => { - const mixedDocs: UploadDocument[] = [ - { - ...mockDocuments[0], - state: DOCUMENT_UPLOAD_STATE.SUCCEEDED, - }, - { - ...mockDocuments[1], - state: DOCUMENT_UPLOAD_STATE.ERROR, - errorCode: 'UC_4006', - }, - ]; - - const intervalTimer = 202; - - handleDocumentStatusUpdates( - 'new', - mockNavigate, - intervalTimer, - mockInterval, - mixedDocs, - mockVirusRef, - mockCompleteRef, - ); - - expect(mockCompleteRef.current).toBe(true); - expect(window.clearInterval).toHaveBeenCalledWith(intervalTimer); - expect(mockNavigate.withParams).toHaveBeenCalledWith( - routeChildren.DOCUMENT_UPLOAD_COMPLETED, - ); - }); - - it('should not navigate when documents are still uploading', () => { - const uploadingDocs: UploadDocument[] = [ - { - ...mockDocuments[0], - state: DOCUMENT_UPLOAD_STATE.UPLOADING, - }, - { - ...mockDocuments[1], - state: DOCUMENT_UPLOAD_STATE.SUCCEEDED, - }, - ]; - - handleDocumentStatusUpdates( - 'new', - mockNavigate, - 123, - mockInterval, - uploadingDocs, - mockVirusRef, - mockCompleteRef, - ); - - expect(mockNavigate).not.toHaveBeenCalled(); - expect(mockNavigate.withParams).not.toHaveBeenCalled(); - }); - - it('should not navigate when documents are still scanning', () => { - const scanningDocs: UploadDocument[] = [ - { - ...mockDocuments[0], - state: DOCUMENT_UPLOAD_STATE.SCANNING, - }, - ]; - - handleDocumentStatusUpdates( - 'new', - mockNavigate, - 123, - mockInterval, - scanningDocs, - mockVirusRef, - mockCompleteRef, - ); - - expect(mockNavigate).not.toHaveBeenCalled(); - expect(mockNavigate.withParams).not.toHaveBeenCalled(); - }); - - it('should prioritize virus detection over all documents failed', () => { - const virusAndFailedDocs: UploadDocument[] = [ - { - ...mockDocuments[0], - state: DOCUMENT_UPLOAD_STATE.INFECTED, - }, - { - ...mockDocuments[1], - state: DOCUMENT_UPLOAD_STATE.ERROR, - errorCode: 'UC_4006', - }, - ]; - - const intervalTimer = 303; - - handleDocumentStatusUpdates( - 'new', - mockNavigate, - intervalTimer, - mockInterval, - virusAndFailedDocs, - mockVirusRef, - mockCompleteRef, - ); - - expect(mockNavigate).toHaveBeenCalledWith(routeChildren.DOCUMENT_UPLOAD_INFECTED); - expect(mockNavigate).not.toHaveBeenCalledWith( - expect.stringContaining(routes.SERVER_ERROR + '?'), - ); - }); - }); }); diff --git a/app/src/helpers/utils/documentUpload.ts b/app/src/helpers/utils/documentUpload.ts index cd5f181fb3..a61ce070e4 100644 --- a/app/src/helpers/utils/documentUpload.ts +++ b/app/src/helpers/utils/documentUpload.ts @@ -22,13 +22,6 @@ import { } from '../../types/blocks/documentReview'; import { getDocumentReviewStatus, uploadDocumentForReview } from '../requests/documentReview'; import { Dispatch, RefObject, SetStateAction } from 'react'; -import { EnhancedNavigate, getJourney, JourneyType } from './urlManipulations'; -import { routeChildren, routes } from '../../types/generic/routes'; -import { - MAX_POLLING_TIME, - UPDATE_DOCUMENT_STATE_FREQUENCY_MILLISECONDS, -} from '../constants/network'; -import { errorCodeToParams } from './errorToParams'; export const reduceDocumentsForUpload = async ( documents: UploadDocument[], @@ -171,7 +164,6 @@ export const handleDocStatusResult = ( case DOCUMENT_STATUS.NOT_FOUND: case DOCUMENT_STATUS.CANCELLED: - case DOCUMENT_STATUS.INVALID: updatedDoc.state = DOCUMENT_UPLOAD_STATE.ERROR; updatedDoc.errorCode = docStatus.error_code; break; @@ -251,7 +243,6 @@ export const startIntervalTimer = ( doc.state = DOCUMENT_UPLOAD_STATE.INFECTED; } else if (doc.file.name.toLocaleLowerCase() === 'virus-failed.pdf') { doc.state = DOCUMENT_UPLOAD_STATE.ERROR; - doc.errorCode = 'UC_4006'; } else { doc.state = DOCUMENT_UPLOAD_STATE.SUCCEEDED; } @@ -316,54 +307,3 @@ export const goToPreviousDocType = ( setShowSkipLink(true); setDocumentType(documentTypeList[previousDocTypeIndex]); }; - -export const handleDocumentStatusUpdates = ( - journey: JourneyType, - navigate: EnhancedNavigate, - intervalTimer: number, - interval: RefObject, - documents: UploadDocument[], - virusReference: RefObject, - completeRef: RefObject, -): void => { - const journeyParam = getJourney(); - - if (journeyParam === 'update' && journey !== journeyParam) { - globalThis.clearInterval(intervalTimer); - navigate(routes.SERVER_ERROR); - return; - } - - if (interval.current * UPDATE_DOCUMENT_STATE_FREQUENCY_MILLISECONDS > MAX_POLLING_TIME) { - globalThis.clearInterval(intervalTimer); - navigate(routes.SERVER_ERROR); - return; - } - - if (documents.length === 0) { - return; - } - - const hasVirus = documents.some((d) => d.state === DOCUMENT_UPLOAD_STATE.INFECTED); - const failedDocs = documents.filter((d) => d.state === DOCUMENT_UPLOAD_STATE.ERROR); - const allFinished = - documents.length > 0 && - documents.every( - (d) => - d.state === DOCUMENT_UPLOAD_STATE.SUCCEEDED || - d.state === DOCUMENT_UPLOAD_STATE.ERROR, - ); - - if (hasVirus && !virusReference.current) { - virusReference.current = true; - globalThis.clearInterval(intervalTimer); - navigate(routeChildren.DOCUMENT_UPLOAD_INFECTED); - } else if (failedDocs.length === documents.length) { - const errorParams = errorCodeToParams(failedDocs[0].errorCode!); - navigate(routes.SERVER_ERROR + errorParams); - } else if (allFinished && !completeRef.current) { - completeRef.current = true; - globalThis.clearInterval(intervalTimer); - navigate.withParams(routeChildren.DOCUMENT_UPLOAD_COMPLETED); - } -}; diff --git a/app/src/helpers/utils/errorCodes.ts b/app/src/helpers/utils/errorCodes.ts index 0f05528d40..93664201c6 100644 --- a/app/src/helpers/utils/errorCodes.ts +++ b/app/src/helpers/utils/errorCodes.ts @@ -42,8 +42,6 @@ const errorCodes: { [key: string]: string } = { "You cannot access this patient's record because they are not registered at your practice. The patient's current practice can access this record if it's stored in this service.", UC_4002: 'There was an issue when attempting to virus scan your uploaded files', UC_4004: technicalIssueMsg, - UC_4006: - "1 or more files failed to upload. Remove any passwords from files and check that all files open correctly. Then return to the patient's record to upload them again.", }; export default errorCodes; diff --git a/app/src/helpers/utils/fileUploadErrorMessages.ts b/app/src/helpers/utils/fileUploadErrorMessages.ts index 9742df18fe..f002c6d80e 100644 --- a/app/src/helpers/utils/fileUploadErrorMessages.ts +++ b/app/src/helpers/utils/fileUploadErrorMessages.ts @@ -74,7 +74,7 @@ export const fileUploadErrorMessages: ErrorMessageType = { invalidFileType: { inline: 'This file is not in the correct file format', errorBox: 'This file is not in the correct file format', - selectFileError: 'You cannot upload this file type.', + selectFileError: 'This file is not a PDF. Convert to PDF and try again.', }, removeFilesToSkip: { inline: 'Remove files before you skip to the next step', diff --git a/app/src/helpers/utils/formatDate.test.ts b/app/src/helpers/utils/formatDate.test.ts index 942ef00589..2ff9ad24a6 100644 --- a/app/src/helpers/utils/formatDate.test.ts +++ b/app/src/helpers/utils/formatDate.test.ts @@ -1,71 +1,329 @@ import { describe, expect, it } from 'vitest'; -import { - getFormattedDate, - getFormattedDateTime, - formatDateWithDashes, - getFormattedDateFromString, - getFormattedDateTimeFromString, -} from './formatDate'; +import { getFormattedDate, formatDateWithDashes, getFormattedDateFromString } from './formatDate'; -describe('formatDate.ts', () => { - describe('getFormattedDate', () => { - it('formats date in en-GB locale', () => { - expect(getFormattedDate(new Date('2024-01-15T00:00:00Z'))).toBe('15 January 2024'); - expect(getFormattedDate(new Date('2024-02-29T00:00:00Z'))).toBe('29 February 2024'); - expect(getFormattedDate(new Date('2025-12-31T23:59:59Z'))).toBe('31 December 2025'); +describe('getFormattedDate', () => { + it('formats date in en-GB locale with full month name', () => { + const date = new Date('2025-12-18T10:30:00Z'); + const result = getFormattedDate(date); + expect(result).toBe('18 December 2025'); + }); + + it('formats date on 1st of month', () => { + const date = new Date('2025-01-01T00:00:00Z'); + const result = getFormattedDate(date); + expect(result).toBe('1 January 2025'); + }); + + it('formats date at end of month', () => { + const date = new Date('2025-12-31T23:59:59Z'); + const result = getFormattedDate(date); + expect(result).toBe('31 December 2025'); + }); + + it('formats date in February', () => { + const date = new Date('2025-02-14T12:00:00Z'); + const result = getFormattedDate(date); + expect(result).toBe('14 February 2025'); + }); + + it('formats date with single digit day', () => { + const date = new Date('2025-03-05T08:00:00Z'); + const result = getFormattedDate(date); + expect(result).toBe('5 March 2025'); + }); + + it('formats leap year date', () => { + const date = new Date('2024-02-29T00:00:00Z'); + const result = getFormattedDate(date); + expect(result).toBe('29 February 2024'); + }); + + it('formats different months correctly', () => { + const months = [ + { date: new Date('2025-01-15'), expected: '15 January 2025' }, + { date: new Date('2025-02-15'), expected: '15 February 2025' }, + { date: new Date('2025-03-15'), expected: '15 March 2025' }, + { date: new Date('2025-04-15'), expected: '15 April 2025' }, + { date: new Date('2025-05-15'), expected: '15 May 2025' }, + { date: new Date('2025-06-15'), expected: '15 June 2025' }, + { date: new Date('2025-07-15'), expected: '15 July 2025' }, + { date: new Date('2025-08-15'), expected: '15 August 2025' }, + { date: new Date('2025-09-15'), expected: '15 September 2025' }, + { date: new Date('2025-10-15'), expected: '15 October 2025' }, + { date: new Date('2025-11-15'), expected: '15 November 2025' }, + { date: new Date('2025-12-15'), expected: '15 December 2025' }, + ]; + + months.forEach(({ date, expected }) => { + expect(getFormattedDate(date)).toBe(expected); + }); + }); + + it('formats date in different years', () => { + const date1900 = new Date('1900-01-01'); + const date2000 = new Date('2000-06-15'); + const date2099 = new Date('2099-12-31'); + + expect(getFormattedDate(date1900)).toBe('1 January 1900'); + expect(getFormattedDate(date2000)).toBe('15 June 2000'); + expect(getFormattedDate(date2099)).toBe('31 December 2099'); + }); +}); + +describe('formatDateWithDashes', () => { + it('formats date with DD-MM-YYYY format', () => { + const date = new Date('2025-12-18T10:30:00Z'); + const result = formatDateWithDashes(date); + expect(result).toBe('18-12-2025'); + }); + + it('pads single digit day with leading zero', () => { + const date = new Date('2025-01-05T00:00:00Z'); + const result = formatDateWithDashes(date); + expect(result).toBe('05-01-2025'); + }); + + it('pads single digit month with leading zero', () => { + const date = new Date('2025-09-18T00:00:00Z'); + const result = formatDateWithDashes(date); + expect(result).toBe('18-09-2025'); + }); + + it('formats date on 1st of month with leading zero', () => { + const date = new Date('2025-03-01T00:00:00Z'); + const result = formatDateWithDashes(date); + expect(result).toBe('01-03-2025'); + }); + + it('formats date at end of month without leading zero', () => { + const date = new Date('2025-12-31T23:59:59Z'); + const result = formatDateWithDashes(date); + expect(result).toBe('31-12-2025'); + }); + + it('formats February dates correctly', () => { + const date = new Date('2025-02-14T12:00:00Z'); + const result = formatDateWithDashes(date); + expect(result).toBe('14-02-2025'); + }); + + it('formats leap year date', () => { + const date = new Date('2024-02-29T00:00:00Z'); + const result = formatDateWithDashes(date); + expect(result).toBe('29-02-2024'); + }); + + it('formats all months correctly', () => { + const months = [ + { date: new Date('2025-01-15'), expected: '15-01-2025' }, + { date: new Date('2025-02-15'), expected: '15-02-2025' }, + { date: new Date('2025-03-15'), expected: '15-03-2025' }, + { date: new Date('2025-04-15'), expected: '15-04-2025' }, + { date: new Date('2025-05-15'), expected: '15-05-2025' }, + { date: new Date('2025-06-15'), expected: '15-06-2025' }, + { date: new Date('2025-07-15'), expected: '15-07-2025' }, + { date: new Date('2025-08-15'), expected: '15-08-2025' }, + { date: new Date('2025-09-15'), expected: '15-09-2025' }, + { date: new Date('2025-10-15'), expected: '15-10-2025' }, + { date: new Date('2025-11-15'), expected: '15-11-2025' }, + { date: new Date('2025-12-15'), expected: '15-12-2025' }, + ]; + + months.forEach(({ date, expected }) => { + expect(formatDateWithDashes(date)).toBe(expected); + }); + }); + + it('formats dates with single digit day and month', () => { + const date = new Date('2025-01-01T00:00:00Z'); + const result = formatDateWithDashes(date); + expect(result).toBe('01-01-2025'); + }); + + it('formats dates in different years', () => { + const date1900 = new Date('1900-01-01'); + const date2000 = new Date('2000-06-05'); + const date2099 = new Date('2099-12-09'); + + expect(formatDateWithDashes(date1900)).toBe('01-01-1900'); + expect(formatDateWithDashes(date2000)).toBe('05-06-2000'); + expect(formatDateWithDashes(date2099)).toBe('09-12-2099'); + }); + + it('handles dates with different times consistently', () => { + // Use local date construction to avoid timezone issues + const midnight = new Date(2025, 5, 15, 0, 0, 0); + const noon = new Date(2025, 5, 15, 12, 0, 0); + const endOfDay = new Date(2025, 5, 15, 23, 59, 59); + + expect(formatDateWithDashes(midnight)).toBe('15-06-2025'); + expect(formatDateWithDashes(noon)).toBe('15-06-2025'); + expect(formatDateWithDashes(endOfDay)).toBe('15-06-2025'); + }); +}); + +describe('getFormattedDateFromString', () => { + describe('empty or undefined input', () => { + it('returns empty string for undefined', () => { + const result = getFormattedDateFromString(undefined); + expect(result).toBe(''); + }); + + it('returns empty string for empty string', () => { + const result = getFormattedDateFromString(''); + expect(result).toBe(''); }); }); - describe('getFormattedDateTime', () => { - it('formats date and time in en-GB locale', () => { - const result = getFormattedDateTime(new Date('2024-06-20T13:05:00Z')); - expect(result).toContain('20 June 2024'); - expect(/\d{1,2}:[0-5][0-9]/.test(result)).toBe(true); + describe('ISO date string format', () => { + it('formats ISO date string correctly', () => { + const result = getFormattedDateFromString('2025-12-18T10:30:00Z'); + expect(result).toBe('18 December 2025'); + }); + + it('formats ISO date without time', () => { + const result = getFormattedDateFromString('2025-01-15'); + expect(result).toBe('15 January 2025'); + }); + + it('formats ISO date with timezone offset', () => { + const result = getFormattedDateFromString('2025-06-15T14:30:00+01:00'); + expect(result).toBe('15 June 2025'); + }); + + it('formats ISO date string with milliseconds', () => { + const result = getFormattedDateFromString('2025-03-20T10:30:00.123Z'); + expect(result).toBe('20 March 2025'); + }); + }); + + describe('numeric timestamp format', () => { + it('formats numeric timestamp string (milliseconds)', () => { + const timestamp = '1734523800000'; // December 18, 2024 + const result = getFormattedDateFromString(timestamp); + expect(result).toContain('December'); + expect(result).toContain('2024'); + }); + + it('formats timestamp at epoch start', () => { + const result = getFormattedDateFromString('0'); + expect(result).toBe('1 January 1970'); + }); + + it('formats recent timestamp', () => { + // January 1, 2025 00:00:00 UTC + const timestamp = '1735689600000'; + const result = getFormattedDateFromString(timestamp); + expect(result).toBe('1 January 2025'); + }); + + it('formats future timestamp', () => { + // December 31, 2099 23:59:59 UTC + const timestamp = String(new Date('2099-12-31T23:59:59Z').getTime()); + const result = getFormattedDateFromString(timestamp); + expect(result).toBe('31 December 2099'); }); }); - describe('formatDateWithDashes', () => { - it('formats date as DD-MM-YYYY with zero padding', () => { - expect(formatDateWithDashes(new Date('2025-01-05T00:00:00Z'))).toBe('05-01-2025'); - expect(formatDateWithDashes(new Date('2025-12-18T10:30:00Z'))).toBe('18-12-2025'); - expect(formatDateWithDashes(new Date('2024-02-29T00:00:00Z'))).toBe('29-02-2024'); + describe('various date string formats', () => { + it('formats US date format (MM/DD/YYYY)', () => { + const result = getFormattedDateFromString('12/18/2025'); + expect(result).toContain('December'); + expect(result).toContain('2025'); + }); + + it('formats date with full month name', () => { + const result = getFormattedDateFromString('December 18, 2025'); + expect(result).toBe('18 December 2025'); + }); + + it('formats short date format', () => { + const result = getFormattedDateFromString('2025-12-18'); + expect(result).toBe('18 December 2025'); }); }); - describe('getFormattedDateFromString', () => { - it('returns empty string for undefined or empty input', () => { - expect(getFormattedDateFromString(undefined)).toBe(''); - expect(getFormattedDateFromString('')).toBe(''); + describe('edge cases', () => { + it('handles leap year date', () => { + const result = getFormattedDateFromString('2024-02-29'); + expect(result).toBe('29 February 2024'); }); - it('formats ISO date strings', () => { - expect(getFormattedDateFromString('2025-12-18T10:30:00Z')).toBe('18 December 2025'); - expect(getFormattedDateFromString('2025-01-15')).toBe('15 January 2025'); - expect(getFormattedDateFromString('2024-02-29')).toBe('29 February 2024'); + it('handles date at start of year', () => { + const result = getFormattedDateFromString('2025-01-01T00:00:00Z'); + expect(result).toBe('1 January 2025'); }); - it('formats numeric timestamp strings', () => { - expect(getFormattedDateFromString('0')).toBe('1 January 1970'); - expect(getFormattedDateFromString('1735689600000')).toBe('1 January 2025'); + it('handles date at end of year', () => { + const result = getFormattedDateFromString('2025-12-31T23:59:59Z'); + expect(result).toBe('31 December 2025'); + }); + + it('formats timestamp string with spaces (treated as NaN)', () => { + const result = getFormattedDateFromString(' 12345 '); + // This will be treated as numeric timestamp + expect(result).toBeTruthy(); + }); + + it('handles various ISO formats', () => { + const formats = [ + { input: '2025-06-15T12:00:00Z', expected: '15 June 2025' }, + { input: '2025-06-15T12:00:00.000Z', expected: '15 June 2025' }, + { input: '2025-06-15', expected: '15 June 2025' }, + ]; + + formats.forEach(({ input, expected }) => { + expect(getFormattedDateFromString(input)).toBe(expected); + }); }); }); - describe('getFormattedDateTimeFromString', () => { - it('returns empty string for undefined input', () => { - expect(getFormattedDateTimeFromString(undefined)).toBe(''); + describe('timestamp conversion logic', () => { + it('distinguishes between numeric string and ISO string', () => { + const numericTimestamp = '1735689600000'; + const isoString = '2025-01-01T00:00:00Z'; + + const numericResult = getFormattedDateFromString(numericTimestamp); + const isoResult = getFormattedDateFromString(isoString); + + expect(numericResult).toBe('1 January 2025'); + expect(isoResult).toBe('1 January 2025'); + }); + + it('handles very large timestamp', () => { + // Far future date + const timestamp = String(new Date('2099-12-31').getTime()); + const result = getFormattedDateFromString(timestamp); + expect(result).toContain('2099'); + }); + + it('handles small timestamp (early 1970s)', () => { + const timestamp = '86400000'; // 1 day after epoch + const result = getFormattedDateFromString(timestamp); + expect(result).toBe('2 January 1970'); }); + }); + + describe('consistency with getFormattedDate', () => { + it('produces same output as getFormattedDate for ISO string', () => { + const dateString = '2025-06-15T10:30:00Z'; + const date = new Date(dateString); + + const fromString = getFormattedDateFromString(dateString); + const fromDate = getFormattedDate(date); - it('formats ISO date strings with time', () => { - const result = getFormattedDateTimeFromString('2022-11-11T18:45:00'); - expect(result).toContain('11 November 2022'); - expect(/\d{1,2}:[0-5][0-9]/.test(result)).toBe(true); + expect(fromString).toBe(fromDate); }); - it('formats numeric timestamp strings with time', () => { - const ts = String(new Date('2024-07-21T09:30:00Z').getTime()); - const result = getFormattedDateTimeFromString(ts); - expect(result).toContain('21 July 2024'); - expect(/\d{1,2}:[0-5][0-9]/.test(result)).toBe(true); + it('produces same output as getFormattedDate for numeric timestamp', () => { + const timestamp = Date.now(); + const timestampString = String(timestamp); + const date = new Date(timestamp); + + const fromString = getFormattedDateFromString(timestampString); + const fromDate = getFormattedDate(date); + + expect(fromString).toBe(fromDate); }); }); }); diff --git a/app/src/helpers/utils/formatDate.ts b/app/src/helpers/utils/formatDate.ts index 31d796ac2b..849ec91742 100644 --- a/app/src/helpers/utils/formatDate.ts +++ b/app/src/helpers/utils/formatDate.ts @@ -2,17 +2,6 @@ export const getFormattedDate = (date: Date): string => { return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'long', year: 'numeric' }); }; -export const getFormattedDateTime = (date: Date): string => { - return date.toLocaleDateString('en-GB', { - day: 'numeric', - month: 'long', - year: 'numeric', - hour: '2-digit', - minute: 'numeric', - hour12: true, - }); -}; - export const formatDateWithDashes = (date: Date): string => { const day = String(date.getDate()).padStart(2, '0'); const month = String(date.getMonth() + 1).padStart(2, '0'); @@ -30,13 +19,3 @@ export const getFormattedDateFromString = (dateString: string | undefined): stri } return getFormattedDate(new Date(Number(dateString))); }; - -export const getFormattedDateTimeFromString = (dateString: string | undefined): string => { - if (!dateString) { - return ''; - } - if (Number.isNaN(Number(dateString))) { - return getFormattedDateTime(new Date(dateString)); - } - return getFormattedDateTime(new Date(Number(dateString))); -}; diff --git a/app/src/pages/documentUploadPage/DocumentUploadPage.tsx b/app/src/pages/documentUploadPage/DocumentUploadPage.tsx index fd61ada2f6..6bee84c0c1 100644 --- a/app/src/pages/documentUploadPage/DocumentUploadPage.tsx +++ b/app/src/pages/documentUploadPage/DocumentUploadPage.tsx @@ -14,7 +14,7 @@ import useBaseAPIUrl from '../../helpers/hooks/useBaseAPIUrl'; import useConfig from '../../helpers/hooks/useConfig'; import usePatient from '../../helpers/hooks/usePatient'; import { uploadDocumentToS3 } from '../../helpers/requests/uploadDocuments'; -import { errorToParams } from '../../helpers/utils/errorToParams'; +import { errorCodeToParams, errorToParams } from '../../helpers/utils/errorToParams'; import { isLocal, isMock } from '../../helpers/utils/isLocal'; import { markDocumentsAsUploading, @@ -44,12 +44,10 @@ import { getUploadSession, goToNextDocType, goToPreviousDocType, - handleDocumentStatusUpdates, reduceDocumentsForUpload, startIntervalTimer, } from '../../helpers/utils/documentUpload'; import DocumentUploadIndex from '../../components/blocks/_documentUpload/documentUploadIndex/DocumentUploadIndex'; -import { UPDATE_DOCUMENT_STATE_FREQUENCY_MILLISECONDS } from '../../helpers/constants/network'; const DocumentUploadPage = (): React.JSX.Element => { const patientDetails = usePatient(); @@ -76,6 +74,9 @@ const DocumentUploadPage = (): React.JSX.Element => { const [showSkipLink, setShowSkipLink] = useState(undefined); const [documentTypeList, setDocumentTypeList] = useState([]); + const UPDATE_DOCUMENT_STATE_FREQUENCY_MILLISECONDS = 5000; + const MAX_POLLING_TIME = 600000; + useEffect(() => { const journeyParam = getJourney(); if (journeyParam === 'update') { @@ -90,15 +91,44 @@ const DocumentUploadPage = (): React.JSX.Element => { }, []); useEffect(() => { - handleDocumentStatusUpdates( - journey, - navigate, - intervalTimer, - interval, - documents, - virusReference, - completeRef, - ); + const journeyParam = getJourney(); + + if (journeyParam === 'update' && journey !== journeyParam) { + globalThis.clearInterval(intervalTimer); + navigate(routes.SERVER_ERROR); + return; + } + + if (interval.current * UPDATE_DOCUMENT_STATE_FREQUENCY_MILLISECONDS > MAX_POLLING_TIME) { + window.clearInterval(intervalTimer); + navigate(routes.SERVER_ERROR); + return; + } + + const hasVirus = documents.some((d) => d.state === DOCUMENT_UPLOAD_STATE.INFECTED); + const docWithError = + documents.length === 1 && + documents.find((d) => d.state === DOCUMENT_UPLOAD_STATE.ERROR); + const allFinished = + documents.length > 0 && + documents.every( + (d) => + d.state === DOCUMENT_UPLOAD_STATE.SUCCEEDED || + d.state === DOCUMENT_UPLOAD_STATE.ERROR, + ); + + if (hasVirus && !virusReference.current) { + virusReference.current = true; + window.clearInterval(intervalTimer); + navigate(routeChildren.DOCUMENT_UPLOAD_INFECTED); + } else if (docWithError) { + const errorParams = docWithError.error ? errorCodeToParams(docWithError.error) : ''; + navigate(routes.SERVER_ERROR + errorParams); + } else if (allFinished && !completeRef.current) { + completeRef.current = true; + window.clearInterval(intervalTimer); + navigate.withParams(routeChildren.DOCUMENT_UPLOAD_COMPLETED); + } }, [ baseHeaders, baseUrl, diff --git a/app/src/pages/lloydGeorgeRecordPage/LloydGeorgeRecordPage.test.tsx b/app/src/pages/lloydGeorgeRecordPage/LloydGeorgeRecordPage.test.tsx index d3d37ed678..1113e93a5d 100644 --- a/app/src/pages/lloydGeorgeRecordPage/LloydGeorgeRecordPage.test.tsx +++ b/app/src/pages/lloydGeorgeRecordPage/LloydGeorgeRecordPage.test.tsx @@ -25,10 +25,6 @@ vi.mock('../../helpers/hooks/useBaseAPIHeaders'); vi.mock('../../helpers/hooks/useBaseAPIUrl'); vi.mock('../../helpers/hooks/useRole'); -vi.mock('../../providers/analyticsProvider/AnalyticsProvider', () => ({ - useAnalyticsContext: (): [null, () => void] => [null, (): void => {}], -})); - const mockAxios = axios as Mocked; const mockPatientDetails = buildPatientDetails(); const mockedUsePatient = usePatient as Mock; diff --git a/app/src/pages/privacyPage/PrivacyPage.test.tsx b/app/src/pages/privacyPage/PrivacyPage.test.tsx index fc14cf11e3..bf92f385f0 100644 --- a/app/src/pages/privacyPage/PrivacyPage.test.tsx +++ b/app/src/pages/privacyPage/PrivacyPage.test.tsx @@ -27,7 +27,7 @@ describe('PrivacyPage', () => { }); describe('Rendering', () => { - it('renders page headers', async () => { + it('renders page headers', () => { render(); const contentHeaders = [ @@ -38,11 +38,8 @@ describe('PrivacyPage', () => { 'Feedback form privacy notice', 'Contact us', ]; - - await waitFor(async () => { - contentHeaders.forEach((str) => { - expect(screen.getByRole('heading', { name: str })).toBeInTheDocument(); - }); + contentHeaders.forEach((str) => { + expect(screen.getByRole('heading', { name: str })).toBeInTheDocument(); }); }); diff --git a/app/src/pages/serverErrorPage/ServerErrorPage.test.tsx b/app/src/pages/serverErrorPage/ServerErrorPage.test.tsx index ddd7da93af..17445e22ee 100644 --- a/app/src/pages/serverErrorPage/ServerErrorPage.test.tsx +++ b/app/src/pages/serverErrorPage/ServerErrorPage.test.tsx @@ -1,10 +1,10 @@ import { render, screen, waitFor } from '@testing-library/react'; +import { act } from 'react'; import ServerErrorPage from './ServerErrorPage'; import userEvent from '@testing-library/user-event'; import { unixTimestamp } from '../../helpers/utils/createTimestamp'; import { runAxeTest } from '../../helpers/test/axeTestHelper'; import { afterEach, beforeEach, describe, expect, it, Mock, vi } from 'vitest'; -import { routes } from '../../types/generic/routes'; const mockedUseNavigate = vi.fn(); const mockSearchParamsGet = vi.fn(); @@ -38,12 +38,12 @@ describe('ServerErrorPage', () => { expect(screen.getByText('There was an unexplained error')).toBeInTheDocument(); expect( screen.getByText( - "Try again by returning to the home page. You'll need to enter any information you submitted again.", + "Try again by returning to the previous page. You'll need to enter any information you submitted again.", ), ).toBeInTheDocument(); expect( screen.getByRole('button', { - name: 'Go to home', + name: 'Return to previous page', }), ).toBeInTheDocument(); expect( @@ -128,14 +128,16 @@ describe('ServerErrorPage', () => { mockSearchParamsGet.mockReturnValue(mockEncoded); render(); - const homeButtonLink = screen.getByRole('button', { - name: 'Go to home', + const returnButtonLink = screen.getByRole('button', { + name: 'Return to previous page', + }); + expect(returnButtonLink).toBeInTheDocument(); + act(() => { + userEvent.click(returnButtonLink); }); - expect(homeButtonLink).toBeInTheDocument(); - await userEvent.click(homeButtonLink); await waitFor(() => { - expect(mockedUseNavigate).toHaveBeenCalledWith(routes.HOME); + expect(mockedUseNavigate).toHaveBeenCalledWith(-2); }); }); }); diff --git a/app/src/pages/serverErrorPage/ServerErrorPage.tsx b/app/src/pages/serverErrorPage/ServerErrorPage.tsx index 0436db7976..1d1d0c7caf 100644 --- a/app/src/pages/serverErrorPage/ServerErrorPage.tsx +++ b/app/src/pages/serverErrorPage/ServerErrorPage.tsx @@ -3,7 +3,6 @@ import { ButtonLink } from 'nhsuk-react-components'; import errorCodes from '../../helpers/utils/errorCodes'; import { unixTimestamp } from '../../helpers/utils/createTimestamp'; import useTitle from '../../helpers/hooks/useTitle'; -import { routes } from '../../types/generic/routes'; type ServerError = [errorCode: string | null, interactionId: string | null]; @@ -27,17 +26,27 @@ const ServerErrorPage = (): React.JSX.Element => {

Sorry, there is a problem with the service

{errorMessage}

- Try again by returning to the home page. You'll need to enter any information you - submitted again. + Try again by returning to the previous page. You'll need to enter any information + you submitted again.

{ e.preventDefault(); - navigate(routes.HOME); + const errorUrl = window.location.href; + // Navigate back two paces incase the previous page has an error in the prefetch + navigate(-2); + + // If this code is reached, we can assume that the component + // has not destroyed and navigate(-2) has no where to go + const urlAfterMinusTwoNavigate = window.location.href; + const urlHasNotChanged = errorUrl === urlAfterMinusTwoNavigate; + if (urlHasNotChanged) { + navigate(-1); + } }} > - Go to home + Return to previous page

If this error keeps appearing

diff --git a/app/src/types/generic/searchResult.ts b/app/src/types/generic/searchResult.ts index 85a5516437..20c6a7dc6f 100644 --- a/app/src/types/generic/searchResult.ts +++ b/app/src/types/generic/searchResult.ts @@ -3,7 +3,6 @@ import { DOCUMENT_TYPE } from '../../helpers/utils/documentType'; export type SearchResult = { fileName: string; created: string; - author: string; virusScannerResult: string; id: string; fileSize: number; diff --git a/app/src/types/pages/UploadDocumentsPage/types.ts b/app/src/types/pages/UploadDocumentsPage/types.ts index db18794322..121c6a8b00 100644 --- a/app/src/types/pages/UploadDocumentsPage/types.ts +++ b/app/src/types/pages/UploadDocumentsPage/types.ts @@ -28,7 +28,6 @@ export enum DOCUMENT_STATUS { CANCELLED = 'cancelled', INFECTED = 'infected', NOT_FOUND = 'not-found', - INVALID = 'invalid', } export enum UploadDocumentType { diff --git a/lambdas/models/document_reference.py b/lambdas/models/document_reference.py index 613d88343c..ecd2cd224e 100644 --- a/lambdas/models/document_reference.py +++ b/lambdas/models/document_reference.py @@ -102,7 +102,7 @@ class DocumentReference(BaseModel): author: str | None = None content_type: str = Field(default=DEFAULT_CONTENT_TYPE) created: str = Field( - default_factory=lambda: datetime.now(timezone.utc).strftime(DATE_FORMAT), + default_factory=lambda: datetime.now(timezone.utc).strftime(DATE_FORMAT) ) document_scan_creation: Optional[str] = Field( default_factory=lambda: datetime.date(datetime.now()).isoformat(), @@ -125,10 +125,10 @@ class DocumentReference(BaseModel): ] = Field(default="preliminary") doc_type: str = Field(default=None, exclude=True) document_snomed_code_type: Optional[str] = Field( - default=SnomedCodes.LLOYD_GEORGE.value.code, + default=SnomedCodes.LLOYD_GEORGE.value.code ) file_location: str = "" - file_name: str | None + file_name: str file_size: int | None = Field(default=None) last_updated: int = Field( default_factory=lambda: int(datetime.now(timezone.utc).timestamp()), @@ -140,12 +140,11 @@ class DocumentReference(BaseModel): s3_version_id: Optional[str] = Field(default=None, alias="S3VersionID") s3_upload_key: str = Field(default=None, exclude=True) status: Literal["current", "superseded", "entered-in-error"] = Field( - default="current", + default="current" ) sub_folder: str = Field(default=None, exclude=True) ttl: Optional[int] = Field( - alias=str(DocumentReferenceMetadataFields.TTL.value), - default=None, + alias=str(DocumentReferenceMetadataFields.TTL.value), default=None ) uploaded: bool = Field(default=None) uploading: bool = Field(default=None) @@ -175,8 +174,7 @@ def set_location_properties(cls, data, *args, **kwargs): if "s3_file_key" not in data: data["s3_file_key"] = cls._build_final_s3_key(data) data["file_location"] = cls._build_s3_location( - data["s3_bucket_name"], - current_s3_file_key, + data["s3_bucket_name"], current_s3_file_key ) return data diff --git a/lambdas/services/create_document_reference_service.py b/lambdas/services/create_document_reference_service.py index 2fedcd837e..28d45813f0 100644 --- a/lambdas/services/create_document_reference_service.py +++ b/lambdas/services/create_document_reference_service.py @@ -10,13 +10,13 @@ from models.fhir.R4.fhir_document_reference import Attachment, DocumentReferenceInfo from pydantic import ValidationError from services.base.ssm_service import SSMService -from services.feature_flags_service import FeatureFlagService from services.post_fhir_document_reference_service import ( PostFhirDocumentReferenceService, ) from utils import upload_file_configs from utils.audit_logging_setup import LoggingService from utils.common_query_filters import get_document_type_filter +from utils.constants.ssm import UPLOAD_PILOT_ODS_ALLOWED_LIST from utils.dynamo_query_filter_builder import DynamoQueryFilterBuilder from utils.exceptions import ( ConfigNotFoundException, @@ -49,16 +49,13 @@ class CreateDocumentReferenceService: def __init__(self): self.post_fhir_doc_ref_service = PostFhirDocumentReferenceService() self.ssm_service = SSMService() - self.feature_flag_service = FeatureFlagService() self.lg_dynamo_table = os.getenv("LLOYD_GEORGE_DYNAMODB_NAME") self.staging_bucket_name = os.getenv("STAGING_STORE_BUCKET_NAME") self.upload_sub_folder = "user_upload" def create_document_reference_request( - self, - nhs_number: str, - documents_list: list[dict], + self, nhs_number: str, documents_list: list[dict] ): upload_document_names = [] url_responses = {} @@ -76,19 +73,18 @@ def create_document_reference_request( for validated_doc in upload_request_documents: snomed_code = validated_doc.doc_type - config = upload_file_configs.get_config_by_snomed_code(snomed_code) + config = upload_file_configs.get_config_by_snomed_code( + snomed_code + ) if config.single_file_only: self.check_existing_records_and_remove_failed_upload( nhs_number, - snomed_code, + snomed_code ) document_reference = self.create_document_reference( - nhs_number, - user_ods_code, - validated_doc, - snomed_code, + nhs_number, user_ods_code, validated_doc, snomed_code ) self.validate_document_file_type(validated_doc, config) @@ -130,21 +126,13 @@ def create_document_reference_request( raise DocumentRefException(400, LambdaError.DocRefInvalidFiles) def validate_document_file_type(self, validated_doc, document_config): - if not is_file_type_allowed( - validated_doc.file_name, - document_config.accepted_file_types, - ): + if not is_file_type_allowed(validated_doc.file_name, document_config.accepted_file_types): raise LGInvalidFilesException( - f"Unsupported file type for file: {validated_doc.file_name}", + f"Unsupported file type for file: {validated_doc.file_name}" ) def build_and_process_fhir_doc_ref( - self, - nhs_number, - user_ods_code, - validated_doc, - snomed_code, - document_reference, + self, nhs_number, user_ods_code, validated_doc, snomed_code, document_reference ): doc_ref_info = self.build_doc_ref_info( validated_doc, @@ -154,11 +142,11 @@ def build_and_process_fhir_doc_ref( ) fhir_doc_ref = doc_ref_info.create_fhir_document_reference_object( - document_reference, + document_reference ) fhir_response = self.post_fhir_doc_ref_service.process_fhir_document_reference( - fhir_doc_ref.model_dump_json(), + fhir_doc_ref.model_dump_json() ) return fhir_response @@ -171,11 +159,7 @@ def validate_patient_user_ods_codes_match(self, user_ods_code, patient_ods_code) raise DocumentRefException(401, LambdaError.DocRefUnauthorizedOdsCode) def build_doc_ref_info( - self, - validated_doc, - nhs_number, - snomed_code, - user_ods_code, + self, validated_doc, nhs_number, snomed_code, user_ods_code ) -> DocumentReferenceInfo: attachment_details = Attachment( title=validated_doc.file_name, @@ -192,16 +176,14 @@ def build_doc_ref_info( return doc_ref_info def check_if_user_ods_code_is_in_pilot(self, ods_code) -> bool: - pilot_ods_codes = ( - self.feature_flag_service.get_allowed_list_of_ods_codes_for_upload_pilot() - ) - if ods_code in pilot_ods_codes or pilot_ods_codes == []: + pilot_ods_codes = self.get_allowed_list_of_ods_codes_for_upload_pilot() + if ods_code in pilot_ods_codes: return True - raise OdsErrorException() + else: + raise OdsErrorException() def parse_documents_list( - self, - document_list: list[dict], + self, document_list: list[dict] ) -> list[UploadRequestDocument]: upload_request_document_list = [] for document in document_list: @@ -268,7 +250,7 @@ def check_existing_records_and_remove_failed_upload( ) if not previous_records: logger.info( - "No record was found for this patient. Will continue to create doc ref.", + "No record was found for this patient. Will continue to create doc ref." ) return @@ -279,7 +261,7 @@ def check_existing_records_and_remove_failed_upload( def stop_if_upload_is_in_process(self, previous_records: list[DocumentReference]): if any( self.post_fhir_doc_ref_service.document_service.is_upload_in_process( - document, + document ) for document in previous_records ): @@ -294,7 +276,7 @@ def stop_if_all_records_uploaded(self, previous_records: list[DocumentReference] if all_records_uploaded: logger.info( "The patient already has a full set of record. " - "We should not be processing the new Lloyd George record upload.", + "We should not be processing the new Lloyd George record upload." ) logger.error( f"{LambdaError.DocRefRecordAlreadyInPlace.to_str()}", @@ -309,23 +291,30 @@ def remove_records_of_failed_upload( ): logger.info( "Found previous records of failed upload. " - "Will delete those records before creating new document references.", + "Will delete those records before creating new document references." ) logger.info("Deleting files from s3...") for record in failed_upload_records: s3_bucket_name, s3_file_key = record._parse_s3_location( - record.file_location, + record.file_location ) self.post_fhir_doc_ref_service.s3_service.delete_object( - s3_bucket_name, - s3_file_key, + s3_bucket_name, s3_file_key ) logger.info("Deleting dynamodb record...") self.post_fhir_doc_ref_service.document_service.hard_delete_metadata_records( - table_name=table_name, - document_references=failed_upload_records, + table_name=table_name, document_references=failed_upload_records ) logger.info("Previous failed records are deleted.") + + def get_allowed_list_of_ods_codes_for_upload_pilot(self) -> list[str]: + logger.info( + "Starting ssm request to retrieve allowed list of ODS codes for Upload Pilot" + ) + response = self.ssm_service.get_ssm_parameter(UPLOAD_PILOT_ODS_ALLOWED_LIST) + if not response: + logger.warning("No ODS codes found in allowed list for Upload Pilot") + return response diff --git a/lambdas/services/document_reference_search_service.py b/lambdas/services/document_reference_search_service.py index f53ddc07a9..04d6a2c0e4 100644 --- a/lambdas/services/document_reference_search_service.py +++ b/lambdas/services/document_reference_search_service.py @@ -177,7 +177,6 @@ def _build_document_model(self, document: DocumentReference) -> dict: "version", "content_type", "document_snomed_code_type", - "author", }, ) return document_formatted diff --git a/lambdas/services/feature_flags_service.py b/lambdas/services/feature_flags_service.py index f592108d02..dba5ef6715 100644 --- a/lambdas/services/feature_flags_service.py +++ b/lambdas/services/feature_flags_service.py @@ -130,36 +130,33 @@ def get_feature_flags_by_flag(self, flag: str): def get_allowed_list_of_ods_codes_for_upload_pilot(self) -> list[str]: logger.info( - "Starting ssm request to retrieve allowed list of ODS codes for Upload Pilot", + "Starting ssm request to retrieve allowed list of ODS codes for Upload Pilot" ) - response = self.ssm_service.get_ssm_parameter( - UPLOAD_PILOT_ODS_ALLOWED_LIST, - ).split(",") - if not response or response == ["*"]: + response = self.ssm_service.get_ssm_parameter(UPLOAD_PILOT_ODS_ALLOWED_LIST) + if not response: logger.warning("No ODS codes found in allowed list for Upload Pilot") return [] - return response + return response.split(",") def check_if_ods_code_is_in_pilot(self) -> bool: ods_code = "" if isinstance(request_context.authorization, dict): ods_code = request_context.authorization.get( - "selected_organisation", - {}, + "selected_organisation", {} ).get("org_ods_code", "") if not ods_code: return False pilot_ods_codes = self.get_allowed_list_of_ods_codes_for_upload_pilot() - return ods_code in pilot_ods_codes or pilot_ods_codes == [] + return ods_code in pilot_ods_codes def validate_feature_flag(self, flag_name: str): flag_object = self.get_feature_flags_by_flag(flag_name) if not flag_object.get(flag_name, False): logger.info( - f"Feature flag '{flag_name}' not enabled, event will not be processed", + f"Feature flag '{flag_name}' not enabled, event will not be processed" ) raise FeatureFlagsException(404, LambdaError.FeatureFlagDisabled) diff --git a/lambdas/services/post_fhir_document_reference_service.py b/lambdas/services/post_fhir_document_reference_service.py index bec8b561de..255c1c6bde 100644 --- a/lambdas/services/post_fhir_document_reference_service.py +++ b/lambdas/services/post_fhir_document_reference_service.py @@ -3,9 +3,7 @@ from enums.mtls import MtlsCommonNames from enums.snomed_codes import SnomedCode, SnomedCodes from models.document_reference import DocumentReference -from models.fhir.R4.fhir_document_reference import ( - SNOMED_URL, -) +from models.fhir.R4.fhir_document_reference import SNOMED_URL from models.fhir.R4.fhir_document_reference import ( DocumentReference as FhirDocumentReference, ) @@ -27,9 +25,7 @@ def __init__(self): super().__init__() def process_fhir_document_reference( - self, - fhir_document: str, - api_request_context: dict = {}, + self, fhir_document: str, api_request_context: dict = {} ) -> str: """ Process a FHIR Document Reference request @@ -44,7 +40,7 @@ def process_fhir_document_reference( common_name = validate_common_name_in_mtls(api_request_context) validated_fhir_doc = FhirDocumentReference.model_validate_json( - fhir_document, + fhir_document ) # Extract NHS number and author from the FHIR document @@ -76,9 +72,7 @@ def process_fhir_document_reference( ) presigned_url = self._handle_document_save( - document_reference, - validated_fhir_doc, - dynamo_table, + document_reference, validated_fhir_doc, dynamo_table ) return self._create_fhir_response(document_reference, presigned_url) @@ -113,9 +107,7 @@ def _extract_author_from_fhir(self, fhir_doc: FhirDocumentReference) -> str | No raise DocumentRefException(400, LambdaError.DocRefNoParse) def _determine_document_type( - self, - fhir_doc: FhirDocumentReference, - common_name: MtlsCommonNames | None, + self, fhir_doc: FhirDocumentReference, common_name: MtlsCommonNames | None ) -> SnomedCode: if not common_name: """Determine the document type based on SNOMED code in the FHIR document""" @@ -127,7 +119,7 @@ def _determine_document_type( return snomed_code else: logger.error( - f"SNOMED code {coding.code} - {coding.display} is not supported", + f"SNOMED code {coding.code} - {coding.display} is not supported" ) raise DocumentRefException(400, LambdaError.DocRefInvalidType) logger.error("SNOMED code not found in FHIR document") @@ -155,12 +147,6 @@ def _create_document_reference( if not custodian: custodian = current_gp_ods - title = fhir_doc.content[0].attachment.title or None - - if doc_type != SnomedCodes.PATIENT_DATA.value and title is None: - logger.error("FHIR document validation error: attachment.title missing") - raise DocumentRefException(400, LambdaError.DocRefNoParse) - sub_folder, raw_request = ( ("user_upload", None) if doc_type != SnomedCodes.PATIENT_DATA.value @@ -175,7 +161,7 @@ def _create_document_reference( s3_bucket_name=self.staging_bucket_name, author=author, content_type=fhir_doc.content[0].attachment.contentType, - file_name=title, + file_name=fhir_doc.content[0].attachment.title, document_snomed_code_type=doc_type.code, doc_status="preliminary", status="current", diff --git a/lambdas/services/update_document_reference_service.py b/lambdas/services/update_document_reference_service.py index 5073cebdd5..ed0be0c954 100644 --- a/lambdas/services/update_document_reference_service.py +++ b/lambdas/services/update_document_reference_service.py @@ -8,10 +8,10 @@ from pydantic import ValidationError from services.base.ssm_service import SSMService from services.document_service import DocumentService -from services.feature_flags_service import FeatureFlagService from services.put_fhir_document_reference_service import PutFhirDocumentReferenceService from utils.audit_logging_setup import LoggingService from utils.common_query_filters import CurrentStatusFile, NotDeleted +from utils.constants.ssm import UPLOAD_PILOT_ODS_ALLOWED_LIST from utils.dynamo_utils import DocTypeTableRouter from utils.exceptions import ( InvalidNhsNumberException, @@ -38,14 +38,10 @@ def __init__(self): self.fhir_doc_ref_service = PutFhirDocumentReferenceService() self.document_service = DocumentService() self.ssm_service = SSMService() - self.feature_flag_service = FeatureFlagService() self.doctype_table_router = DocTypeTableRouter() def update_document_reference_request( - self, - nhs_number: str, - document: dict, - doc_ref_id: str, + self, nhs_number: str, document: dict, doc_ref_id: str ): self.validate_doc_ref_exists(doc_ref_id) @@ -68,16 +64,12 @@ def update_document_reference_request( self.validate_user_patient_ods_match(patient_ods_code, user_ods_code) validate_files_for_access_and_store( - [update_request_document], - pds_patient_details, + [update_request_document], pds_patient_details ) self.stop_if_upload_is_in_progress(nhs_number) fhir_response = self.build_and_process_fhir_doc_ref( - nhs_number, - doc_ref_id, - update_request_document, - user_ods_code, + nhs_number, doc_ref_id, update_request_document, user_ods_code ) fhir_response_data = json.loads(fhir_response) @@ -105,19 +97,12 @@ def update_document_reference_request( raise DocumentRefException(400, LambdaError.DocRefInvalidFiles) def build_and_process_fhir_doc_ref( - self, - nhs_number, - doc_ref_id, - update_request_document, - user_ods_code, + self, nhs_number, doc_ref_id, update_request_document, user_ods_code ): snomed_code_type = self.get_snomed_code_from_doc(update_request_document) doc_ref_info = self.build_doc_ref_info( - nhs_number, - update_request_document, - snomed_code_type, - user_ods_code, + nhs_number, update_request_document, snomed_code_type, user_ods_code ) logger.info(f"Updating document reference for client id: {doc_ref_id}") @@ -125,12 +110,11 @@ def build_and_process_fhir_doc_ref( validate_doc_version = update_request_document.version_id fhir_doc_ref = doc_ref_info.create_fhir_document_reference_object_basic( - doc_ref_id, - validate_doc_version, + doc_ref_id, validate_doc_version ) fhir_response = self.fhir_doc_ref_service.process_fhir_document_reference( - fhir_doc_ref.model_dump_json(), + fhir_doc_ref.model_dump_json() ) return fhir_response @@ -169,11 +153,7 @@ def get_snomed_code_from_doc(self, update_request_document): return snomed_code_type def build_doc_ref_info( - self, - nhs_number, - update_request_document, - snomed_code_type, - user_ods_code, + self, nhs_number, update_request_document, snomed_code_type, user_ods_code ): attachment_details = Attachment( title=update_request_document.file_name, @@ -189,17 +169,16 @@ def build_doc_ref_info( return doc_ref_info def check_if_ods_code_is_in_pilot(self, ods_code) -> bool: - pilot_ods_codes = ( - self.feature_flag_service.get_allowed_list_of_ods_codes_for_upload_pilot() - ) - if ods_code in pilot_ods_codes or pilot_ods_codes == []: + pilot_ods_codes = self.get_allowed_list_of_ods_codes_for_upload_pilot() + if ods_code in pilot_ods_codes: return True - raise OdsErrorException() + else: + raise OdsErrorException() def parse_document(self, document: dict) -> UploadRequestDocument: try: validated_doc: UploadRequestDocument = UploadRequestDocument.model_validate( - document, + document ) except ValidationError as e: logger.error( @@ -228,3 +207,12 @@ def stop_if_upload_is_in_progress(self, nhs_number: str): {"Result": UPDATE_REFERENCE_FAILED_MESSAGE}, ) raise DocumentRefException(423, LambdaError.UploadInProgressError) + + def get_allowed_list_of_ods_codes_for_upload_pilot(self) -> list[str]: + logger.info( + "Starting ssm request to retrieve allowed list of ODS codes for Upload Pilot" + ) + response = self.ssm_service.get_ssm_parameter(UPLOAD_PILOT_ODS_ALLOWED_LIST) + if not response: + logger.warning("No ODS codes found in allowed list for Upload Pilot") + return response diff --git a/lambdas/tests/e2e/api/fhir/test_upload_document_fhir_api_success.py b/lambdas/tests/e2e/api/fhir/test_upload_document_fhir_api_success.py index dd1a7d4204..41812f0642 100644 --- a/lambdas/tests/e2e/api/fhir/test_upload_document_fhir_api_success.py +++ b/lambdas/tests/e2e/api/fhir/test_upload_document_fhir_api_success.py @@ -1,5 +1,4 @@ import base64 -import json import logging import os @@ -43,8 +42,7 @@ def condition(response_json): return response_json["content"][0]["attachment"].get("data", False) raw_retrieve_response = retrieve_document_with_retry( - upload_response["id"], - condition, + upload_response["id"], condition ) retrieve_response = raw_retrieve_response.json() @@ -87,8 +85,7 @@ def test_create_document_without_author_or_type(test_data): with open(sample_pdf_path, "rb") as f: record["data"] = base64.b64encode(f.read()).decode("utf-8") payload = pdm_data_helper.create_upload_payload( - record=record, - exclude=["type", "author"], + record=record, exclude=["type", "author"] ) for field in ["type", "author"]: @@ -106,32 +103,3 @@ def test_create_document_without_author_or_type(test_data): assert doc_ref["Item"]["RawRequest"] == payload for field in ["type", "author"]: assert field not in doc_ref["Item"]["RawRequest"] - - -def test_create_document_without_title(test_data): - record = { - "ods": "H81109", - "nhs_number": "9912003071", - } - - sample_pdf_path = os.path.join(os.path.dirname(__file__), "files", "dummy.pdf") - with open(sample_pdf_path, "rb") as f: - record["data"] = base64.b64encode(f.read()).decode("utf-8") - payload = pdm_data_helper.create_upload_payload(record=record, exclude=["title"]) - assert "title" not in payload - - raw_upload_response = upload_document(payload) - assert raw_upload_response.status_code == 201 - record["id"] = raw_upload_response.json()["id"].split("~")[1] - test_data.append(record) - - doc_ref = pdm_data_helper.retrieve_document_reference(record=record) - assert "Item" in doc_ref - assert "RawRequest" in doc_ref["Item"] - assert doc_ref["Item"]["RawRequest"] == payload - raw_request = json.loads(doc_ref["Item"]["RawRequest"]) - assert "content" in raw_request - content = raw_request["content"] - assert "attachment" in content[0] - attachment = raw_request["content"][0]["attachment"] - assert "title" not in attachment diff --git a/lambdas/tests/e2e/api/test_upload_document_api.py b/lambdas/tests/e2e/api/test_upload_document_api.py index 204eea9368..cc9319bc23 100644 --- a/lambdas/tests/e2e/api/test_upload_document_api.py +++ b/lambdas/tests/e2e/api/test_upload_document_api.py @@ -18,7 +18,7 @@ data_helper = LloydGeorgeDataHelper() -def create_upload_payload(lloyd_george_record, exclude: list[str] | None = None): +def create_upload_payload(lloyd_george_record): sample_payload = { "resourceType": "DocumentReference", "type": { @@ -27,28 +27,28 @@ def create_upload_payload(lloyd_george_record, exclude: list[str] | None = None) "system": "http://snomed.info/sct", "code": f"{LLOYD_GEORGE_SNOMED}", "display": "Lloyd George record folder", - }, - ], + } + ] }, "subject": { "identifier": { "system": "https://fhir.nhs.uk/Id/nhs-number", "value": lloyd_george_record["nhs_number"], - }, + } }, "author": [ { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": lloyd_george_record["ods"], - }, - }, + } + } ], "custodian": { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": lloyd_george_record["ods"], - }, + } }, "content": [ { @@ -57,18 +57,11 @@ def create_upload_payload(lloyd_george_record, exclude: list[str] | None = None) "contentType": "application/pdf", "language": "en-GB", "title": "1of1_Lloyd_George_Record_[Paula Esme VESEY]_[9730153973]_[22-01-1960].pdf", - }, - }, + } + } ], } - if exclude: - for field in exclude: - if field == "title": - sample_payload["content"][0]["attachment"].pop(field, None) - else: - sample_payload.pop(field, None) - if "data" in lloyd_george_record: sample_payload["content"][0]["attachment"]["data"] = lloyd_george_record["data"] return json.dumps(sample_payload) @@ -112,10 +105,10 @@ def condition(response_json): assert base64.b64decode(base64_data, validate=True) assert upload_response == snapshot_json( - exclude=paths("id", "date", "content.0.attachment.url"), + exclude=paths("id", "date", "content.0.attachment.url") ) assert retrieve_response == snapshot_json( - exclude=paths("id", "date", "content.0.attachment.data"), + exclude=paths("id", "date", "content.0.attachment.data") ) @@ -160,11 +153,8 @@ def condition(response_json): assert upload_response == snapshot_json(exclude=paths("id", "date")) assert retrieve_response == snapshot_json( exclude=paths( - "id", - "date", - "content.0.attachment.url", - "content.0.attachment.size", - ), + "id", "date", "content.0.attachment.url", "content.0.attachment.size" + ) ) @@ -205,7 +195,7 @@ def condition(response_json): retrieve_response = raw_retrieve_response.json() assert upload_response == snapshot_json( - exclude=paths("id", "date", "content.0.attachment.url"), + exclude=paths("id", "date", "content.0.attachment.url") ) assert retrieve_response == snapshot_json(exclude=paths("id", "date")) @@ -231,29 +221,3 @@ def test_create_document_does_not_save_raw(test_data): doc_ref = data_helper.retrieve_document_reference(record=lloyd_george_record) assert "Item" in doc_ref assert "RawRequest" not in doc_ref["Item"] - - -def test_create_document_without_title_raises_error(test_data): - lloyd_george_record = {} - lloyd_george_record["ods"] = "H81109" - lloyd_george_record["nhs_number"] = "9449303304" - - sample_pdf_path = os.path.join(os.path.dirname(__file__), "files", "dummy.pdf") - with open(sample_pdf_path, "rb") as f: - lloyd_george_record["data"] = base64.b64encode(f.read()).decode("utf-8") - payload = create_upload_payload(lloyd_george_record, exclude=["title"]) - - url = f"https://{API_ENDPOINT}/FhirDocumentReference" - headers = {"Authorization": "Bearer 123", "X-Api-Key": API_KEY} - - retrieve_response = requests.post(url, headers=headers, data=payload) - assert retrieve_response.status_code == 400 - - json_response = retrieve_response.json() - assert ( - json_response["issue"][0]["details"]["coding"][0]["code"] == "VALIDATION_ERROR" - ) - assert ( - json_response["issue"][0]["diagnostics"] - == "Failed to parse document upload request data" - ) diff --git a/lambdas/tests/e2e/helpers/data_helper.py b/lambdas/tests/e2e/helpers/data_helper.py index 3d6fc87d18..c810b16823 100644 --- a/lambdas/tests/e2e/helpers/data_helper.py +++ b/lambdas/tests/e2e/helpers/data_helper.py @@ -43,8 +43,7 @@ def build_env(self, table_name, bucket_name): "ndr-dev": "internal-dev.api.service.nhs.uk", } self.apim_url = apim_map.get( - str(self.workspace), - "internal-dev.api.service.nhs.uk", + str(self.workspace), "internal-dev.api.service.nhs.uk" ) domain = ( @@ -62,11 +61,7 @@ def build_env(self, table_name, bucket_name): self.mtls_endpoint = f"mtls.{self.workspace}.{domain}" def build_record( - self, - nhs_number="9912003071", - data=None, - doc_status=None, - size=None, + self, nhs_number="9912003071", data=None, doc_status=None, size=None ): record = { "id": str(uuid.uuid4()), @@ -114,8 +109,7 @@ def create_resource(self, record): def retrieve_document_reference(self, record): return self.dynamo_service.get_item( - table_name=self.dynamo_table, - key={"ID": record["id"]}, + table_name=self.dynamo_table, key={"ID": record["id"]} ) def create_upload_payload(self, record, exclude=[], return_json=False): @@ -128,28 +122,28 @@ def create_upload_payload(self, record, exclude=[], return_json=False): "system": "https://snomed.info/sct", "code": f"{self.snomed_code}", "display": "Confidential patient data", - }, - ], + } + ] }, "subject": { "identifier": { "system": "https://fhir.nhs.uk/Id/nhs-number", "value": record["nhs_number"], - }, + } }, "author": [ { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": record["ods"], - }, - }, + } + } ], "custodian": { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": record["ods"], - }, + } }, "content": [ { @@ -158,16 +152,13 @@ def create_upload_payload(self, record, exclude=[], return_json=False): "contentType": "application/pdf", "language": "en-GB", "title": "1of1_pdm_record_[Paula Esme VESEY]_[9730153973]_[22-01-1960].pdf", - }, - }, + } + } ], } for field in exclude: - if field == "title": - payload["content"][0]["attachment"].pop(field, None) - else: - payload.pop(field, None) + payload.pop(field, None) if "data" in record: payload["content"][0]["attachment"]["data"] = record["data"] @@ -269,7 +260,7 @@ def add_virus_scan_tag(self, key, result, date): "TagSet": [ {"Key": "scan-result", "Value": result}, {"Key": "scan-date", "Value": date}, - ], + ] }, ) @@ -284,9 +275,7 @@ def check_record_exists_in_s3_with_version(self, key, version_id): try: if version_id: _ = s3_client.head_object( - Bucket=self.s3_bucket, - Key=key, - VersionId=version_id, + Bucket=self.s3_bucket, Key=key, VersionId=version_id ) else: _ = s3_client.head_object(Bucket=self.s3_bucket, Key=key) @@ -294,4 +283,5 @@ def check_record_exists_in_s3_with_version(self, key, version_id): except s3_client.exceptions.ClientError as e: if e.response["Error"]["Code"] == "404": return False - raise + else: + raise diff --git a/lambdas/tests/unit/helpers/data/dynamo/dynamo_responses.py b/lambdas/tests/unit/helpers/data/dynamo/dynamo_responses.py index f420ca608e..3c2b503323 100755 --- a/lambdas/tests/unit/helpers/data/dynamo/dynamo_responses.py +++ b/lambdas/tests/unit/helpers/data/dynamo/dynamo_responses.py @@ -1,10 +1,9 @@ -from tests.unit.conftest import TEST_CURRENT_GP_ODS, TEST_FILE_SIZE, TEST_NHS_NUMBER +from tests.unit.conftest import TEST_FILE_SIZE, TEST_NHS_NUMBER MOCK_SEARCH_RESPONSE = { "Items": [ { "ID": "3d8683b9-1665-40d2-8499-6e8302d507ff", - "Author": TEST_CURRENT_GP_ODS, "ContentType": "application/pdf", "Created": "2024-01-01T12:00:00.000Z", "DocStatus": "final", @@ -13,7 +12,7 @@ "FileSize": TEST_FILE_SIZE, "NhsNumber": TEST_NHS_NUMBER, "VirusScannerResult": "Clean", - "CurrentGpOds": TEST_CURRENT_GP_ODS, + "CurrentGpOds": "Y12345", "Uploaded": "True", "Uploading": "False", "LastUpdated": 1704110400, # Timestamp: 2024-01-01T12:00:00 @@ -21,7 +20,6 @@ }, { "ID": "4d8683b9-1665-40d2-8499-6e8302d507ff", - "Author": TEST_CURRENT_GP_ODS, "ContentType": "application/pdf", "Created": "2024-01-01T12:00:00.000Z", "DocStatus": "final", @@ -30,7 +28,7 @@ "FileSize": TEST_FILE_SIZE, "NhsNumber": TEST_NHS_NUMBER, "VirusScannerResult": "Clean", - "CurrentGpOds": TEST_CURRENT_GP_ODS, + "CurrentGpOds": "Y12345", "Uploaded": "True", "Uploading": "False", "LastUpdated": 1704110400, # Timestamp: 2024-01-01T12:00:00 @@ -38,7 +36,6 @@ }, { "ID": "5d8683b9-1665-40d2-8499-6e8302d507ff", - "Author": TEST_CURRENT_GP_ODS, "ContentType": "application/pdf", "Created": "2024-01-01T12:00:00.000Z", "DocStatus": "final", @@ -47,7 +44,7 @@ "FileSize": TEST_FILE_SIZE, "NhsNumber": TEST_NHS_NUMBER, "VirusScannerResult": "Clean", - "CurrentGpOds": TEST_CURRENT_GP_ODS, + "CurrentGpOds": "Y12345", "Uploaded": "True", "Uploading": "False", "LastUpdated": 1704110400, # Timestamp: 2024-01-01T12:00:00 diff --git a/lambdas/tests/unit/services/test_create_document_reference_service.py b/lambdas/tests/unit/services/test_create_document_reference_service.py index 3f8cd77ea8..8a1332e037 100644 --- a/lambdas/tests/unit/services/test_create_document_reference_service.py +++ b/lambdas/tests/unit/services/test_create_document_reference_service.py @@ -65,13 +65,13 @@ def mock_create_doc_ref_service(set_env, mocker): @pytest.fixture def mock_fhir_doc_ref_base_service(mocker, setup_request_context): mock_document_service = mocker.patch( - "services.fhir_document_reference_service_base.DocumentService", + "services.fhir_document_reference_service_base.DocumentService" ) mock_s3_service = mocker.patch( - "services.fhir_document_reference_service_base.S3Service", + "services.fhir_document_reference_service_base.S3Service" ) mock_dynamo_service = mocker.patch( - "services.fhir_document_reference_service_base.DynamoDBService", + "services.fhir_document_reference_service_base.DynamoDBService" ) service = FhirDocumentReferenceServiceBase() service.document_service = mock_document_service.return_value @@ -98,9 +98,9 @@ def mock_process_fhir_document_reference(mocker): return_value=json.dumps( { "content": [ - {"attachment": {"url": "https://test-bucket.s3.amazonaws.com/"}}, - ], - }, + {"attachment": {"url": "https://test-bucket.s3.amazonaws.com/"}} + ] + } ), ) @@ -119,15 +119,13 @@ def mock_create_document_reference(mock_create_doc_ref_service, mocker): @pytest.fixture() def mock_remove_records(mock_create_doc_ref_service, mocker): yield mocker.patch.object( - mock_create_doc_ref_service, - "remove_records_of_failed_upload", + mock_create_doc_ref_service, "remove_records_of_failed_upload" ) @pytest.fixture() def mock_check_existing_records_and_remove_failed_upload( - mock_create_doc_ref_service, - mocker, + mock_create_doc_ref_service, mocker ): yield mocker.patch.object( mock_create_doc_ref_service, @@ -138,7 +136,7 @@ def mock_check_existing_records_and_remove_failed_upload( @pytest.fixture() def mock_check_for_duplicate_files(mocker): yield mocker.patch( - "services.create_document_reference_service.check_for_duplicate_files", + "services.create_document_reference_service.check_for_duplicate_files" ) @@ -152,8 +150,7 @@ def mock_getting_patient_info_from_pds(mocker, mock_pds_patient): @pytest.fixture def mock_fetch_available_document_references_by_type( - mocker, - mock_fhir_doc_ref_base_service, + mocker, mock_fhir_doc_ref_base_service ): mock = mocker.patch.object( mock_fhir_doc_ref_base_service.document_service, @@ -172,12 +169,10 @@ def undo_mocking_for_is_upload_in_process(mock_fhir_doc_ref_base_service): @pytest.fixture def mock_get_allowed_list_of_ods_codes_for_upload_pilot( - mock_create_doc_ref_service, - mocker, + mock_create_doc_ref_service, mocker ): return mocker.patch.object( - mock_create_doc_ref_service.feature_flag_service, - "get_allowed_list_of_ods_codes_for_upload_pilot", + mock_create_doc_ref_service, "get_allowed_list_of_ods_codes_for_upload_pilot" ) @@ -191,8 +186,7 @@ def test_create_document_reference_request_empty_list( ): with pytest.raises(DocumentRefException) as e: mock_create_doc_ref_service.create_document_reference_request( - TEST_NHS_NUMBER, - [], + TEST_NHS_NUMBER, [] ) assert e.value == DocumentRefException(400, LambdaError.DocRefInvalidFiles) @@ -212,13 +206,12 @@ def test_create_document_reference_request_with_lg_list_happy_path( mock_check_for_duplicate_files, ): mock_get_allowed_list_of_ods_codes_for_upload_pilot.return_value = [ - TEST_CURRENT_GP_ODS, + TEST_CURRENT_GP_ODS ] mock_presigned_url_response = "https://test-bucket.s3.amazonaws.com/" url_references = mock_create_doc_ref_service.create_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE_LIST, + TEST_NHS_NUMBER, LG_FILE_LIST ) expected_response = { "uuid1": mock_presigned_url_response, @@ -228,8 +221,7 @@ def test_create_document_reference_request_with_lg_list_happy_path( assert url_references == expected_response mock_check_existing_records_and_remove_failed_upload.assert_called_with( - TEST_NHS_NUMBER, - LG_FILE_LIST[0]["docType"], + TEST_NHS_NUMBER, LG_FILE_LIST[0]["docType"] ) mock_check_for_duplicate_files.assert_called_once() @@ -261,20 +253,19 @@ def test_create_document_reference_request_raise_error_when_invalid_lg( file_name=file["fileName"], doc_type=SupportedDocumentTypes.LG, document_snomed_code_type=SnomedCodes.LLOYD_GEORGE.value.code, - ), + ) ) side_effects.append(document_references[index]) mock_create_document_reference.side_effect = side_effects mock_check_for_duplicate_files.side_effect = LGInvalidFilesException("test") mock_get_allowed_list_of_ods_codes_for_upload_pilot.return_value = [ - TEST_CURRENT_GP_ODS, + TEST_CURRENT_GP_ODS ] with pytest.raises(DocumentRefException): mock_create_doc_ref_service.create_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE_LIST, + TEST_NHS_NUMBER, LG_FILE_LIST ) mock_create_document_reference.assert_has_calls( @@ -302,8 +293,7 @@ def test_create_document_reference_failed_to_parse_pds_response( with pytest.raises(Exception) as exc_info: mock_create_doc_ref_service.create_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE_LIST, + TEST_NHS_NUMBER, LG_FILE_LIST ) exception = exc_info.value @@ -325,8 +315,7 @@ def test_cdr_nhs_number_not_found_raises_search_patient_exception( with pytest.raises(Exception) as exc_info: mock_create_doc_ref_service.create_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE_LIST, + TEST_NHS_NUMBER, LG_FILE_LIST ) exception = exc_info.value @@ -348,13 +337,12 @@ def test_cdr_non_pdf_file_raises_exception( ): mock_check_for_duplicate_files.side_effect = LGInvalidFilesException mock_get_allowed_list_of_ods_codes_for_upload_pilot.return_value = [ - TEST_CURRENT_GP_ODS, + TEST_CURRENT_GP_ODS ] with pytest.raises(Exception) as exc_info: mock_create_doc_ref_service.create_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE_LIST, + TEST_NHS_NUMBER, LG_FILE_LIST ) exception = exc_info.value @@ -375,23 +363,18 @@ def test_create_document_reference_request_lg_upload_throw_lambda_error_if_uploa ): two_minutes_ago = 1698661380 # 2023-10-30T10:23:00 mock_records_upload_in_process = create_test_lloyd_george_doc_store_refs( - override={ - "uploaded": False, - "uploading": True, - "last_updated": two_minutes_ago, - }, + override={"uploaded": False, "uploading": True, "last_updated": two_minutes_ago} ) mock_fetch_available_document_references_by_type.return_value = ( mock_records_upload_in_process ) mock_get_allowed_list_of_ods_codes_for_upload_pilot.return_value = [ - TEST_CURRENT_GP_ODS, + TEST_CURRENT_GP_ODS ] with pytest.raises(DocumentRefException) as e: mock_create_doc_ref_service.create_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE_LIST, + TEST_NHS_NUMBER, LG_FILE_LIST ) assert e.value == DocumentRefException(423, LambdaError.UploadInProgressError) @@ -409,13 +392,12 @@ def test_create_document_reference_request_lg_upload_throw_lambda_error_if_got_a create_test_lloyd_george_doc_store_refs() ) mock_get_allowed_list_of_ods_codes_for_upload_pilot.return_value = [ - TEST_CURRENT_GP_ODS, + TEST_CURRENT_GP_ODS ] with pytest.raises(DocumentRefException) as e: mock_create_doc_ref_service.create_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE_LIST, + TEST_NHS_NUMBER, LG_FILE_LIST ) assert e.value == DocumentRefException(422, LambdaError.DocRefRecordAlreadyInPlace) @@ -429,7 +411,7 @@ def test_check_existing_records_remove_previous_failed_upload_and_continue( mocker, ): mock_doc_refs_of_failed_upload = create_test_lloyd_george_doc_store_refs( - override={"uploaded": False}, + override={"uploaded": False} ) mock_fetch_available_document_references_by_type.return_value = ( mock_doc_refs_of_failed_upload @@ -438,18 +420,15 @@ def test_check_existing_records_remove_previous_failed_upload_and_continue( mock_create_doc_ref_service.stop_if_upload_is_in_process = mocker.MagicMock() mock_create_doc_ref_service.check_existing_records_and_remove_failed_upload( - TEST_NHS_NUMBER, - mock_doc_refs_of_failed_upload[0].document_snomed_code_type, + TEST_NHS_NUMBER, mock_doc_refs_of_failed_upload[0].document_snomed_code_type ) mock_remove_records.assert_called_with( - MOCK_LG_TABLE_NAME, - mock_doc_refs_of_failed_upload, + MOCK_LG_TABLE_NAME, mock_doc_refs_of_failed_upload ) def test_parse_documents_list_for_valid_input( - mock_fhir_doc_ref_base_service, - mock_create_doc_ref_service, + mock_fhir_doc_ref_base_service, mock_create_doc_ref_service ): mock_input = LG_FILE_LIST expected = PARSED_LG_FILE_LIST @@ -467,7 +446,7 @@ def test_parse_documents_list_raise_lambda_error_when_no_type( { "fileName": "test1.txt", "contentType": "text/plain", - }, + } ] with pytest.raises(DocumentRefException): @@ -483,7 +462,7 @@ def test_parse_documents_list_raise_lambda_error_when_doc_type_is_invalid( "fileName": "test1.txt", "contentType": "text/plain", "docType": "banana", - }, + } ] with pytest.raises(DocumentRefException): @@ -491,9 +470,7 @@ def test_parse_documents_list_raise_lambda_error_when_doc_type_is_invalid( def test_prepare_doc_object_lg_happy_path( - mocker, - mock_fhir_doc_ref_base_service, - mock_create_doc_ref_service, + mocker, mock_fhir_doc_ref_base_service, mock_create_doc_ref_service ): validated_document = UploadRequestDocument.model_validate(LG_FILE_LIST[0]) nhs_number = "1234567890" @@ -511,10 +488,7 @@ def test_prepare_doc_object_lg_happy_path( ) actual_document_reference = mock_create_doc_ref_service.create_document_reference( - nhs_number, - current_gp_ods, - validated_document, - snomed_code_type="SNOMED", + nhs_number, current_gp_ods, validated_document, snomed_code_type="SNOMED" ) assert actual_document_reference == mocked_doc @@ -547,7 +521,7 @@ def test_check_existing_records_does_nothing_if_no_record_exist( assert ( mock_create_doc_ref_service.check_existing_records_and_remove_failed_upload( TEST_NHS_NUMBER, - SupportedDocumentTypes.LG, + SupportedDocumentTypes.LG ) is None ) @@ -568,14 +542,14 @@ def test_check_existing_records_throw_error_if_upload_in_progress( "uploaded": False, "uploading": True, "last_updated": two_minutes_ago, - }, + } ) ) with pytest.raises(Exception) as e: mock_create_doc_ref_service.check_existing_records_and_remove_failed_upload( TEST_NHS_NUMBER, - SupportedDocumentTypes.LG, + SupportedDocumentTypes.LG ) ex = e.value assert isinstance(ex, DocumentRefException) @@ -598,7 +572,7 @@ def test_check_existing_records_throw_error_if_got_a_full_set_of_uploaded_record with pytest.raises(Exception) as e: mock_create_doc_ref_service.check_existing_records_and_remove_failed_upload( TEST_NHS_NUMBER, - SupportedDocumentTypes.LG, + SupportedDocumentTypes.LG ) ex = e.value @@ -610,12 +584,10 @@ def test_check_existing_records_throw_error_if_got_a_full_set_of_uploaded_record def test_remove_records_of_failed_upload( - mock_fhir_doc_ref_base_service, - mock_create_doc_ref_service, - mocker, + mock_fhir_doc_ref_base_service, mock_create_doc_ref_service, mocker ): mock_doc_refs_of_failed_upload = create_test_lloyd_george_doc_store_refs( - override={"uploaded": False}, + override={"uploaded": False} ) mock_create_doc_ref_service.post_fhir_doc_ref_service.s3_service = ( @@ -651,8 +623,7 @@ def test_ods_code_not_in_pilot_raises_exception( with pytest.raises(DocumentRefException) as exc_info: mock_create_doc_ref_service.create_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE_LIST, + TEST_NHS_NUMBER, LG_FILE_LIST ) mock_create_document_reference.assert_not_called() @@ -663,6 +634,23 @@ def test_ods_code_not_in_pilot_raises_exception( assert exception.message == "ODS code does not match any of the allowed." +def test_get_allowed_list_of_ods_codes_for_upload_pilot( + mock_fhir_doc_ref_base_service, mock_create_doc_ref_service, mock_ssm +): + mock_ssm.get_ssm_parameter.return_value = MOCK_ALLOWED_ODS_CODES_LIST_PILOT[ + "Parameter" + ]["Value"] + expected = "PI001,PI002,PI003" + + actual = ( + mock_create_doc_ref_service.get_allowed_list_of_ods_codes_for_upload_pilot() + ) + + mock_ssm.get_ssm_parameter.assert_called_once() + + assert actual == expected + + def test_patient_ods_does_not_match_user_ods_and_raises_exception( mock_fhir_doc_ref_base_service, mock_create_doc_ref_service, @@ -672,8 +660,7 @@ def test_patient_ods_does_not_match_user_ods_and_raises_exception( with pytest.raises(DocumentRefException) as exc_info: mock_create_doc_ref_service.create_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE_LIST, + TEST_NHS_NUMBER, LG_FILE_LIST ) mock_create_document_reference.assert_not_called() @@ -696,53 +683,49 @@ def test_unable_to_find_config_raises_exception( mock_process_fhir_document_reference, ): mock_get_allowed_list_of_ods_codes_for_upload_pilot.return_value = [ - TEST_CURRENT_GP_ODS, + TEST_CURRENT_GP_ODS ] with pytest.raises(DocumentRefException) as exc_info: mock_create_doc_ref_service.create_document_reference_request( - TEST_NHS_NUMBER, - ARF_FILE_LIST, + TEST_NHS_NUMBER, ARF_FILE_LIST ) exception = exc_info.value assert isinstance(exception, DocumentRefException) assert exception.status_code == 400 - assert exception.message == "Invalid files or id" + assert ( + exception.message + == "Invalid files or id" + ) mock_process_fhir_document_reference.assert_not_called() - def test_check_existing_records_fetches_previous_records_for_doc_type( mock_fhir_doc_ref_base_service, mock_create_doc_ref_service, mock_fetch_available_document_references_by_type, mock_remove_records, - mocker, + mocker ): doc_type = SupportedDocumentTypes.LG - expected_query_filter = ( - NotDeleted - & DynamoQueryFilterBuilder() - .add_condition( - DocumentReferenceMetadataFields.DOCUMENT_SNOMED_CODE_TYPE, - AttributeOperator.EQUAL, - doc_type, - ) - .build() - ) + expected_query_filter = NotDeleted & DynamoQueryFilterBuilder().add_condition( + DocumentReferenceMetadataFields.DOCUMENT_SNOMED_CODE_TYPE, + AttributeOperator.EQUAL, + doc_type + ).build() mocker.patch( - "services.create_document_reference_service.get_document_type_filter", + "services.create_document_reference_service.get_document_type_filter" ).return_value = expected_query_filter mock_create_doc_ref_service.check_existing_records_and_remove_failed_upload( TEST_NHS_NUMBER, - doc_type, + doc_type ) mock_fetch_available_document_references_by_type.assert_called_with( nhs_number=TEST_NHS_NUMBER, doc_type=doc_type, - query_filter=expected_query_filter, - ) + query_filter=expected_query_filter + ) \ No newline at end of file diff --git a/lambdas/tests/unit/services/test_document_reference_search_service.py b/lambdas/tests/unit/services/test_document_reference_search_service.py index 712eb9ac8a..b935c4018b 100644 --- a/lambdas/tests/unit/services/test_document_reference_search_service.py +++ b/lambdas/tests/unit/services/test_document_reference_search_service.py @@ -15,7 +15,6 @@ from tests.unit.conftest import ( APIM_API_URL, MOCK_LG_TABLE_NAME, - TEST_CURRENT_GP_ODS, TEST_FILE_SIZE, TEST_NHS_NUMBER, ) @@ -30,7 +29,6 @@ EXPECTED_RESPONSE = { "created": "2024-01-01T12:00:00.000Z", - "author": TEST_CURRENT_GP_ODS, "fileName": "document.csv", "virusScannerResult": "Clean", "id": "3d8683b9-1665-40d2-8499-6e8302d507ff", diff --git a/lambdas/tests/unit/services/test_feature_flags_service.py b/lambdas/tests/unit/services/test_feature_flags_service.py index b2e98b47f1..c04c9218cc 100644 --- a/lambdas/tests/unit/services/test_feature_flags_service.py +++ b/lambdas/tests/unit/services/test_feature_flags_service.py @@ -53,8 +53,7 @@ def mock_feature_flag_service(set_env, mocker, setup_request_context): def test_request_app_config_data_valid_response_returns_data( - mock_requests, - mock_feature_flag_service, + mock_requests, mock_feature_flag_service ): mock_requests.get(test_url, json=success_200_all_response, status_code=200) @@ -65,8 +64,7 @@ def test_request_app_config_data_valid_response_returns_data( def test_request_app_config_data_invalid_json_raises_exception( - mock_requests, - mock_feature_flag_service, + mock_requests, mock_feature_flag_service ): invalid_json = "invalid:" mock_requests.get(test_url, text=invalid_json, status_code=500) @@ -80,8 +78,7 @@ def test_request_app_config_data_invalid_json_raises_exception( def test_request_app_config_data_400_raises_not_found_exception( - mock_requests, - mock_feature_flag_service, + mock_requests, mock_feature_flag_service ): mock_requests.get(test_url, json=err_response, status_code=400) @@ -94,8 +91,7 @@ def test_request_app_config_data_400_raises_not_found_exception( def test_request_app_config_data_catch_all_raises_failure_exception( - mock_requests, - mock_feature_flag_service, + mock_requests, mock_feature_flag_service ): mock_requests.get(test_url, json=err_response, status_code=500) @@ -121,8 +117,7 @@ def test_get_feature_flags_returns_all_flags(mock_requests, mock_feature_flag_se def test_get_feature_flags_no_flags_returns_empty( - mock_requests, - mock_feature_flag_service, + mock_requests, mock_feature_flag_service ): mock_requests.get(test_url, json=empty_response, status_code=200) mock_feature_flag_service.request_app_config_data.return_value = empty_response @@ -135,8 +130,7 @@ def test_get_feature_flags_no_flags_returns_empty( def test_get_feature_flags_invalid_raises_exception( - mock_requests, - mock_feature_flag_service, + mock_requests, mock_feature_flag_service ): mock_requests.get(test_url, json=err_response, status_code=200) mock_feature_flag_service.request_app_config_data.return_value = err_response @@ -149,8 +143,7 @@ def test_get_feature_flags_invalid_raises_exception( def test_get_feature_flags_by_flag_returns_single_flag( - mock_requests, - mock_feature_flag_service, + mock_requests, mock_feature_flag_service ): mock_requests.get(test_url, json=success_200_with_filter_reponse, status_code=200) mock_feature_flag_service.request_app_config_data.return_value = ( @@ -165,8 +158,7 @@ def test_get_feature_flags_by_flag_returns_single_flag( def test_get_feature_flags_by_flag_no_flag_raises_exception( - mock_requests, - mock_feature_flag_service, + mock_requests, mock_feature_flag_service ): mock_requests.get(test_url, json=empty_response, status_code=200) mock_feature_flag_service.request_app_config_data.return_value = empty_response @@ -180,8 +172,7 @@ def test_get_feature_flags_by_flag_no_flag_raises_exception( def test_get_feature_flags_by_flag_invalid_raises_exception( - mock_requests, - mock_feature_flag_service, + mock_requests, mock_feature_flag_service ): mock_requests.get(test_url, json=err_response, status_code=200) mock_feature_flag_service.request_app_config_data.return_value = err_response @@ -204,15 +195,14 @@ def test_get_allowed_list_of_ods_codes_for_upload_pilot(mock_feature_flag_servic assert actual_codes == expected_codes mock_feature_flag_service.ssm_service.get_ssm_parameter.assert_called_with( - UPLOAD_PILOT_ODS_ALLOWED_LIST, + UPLOAD_PILOT_ODS_ALLOWED_LIST ) def test_get_allowed_list_of_ods_codes_for_upload_pilot_no_codes_found( - mock_feature_flag_service, - caplog, + mock_feature_flag_service, caplog ): - mock_feature_flag_service.ssm_service.get_ssm_parameter.return_value = "*" + mock_feature_flag_service.ssm_service.get_ssm_parameter.return_value = [] result = mock_feature_flag_service.get_allowed_list_of_ods_codes_for_upload_pilot() @@ -231,10 +221,7 @@ def test_get_allowed_list_of_ods_codes_for_upload_pilot_no_codes_found( ], ) def test_check_if_ods_code_is_in_pilot( - mocker, - mock_feature_flag_service, - auth_context, - expected_result, + mocker, mock_feature_flag_service, auth_context, expected_result ): mock_context = mocker.MagicMock() mock_context.authorization = auth_context @@ -322,8 +309,7 @@ def test_get_feature_flags_by_flag_overwrites_upload_flag( def test_get_feature_flags_by_flag_for_non_upload_flag( - mocker, - mock_feature_flag_service, + mocker, mock_feature_flag_service ): flag_name = "some_other_flag" mocker.patch.object(mock_feature_flag_service, "check_if_ods_code_is_in_pilot") diff --git a/lambdas/tests/unit/services/test_pdf_stitching_service.py b/lambdas/tests/unit/services/test_pdf_stitching_service.py index fbdcaf9d2d..f1b0a73781 100644 --- a/lambdas/tests/unit/services/test_pdf_stitching_service.py +++ b/lambdas/tests/unit/services/test_pdf_stitching_service.py @@ -23,7 +23,6 @@ MOCK_LG_TABLE_NAME, MOCK_UNSTITCHED_LG_TABLE_NAME, TEST_BASE_DIRECTORY, - TEST_CURRENT_GP_ODS, TEST_NHS_NUMBER, TEST_UUID, ) @@ -371,7 +370,6 @@ def test_migrate_multipart_references(mock_service): table_name=MOCK_UNSTITCHED_LG_TABLE_NAME, item={ "ContentType": "application/pdf", - "Author": TEST_CURRENT_GP_ODS, "Created": "2024-01-01T12:00:00.000Z", "DocumentScanCreation": "2024-01-01", "DocStatus": "final", @@ -395,7 +393,6 @@ def test_migrate_multipart_references(mock_service): item={ "ContentType": "application/pdf", "Created": "2024-01-01T12:00:00.000Z", - "Author": TEST_CURRENT_GP_ODS, "DocStatus": "final", "DocumentScanCreation": "2024-01-01", "DocumentSnomedCodeType": "16521000000101", @@ -418,7 +415,6 @@ def test_migrate_multipart_references(mock_service): item={ "ContentType": "application/pdf", "Created": "2024-01-01T12:00:00.000Z", - "Author": TEST_CURRENT_GP_ODS, "DocStatus": "final", "DocumentScanCreation": "2024-01-01", "DocumentSnomedCodeType": "16521000000101", @@ -623,7 +619,6 @@ def test_rollback_reference_migration(mock_service): item={ "ContentType": "application/pdf", "Created": TEST_DOCUMENT_REFERENCES[0].created, - "Author": TEST_CURRENT_GP_ODS, "CurrentGpOds": TEST_DOCUMENT_REFERENCES[0].current_gp_ods, "DocStatus": "final", "DocumentScanCreation": "2024-01-01", @@ -648,7 +643,6 @@ def test_rollback_reference_migration(mock_service): "ContentType": "application/pdf", "Created": TEST_DOCUMENT_REFERENCES[1].created, "CurrentGpOds": TEST_DOCUMENT_REFERENCES[1].current_gp_ods, - "Author": TEST_CURRENT_GP_ODS, "DocStatus": "final", "DocumentScanCreation": "2024-01-01", "DocumentSnomedCodeType": "16521000000101", @@ -672,7 +666,6 @@ def test_rollback_reference_migration(mock_service): "ContentType": "application/pdf", "Created": TEST_DOCUMENT_REFERENCES[2].created, "CurrentGpOds": TEST_DOCUMENT_REFERENCES[2].current_gp_ods, - "Author": TEST_CURRENT_GP_ODS, "DocStatus": "final", "DocumentScanCreation": "2024-01-01", "DocumentSnomedCodeType": "16521000000101", diff --git a/lambdas/tests/unit/services/test_pdm_get_fhir_document_reference_search_service.py b/lambdas/tests/unit/services/test_pdm_get_fhir_document_reference_search_service.py index b75c50f199..c0e275b41e 100644 --- a/lambdas/tests/unit/services/test_pdm_get_fhir_document_reference_search_service.py +++ b/lambdas/tests/unit/services/test_pdm_get_fhir_document_reference_search_service.py @@ -256,77 +256,3 @@ def test_create_document_reference_fhir_response_integration( assert isinstance(result, dict) assert result == expected_fhir_response - - -@freeze_time("2023-05-01T12:00:00Z") -def test_create_document_reference_fhir_response_no_title( - mock_document_service, - mocker, -): - mock_document_reference = mocker.MagicMock() - mock_document_reference.nhs_number = "9000000009" - mock_document_reference.file_name = None - mock_document_reference.created = "2023-05-01T12:00:00" - mock_document_reference.document_scan_creation = "2023-05-01" - mock_document_reference.id = "Y05868-1634567890" - mock_document_reference.current_gp_ods = "Y12345" - mock_document_reference.author = "Y12345" - mock_document_reference.doc_status = "final" - mock_document_reference.custodian = "Y12345" - mock_document_reference.document_snomed_code_type = "717391000000106" - mock_document_reference.version = "1" - - expected_fhir_response = { - "id": "717391000000106~Y05868-1634567890", - "resourceType": "DocumentReference", - "status": "current", - "docStatus": "final", - "subject": { - "identifier": { - "system": "https://fhir.nhs.uk/Id/nhs-number", - "value": "9000000009", - }, - }, - "date": "2023-05-01T12:00:00", - "content": [ - { - "attachment": { - "contentType": "application/pdf", - "language": "en-GB", - "creation": "2023-05-01", - "url": f"{APIM_API_URL}/DocumentReference/717391000000106~Y05868-1634567890", - }, - }, - ], - "author": [ - { - "identifier": { - "system": "https://fhir.nhs.uk/Id/ods-organization-code", - "value": "Y12345", - }, - }, - ], - "custodian": { - "identifier": { - "system": "https://fhir.nhs.uk/Id/ods-organization-code", - "value": "Y12345", - }, - }, - "type": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "717391000000106", - "display": "Confidential patient data", - }, - ], - }, - "meta": {"versionId": "1"}, - } - - result = mock_document_service.create_document_reference_fhir_response( - mock_document_reference, - ) - - assert isinstance(result, dict) - assert result == expected_fhir_response diff --git a/lambdas/tests/unit/services/test_pdm_post_fhir_document_reference_service.py b/lambdas/tests/unit/services/test_pdm_post_fhir_document_reference_service.py index 427cecf029..ca143721c9 100644 --- a/lambdas/tests/unit/services/test_pdm_post_fhir_document_reference_service.py +++ b/lambdas/tests/unit/services/test_pdm_post_fhir_document_reference_service.py @@ -6,30 +6,22 @@ from enums.mtls import MtlsCommonNames from enums.snomed_codes import SnomedCode, SnomedCodes from models.fhir.R4.base_models import Identifier, Reference -from models.fhir.R4.fhir_document_reference import ( - Attachment, -) +from models.fhir.R4.fhir_document_reference import Attachment from models.fhir.R4.fhir_document_reference import ( DocumentReference as FhirDocumentReference, ) -from models.fhir.R4.fhir_document_reference import ( - DocumentReferenceContent, -) +from models.fhir.R4.fhir_document_reference import DocumentReferenceContent from services.fhir_document_reference_service_base import ( FhirDocumentReferenceServiceBase, ) from services.post_fhir_document_reference_service import ( PostFhirDocumentReferenceService, ) -from tests.unit.conftest import ( - APIM_API_URL, -) +from tests.unit.conftest import APIM_API_URL from tests.unit.conftest import ( EXPECTED_PARSED_PATIENT_BASE_CASE as mock_pds_patient_details, ) -from tests.unit.conftest import ( - TEST_UUID, -) +from tests.unit.conftest import TEST_UUID from utils.lambda_exceptions import DocumentRefException from utils.request_context import request_context @@ -53,13 +45,13 @@ def mock_post_fhir_doc_ref_service(set_env): @pytest.fixture def mock_fhir_doc_ref_base_service(mocker, setup_request_context): mock_document_service = mocker.patch( - "services.fhir_document_reference_service_base.DocumentService", + "services.fhir_document_reference_service_base.DocumentService" ) mock_s3_service = mocker.patch( - "services.fhir_document_reference_service_base.S3Service", + "services.fhir_document_reference_service_base.S3Service" ) mock_dynamo_service = mocker.patch( - "services.fhir_document_reference_service_base.DynamoDBService", + "services.fhir_document_reference_service_base.DynamoDBService" ) service = FhirDocumentReferenceServiceBase() service.document_service = mock_document_service.return_value @@ -78,8 +70,8 @@ def mock_mtls_common_names(monkeypatch): "PDM": [ "ndrclient.main.int.pdm.national.nhs.uk", "client.dev.ndr.national.nhs.uk", - ], - }, + ] + } ), ) @@ -119,7 +111,7 @@ def valid_fhir_doc_json(): "identifier": { "system": "https://fhir.nhs.uk/Id/nhs-number", "value": "9000000009", - }, + } }, "type": { "coding": [ @@ -127,22 +119,22 @@ def valid_fhir_doc_json(): "system": "http://snomed.info/sct", "code": SnomedCodes.LLOYD_GEORGE.value.code, "display": SnomedCodes.LLOYD_GEORGE.value.display_name, - }, - ], + } + ] }, "custodian": { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "A12345", - }, + } }, "author": [ { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "A12345", - }, - }, + } + } ], "content": [ { @@ -151,10 +143,10 @@ def valid_fhir_doc_json(): "language": "en-GB", "title": "test-file.pdf", "creation": "2023-01-01T12:00:00Z", - }, - }, + } + } ], - }, + } ) @@ -169,13 +161,13 @@ def valid_fhir_doc_json_only_required(): "identifier": { "system": "https://fhir.nhs.uk/Id/nhs-number", "value": "9000000009", - }, + } }, "custodian": { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "A12345", - }, + } }, "content": [ { @@ -184,10 +176,10 @@ def valid_fhir_doc_json_only_required(): "language": "en-GB", "title": "test-file.pdf", "creation": "2023-01-01T12:00:00Z", - }, - }, + } + } ], - }, + } ) @@ -233,7 +225,7 @@ def valid_mtls_fhir_doc_json(): "identifier": { "system": "https://fhir.nhs.uk/Id/nhs-number", "value": "9000000009", - }, + } }, "type": { "coding": [ @@ -241,22 +233,22 @@ def valid_mtls_fhir_doc_json(): "system": "http://snomed.info/sct", "code": SnomedCodes.PATIENT_DATA.value.code, "display": SnomedCodes.PATIENT_DATA.value.display_name, - }, - ], + } + ] }, "custodian": { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "A12345", - }, + } }, "author": [ { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "A12345", - }, - }, + } + } ], "content": [ { @@ -265,91 +257,10 @@ def valid_mtls_fhir_doc_json(): "language": "en-GB", "title": "test-file.pdf", "creation": "2023-01-01T12:00:00Z", - }, - }, + } + } ], - }, - ) - - -@pytest.fixture -def invalid_fhir_doc_json_missing_content(): - return json.dumps( - { - "resourceType": "DocumentReference", - "docStatus": "final", - "status": "current", - "subject": { - "identifier": { - "system": "https://fhir.nhs.uk/Id/nhs-number", - "value": "9000000009", - }, - }, - "type": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": SnomedCodes.PATIENT_DATA.value.code, - "display": SnomedCodes.PATIENT_DATA.value.display_name, - }, - ], - }, - "custodian": { - "identifier": { - "system": "https://fhir.nhs.uk/Id/ods-organization-code", - "value": "A12345", - }, - }, - "author": [ - { - "identifier": { - "system": "https://fhir.nhs.uk/Id/ods-organization-code", - "value": "A12345", - }, - }, - ], - }, - ) - - -@pytest.fixture -def invalid_fhir_doc_json_missing_content_attachment(): - return json.dumps( - { - "resourceType": "DocumentReference", - "docStatus": "final", - "status": "current", - "subject": { - "identifier": { - "system": "https://fhir.nhs.uk/Id/nhs-number", - "value": "9000000009", - }, - }, - "type": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": SnomedCodes.PATIENT_DATA.value.code, - "display": SnomedCodes.PATIENT_DATA.value.display_name, - }, - ], - }, - "custodian": { - "identifier": { - "system": "https://fhir.nhs.uk/Id/ods-organization-code", - "value": "A12345", - }, - }, - "author": [ - { - "identifier": { - "system": "https://fhir.nhs.uk/Id/ods-organization-code", - "value": "A12345", - }, - }, - ], - "content": [{}], - }, + } ) @@ -387,22 +298,20 @@ def valid_fhir_doc_object_without_optional(valid_fhir_doc_json_only_required): def test_get_dynamo_table_for_patient_data_doc_type( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service ): """Test _get_dynamo_table_for_doc_type method with a non-Lloyd George document type.""" patient_data_code = SnomedCodes.PATIENT_DATA.value result = mock_post_fhir_doc_ref_service._get_dynamo_table_for_doc_type( - patient_data_code, + patient_data_code ) assert result == str(DynamoTables.CORE) def test_get_dynamo_table_for_unsupported_doc_type( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service ): """Test _get_dynamo_table_for_doc_type method with a non-Lloyd George document type.""" @@ -416,8 +325,7 @@ def test_get_dynamo_table_for_unsupported_doc_type( def test_get_dynamo_table_for_lloyd_george_doc_type( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service ): """Test _get_dynamo_table_for_doc_type method with Lloyd George document type.""" lg_code = SnomedCodes.LLOYD_GEORGE.value @@ -438,8 +346,7 @@ def test_process_mtls_fhir_document_reference_with_binary( custom_endpoint = f"{APIM_API_URL}/DocumentReference" result = mock_post_fhir_doc_ref_service.process_fhir_document_reference( - valid_mtls_fhir_doc_with_binary, - valid_mtls_request_context, + valid_mtls_fhir_doc_with_binary, valid_mtls_request_context ) assert isinstance(result, str) @@ -450,25 +357,20 @@ def test_process_mtls_fhir_document_reference_with_binary( def test_determine_document_type_with_correct_common_name( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker ): """Test _determine_document_type method when type is missing entirely.""" fhir_doc = mocker.MagicMock(spec=FhirDocumentReference) fhir_doc.type = None result = mock_post_fhir_doc_ref_service._determine_document_type( - fhir_doc, - MtlsCommonNames.PDM, + fhir_doc, MtlsCommonNames.PDM ) assert result == SnomedCodes.PATIENT_DATA.value def test_s3_file_key_for_pdm( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker ): """Test _create_document_reference method without custodian information.""" @@ -479,16 +381,15 @@ def test_s3_file_key_for_pdm( contentType="application/pdf", title="test-file.pdf", creation="2023-01-01T12:00:00Z", - ), - ), + ) + ) ] fhir_doc.author = [ Reference( identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="B67890", - ), - ), + system="https://fhir.nhs.uk/Id/ods-organization-code", value="B67890" + ) + ) ] fhir_doc.custodian = None @@ -513,9 +414,7 @@ def test_s3_file_key_for_pdm( def test_create_pdm_document_reference_with_raw_request( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker ): """Test _create_document_reference method with raw_request included (pdm).""" @@ -526,22 +425,20 @@ def test_create_pdm_document_reference_with_raw_request( contentType="application/pdf", title="test-file.pdf", creation="2023-01-01T12:00:00Z", - ), - ), + ) + ) ] fhir_doc.custodian = Reference( identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="A12345", - ), + system="https://fhir.nhs.uk/Id/ods-organization-code", value="A12345" + ) ) fhir_doc.author = [ Reference( identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="B67890", - ), - ), + system="https://fhir.nhs.uk/Id/ods-organization-code", value="B67890" + ) + ) ] doc_type = SnomedCodes.PATIENT_DATA.value @@ -564,9 +461,7 @@ def test_create_pdm_document_reference_with_raw_request( def test_create_lg_document_reference_with_raw_request( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker ): """Test _create_document_reference method with raw_request included (LG, should be empty).""" @@ -577,22 +472,20 @@ def test_create_lg_document_reference_with_raw_request( contentType="application/pdf", title="test-file.pdf", creation="2023-01-01T12:00:00Z", - ), - ), + ) + ) ] fhir_doc.custodian = Reference( identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="A12345", - ), + system="https://fhir.nhs.uk/Id/ods-organization-code", value="A12345" + ) ) fhir_doc.author = [ Reference( identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="B67890", - ), - ), + system="https://fhir.nhs.uk/Id/ods-organization-code", value="B67890" + ) + ) ] doc_type = SnomedCodes.LLOYD_GEORGE.value @@ -615,11 +508,9 @@ def test_create_lg_document_reference_with_raw_request( def test_create_pdm_document_reference_without_author_or_type( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, + mock_post_fhir_doc_ref_service, mocker ): - """Test _create_document_reference method without author or type.""" + """Test _create_document_reference method with raw_request included (LG, should be empty).""" fhir_doc = mocker.MagicMock(spec=FhirDocumentReference) fhir_doc.content = [ @@ -628,14 +519,13 @@ def test_create_pdm_document_reference_without_author_or_type( contentType="application/pdf", title="test-file.pdf", creation="2023-01-01T12:00:00Z", - ), - ), + ) + ) ] fhir_doc.custodian = Reference( identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="A12345", - ), + system="https://fhir.nhs.uk/Id/ods-organization-code", value="A12345" + ) ) fhir_doc.author = [] fhir_doc.type = [] @@ -656,88 +546,3 @@ def test_create_pdm_document_reference_without_author_or_type( assert result.custodian == "A12345" assert result.current_gp_ods == "C13579" assert result.author is None - - -def test_create_pdm_document_reference_without_title( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, -): - """Test _create_document_reference method without title""" - - fhir_doc = mocker.MagicMock(spec=FhirDocumentReference) - fhir_doc.content = [ - DocumentReferenceContent( - attachment=Attachment( - contentType="application/pdf", - creation="2023-01-01T12:00:00Z", - ), - ), - ] - fhir_doc.custodian = Reference( - identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="A12345", - ), - ) - fhir_doc.author = [ - Reference( - identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="B67890", - ), - ), - ] - - doc_type = SnomedCodes.PATIENT_DATA.value - result = mock_post_fhir_doc_ref_service._create_document_reference( - nhs_number="9000000009", - author="B67890", - doc_type=doc_type, - fhir_doc=fhir_doc, - current_gp_ods="C13579", - raw_fhir_doc=json.dumps({"foo": "bar"}), - ) - - assert result.raw_request == json.dumps({"foo": "bar"}) - assert result.nhs_number == "9000000009" - assert result.document_snomed_code_type == SnomedCodes.PATIENT_DATA.value.code - assert result.custodian == "A12345" - assert result.current_gp_ods == "C13579" - assert result.file_name is None - - -def test_process_fhir_document_reference_without_content_raises_error( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mock_mtls_common_names, - invalid_fhir_doc_json_missing_content, - valid_mtls_request_context, -): - with pytest.raises(DocumentRefException) as excinfo: - mock_post_fhir_doc_ref_service.process_fhir_document_reference( - invalid_fhir_doc_json_missing_content, - valid_mtls_request_context, - ) - - assert excinfo.value.status_code == 400 - assert excinfo.value.error == LambdaError.DocRefNoParse - assert excinfo.value.message == "Failed to parse document upload request data" - - -def test_process_fhir_document_reference_without_content_attachment_raises_error( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mock_mtls_common_names, - invalid_fhir_doc_json_missing_content_attachment, - valid_mtls_request_context, -): - with pytest.raises(DocumentRefException) as excinfo: - mock_post_fhir_doc_ref_service.process_fhir_document_reference( - invalid_fhir_doc_json_missing_content_attachment, - valid_mtls_request_context, - ) - - assert excinfo.value.status_code == 400 - assert excinfo.value.error == LambdaError.DocRefNoParse - assert excinfo.value.message == "Failed to parse document upload request data" diff --git a/lambdas/tests/unit/services/test_pdm_upload_document_reference_service.py b/lambdas/tests/unit/services/test_pdm_upload_document_reference_service.py index 908cb7218e..c0b3d14383 100644 --- a/lambdas/tests/unit/services/test_pdm_upload_document_reference_service.py +++ b/lambdas/tests/unit/services/test_pdm_upload_document_reference_service.py @@ -34,7 +34,7 @@ def mock_document_reference(): doc_ref.doc_status = "uploading" doc_ref.version = "1" doc_ref._build_s3_location = Mock( - return_value="s3://test-lg-bucket/9000000001/test-doc-id", + return_value="s3://test-lg-bucket/9000000001/test-doc-id" ) return doc_ref @@ -44,7 +44,7 @@ def mock_virus_scan_service( mocker, ): mock = mocker.patch( - "services.upload_document_reference_service.get_virus_scan_service", + "services.upload_document_reference_service.get_virus_scan_service" ) yield mock @@ -79,7 +79,7 @@ def mock_pdm_document_reference(): doc_ref.file_size = 1234567890 doc_ref.doc_status = "uploading" doc_ref._build_s3_location = Mock( - return_value=f"s3://test-staging-bucket/fhir_upload/{SnomedCodes.PATIENT_DATA.value.code}/9000000001/test-doc-id", + return_value=f"s3://test-staging-bucket/fhir_upload/{SnomedCodes.PATIENT_DATA.value.code}/9000000001/test-doc-id" ) return doc_ref @@ -118,9 +118,7 @@ def test_handle_upload_document_reference_request_with_none_object_key(pdm_servi def test_handle_upload_document_reference_request_success( - service, - mock_pdm_document_reference, - mocker, + service, mock_pdm_document_reference, mocker ): """Test successful handling of the upload document reference request""" object_key = ( @@ -132,7 +130,7 @@ def test_handle_upload_document_reference_request_success( [mock_pdm_document_reference], ] service.virus_scan_service.scan_file = mocker.MagicMock( - return_value=VirusScanResult.CLEAN, + return_value=VirusScanResult.CLEAN ) service.handle_upload_document_reference_request(object_key, object_size) @@ -148,26 +146,24 @@ def test_handle_upload_document_reference_request_with_exception(pdm_service): object_key = "staging/test-doc-id" pdm_service.document_service.fetch_documents_from_table.side_effect = Exception( - "Test error", + "Test error" ) pdm_service.handle_upload_document_reference_request(object_key) def test_fetch_preliminary_document_reference_success( - pdm_service, - mock_pdm_document_reference, + pdm_service, mock_pdm_document_reference ): """Test successful document reference fetching""" document_key = "test-doc-id" nhs_number = "12345" pdm_service.document_service.fetch_documents_from_table.return_value = [ - mock_pdm_document_reference, + mock_pdm_document_reference ] result = pdm_service._fetch_preliminary_document_reference( - document_key=document_key, - nhs_number=nhs_number, + document_key=document_key, nhs_number=nhs_number ) assert result == mock_pdm_document_reference @@ -186,8 +182,7 @@ def test_fetch_preliminary_document_reference_no_documents_found(pdm_service): pdm_service.document_service.fetch_documents_from_table.return_value = [] result = pdm_service._fetch_preliminary_document_reference( - document_key=document_key, - nhs_number=nhs_number, + document_key=document_key, nhs_number=nhs_number ) assert result is None @@ -199,14 +194,12 @@ def test_fetch_preliminary_document_reference_no_nhs_number(pdm_service): nhs_number = None with pytest.raises(FileProcessingException): pdm_service._fetch_preliminary_document_reference( - document_key=document_key, - nhs_number=nhs_number, + document_key=document_key, nhs_number=nhs_number ) def test_fetch_preliminary_document_reference_multiple_documents_warning( - pdm_service, - mock_document_reference, + pdm_service, mock_document_reference ): """Test handling when multiple documents are found""" document_key = "test-doc-id" @@ -218,8 +211,7 @@ def test_fetch_preliminary_document_reference_multiple_documents_warning( ] result = pdm_service._fetch_preliminary_document_reference( - document_key=document_key, - nhs_number=nhs_number, + document_key=document_key, nhs_number=nhs_number ) assert result == mock_document_reference @@ -235,35 +227,27 @@ def test_fetch_preliminary_document_reference_exception(pdm_service): with pytest.raises(DocumentServiceException): pdm_service._fetch_preliminary_document_reference( - document_key=document_key, - nhs_number=nhs_number, + document_key=document_key, nhs_number=nhs_number ) def test__process_preliminary_document_reference_clean_virus_scan( - pdm_service, - mock_pdm_document_reference, - mocker, + pdm_service, mock_pdm_document_reference, mocker ): """Test processing document reference with a clean virus scan""" object_key = "12345/test-doc-id" mocker.patch.object( - pdm_service, - "_perform_virus_scan", - return_value=VirusScanResult.CLEAN, + pdm_service, "_perform_virus_scan", return_value=VirusScanResult.CLEAN ) mock_process_clean = mocker.patch.object(pdm_service, "_process_clean_document") mock_finalize_transaction = mocker.patch.object( - pdm_service, - "_finalize_and_supersede_with_transaction", + pdm_service, "_finalize_and_supersede_with_transaction" ) mock_delete = mocker.patch.object(pdm_service, "delete_file_from_staging_bucket") pdm_service._process_preliminary_document_reference( - mock_pdm_document_reference, - object_key, - 1222, + mock_pdm_document_reference, object_key, 1222 ) mock_process_clean.assert_called_once() @@ -273,28 +257,21 @@ def test__process_preliminary_document_reference_clean_virus_scan( assert mock_pdm_document_reference.uploading is False mock_delete.assert_called_once() - def test__process_preliminary_document_reference_infected_virus_scan( - pdm_service, - mock_document_reference, - mocker, + pdm_service, mock_document_reference, mocker ): """Test processing document reference with an infected virus scan""" object_key = "staging/test-doc-id" mocker.patch.object( - pdm_service, - "_perform_virus_scan", - return_value=VirusScanResult.INFECTED, + pdm_service, "_perform_virus_scan", return_value=VirusScanResult.INFECTED ) mock_delete = mocker.patch.object(pdm_service, "delete_file_from_staging_bucket") mock_process_clean = mocker.patch.object(pdm_service, "_process_clean_document") mock_update_dynamo = mocker.patch.object(pdm_service, "_update_dynamo_table") pdm_service._process_preliminary_document_reference( - mock_document_reference, - object_key, - 1222, + mock_document_reference, object_key, 1222 ) mock_process_clean.assert_not_called() @@ -303,8 +280,7 @@ def test__process_preliminary_document_reference_infected_virus_scan( def test_perform_virus_scan_returns_clean_hardcoded( - pdm_service, - mock_document_reference, + pdm_service, mock_document_reference ): """Test virus scan returns hardcoded CLEAN result""" object_key = "staging/test-doc-id" @@ -313,9 +289,7 @@ def test_perform_virus_scan_returns_clean_hardcoded( def test_perform_virus_scan_exception_returns_infected( - pdm_service, - mock_document_reference, - mocker, + pdm_service, mock_document_reference, mocker ): """Test virus scan exception handling returns INFECTED for safety""" mock_virus_service = mocker.patch.object(pdm_service, "virus_scan_service") @@ -342,9 +316,7 @@ def test_process_clean_document_success(pdm_service, mock_document_reference, mo def test_process_clean_document_exception_restores_original_values( - pdm_service, - mock_document_reference, - mocker, + pdm_service, mock_document_reference, mocker ): """Test that original values are restored when processing fails""" object_key = "staging/test-doc-id" @@ -370,8 +342,7 @@ def test_process_clean_document_exception_restores_original_values( def test_copy_files_from_staging_bucket_success( - pdm_service, - mock_pdm_document_reference, + pdm_service, mock_pdm_document_reference ): """Test successful file copying from staging bucket""" source_file_key = ( @@ -380,8 +351,7 @@ def test_copy_files_from_staging_bucket_success( expected_dest_key = "9000000001/test-doc-id" pdm_service.copy_files_from_staging_bucket( - mock_pdm_document_reference, - source_file_key, + mock_pdm_document_reference, source_file_key ) pdm_service.s3_service.copy_across_bucket.assert_called_once_with( @@ -396,14 +366,13 @@ def test_copy_files_from_staging_bucket_success( def test_copy_files_from_staging_bucket_client_error( - pdm_service, - mock_document_reference, + pdm_service, mock_document_reference ): """Test handling of ClientError during file copying""" source_file_key = "staging/test-doc-id" client_error = ClientError( error_response={ - "Error": {"Code": "NoSuchBucket", "Message": "Bucket does not exist"}, + "Error": {"Code": "NoSuchBucket", "Message": "Bucket does not exist"} }, operation_name="CopyObject", ) @@ -411,8 +380,7 @@ def test_copy_files_from_staging_bucket_client_error( with pytest.raises(FileProcessingException): pdm_service.copy_files_from_staging_bucket( - mock_document_reference, - source_file_key, + mock_document_reference, source_file_key ) @@ -423,8 +391,7 @@ def test_delete_file_from_staging_bucket_success(pdm_service): pdm_service.delete_file_from_staging_bucket(source_file_key) pdm_service.s3_service.delete_object.assert_called_once_with( - MOCK_STAGING_STORE_BUCKET, - source_file_key, + MOCK_STAGING_STORE_BUCKET, source_file_key ) @@ -437,8 +404,7 @@ def test_delete_pdm_file_from_staging_bucket_success(pdm_service): pdm_service.delete_file_from_staging_bucket(source_file_key) pdm_service.s3_service.delete_object.assert_called_once_with( - MOCK_STAGING_STORE_BUCKET, - source_file_key, + MOCK_STAGING_STORE_BUCKET, source_file_key ) @@ -447,7 +413,7 @@ def test_delete_file_from_staging_bucket_client_error(pdm_service): source_file_key = "staging/test-doc-id" client_error = ClientError( error_response={ - "Error": {"Code": "NoSuchKey", "Message": "Key does not exist"}, + "Error": {"Code": "NoSuchKey", "Message": "Key does not exist"} }, operation_name="DeleteObject", ) @@ -461,8 +427,7 @@ def test_delete_file_from_staging_bucket_client_error(pdm_service): def test_update_dynamo_table_clean_scan_result( - pdm_service, - mock_pdm_document_reference, + pdm_service, mock_pdm_document_reference ): """Test updating DynamoDB table with a clean scan result""" pdm_service._update_dynamo_table(mock_pdm_document_reference) @@ -494,10 +459,7 @@ def test_update_dynamo_table_client_error(pdm_service, mock_document_reference): """Test handling of ClientError during DynamoDB update""" client_error = ClientError( error_response={ - "Error": { - "Code": "ResourceNotFoundException", - "Message": "Table not found", - }, + "Error": {"Code": "ResourceNotFoundException", "Message": "Table not found"} }, operation_name="UpdateItem", ) @@ -523,17 +485,13 @@ def test_handle_upload_document_reference_request_no_document_found(pdm_service) def test_process_preliminary_document_reference_exception_during_processing( - pdm_service, - mock_document_reference, - mocker, + pdm_service, mock_document_reference, mocker ): """Test that exceptions during processing are properly raised""" object_key = "staging/test-doc-id" mocker.patch.object( - pdm_service, - "_perform_virus_scan", - return_value=VirusScanResult.CLEAN, + pdm_service, "_perform_virus_scan", return_value=VirusScanResult.CLEAN ) mocker.patch.object( pdm_service, @@ -543,9 +501,7 @@ def test_process_preliminary_document_reference_exception_during_processing( with pytest.raises(Exception) as exc_info: pdm_service._process_preliminary_document_reference( - mock_document_reference, - object_key, - 1222, + mock_document_reference, object_key, 1222 ) assert "Processing failed" in str(exc_info.value) @@ -555,7 +511,7 @@ def test_get_infrastructure_for_document_key_pdm(service): assert service.table_name == "" assert service.destination_bucket_name == MOCK_LG_BUCKET service._get_infrastructure_for_document_key( - object_parts=["fhir_upload", SnomedCodes.PATIENT_DATA.value.code, "1234"], + object_parts=["fhir_upload", SnomedCodes.PATIENT_DATA.value.code, "1234"] ) assert service.table_name == str(DynamoTables.CORE) assert service.destination_bucket_name == MOCK_PDM_BUCKET @@ -651,19 +607,17 @@ def test_document_type_extraction_from_object_key( def test_handle_upload_pdm_document_reference_request_success( - service, - mock_document_reference, - mocker, + service, mock_document_reference, mocker ): """Test successful handling of the upload document reference request""" pdm_snomed = SnomedCodes.PATIENT_DATA.value object_key = f"fhir_upload/{pdm_snomed.code}/staging/test-doc-id" object_size = 1111 service.document_service.fetch_documents_from_table.return_value = [ - mock_document_reference, + mock_document_reference ] service.virus_scan_service.scan_file = mocker.MagicMock( - return_value=VirusScanResult.CLEAN, + return_value=VirusScanResult.CLEAN ) service.handle_upload_document_reference_request(object_key, object_size) @@ -676,8 +630,7 @@ def test_handle_upload_pdm_document_reference_request_success( def test_copy_files_from_staging_bucket_to_pdm_success( - pdm_service, - mock_pdm_document_reference, + pdm_service, mock_pdm_document_reference ): """Test successful file copying from staging bucket""" source_file_key = ( @@ -687,8 +640,7 @@ def test_copy_files_from_staging_bucket_to_pdm_success( f"{mock_pdm_document_reference.nhs_number}/{mock_pdm_document_reference.id}" ) pdm_service.copy_files_from_staging_bucket( - mock_pdm_document_reference, - source_file_key, + mock_pdm_document_reference, source_file_key ) pdm_service.s3_service.copy_across_bucket.assert_called_once_with( source_bucket=MOCK_STAGING_STORE_BUCKET, diff --git a/lambdas/tests/unit/services/test_post_fhir_document_reference_service.py b/lambdas/tests/unit/services/test_post_fhir_document_reference_service.py index 397f8467a4..4db5aced91 100644 --- a/lambdas/tests/unit/services/test_post_fhir_document_reference_service.py +++ b/lambdas/tests/unit/services/test_post_fhir_document_reference_service.py @@ -6,32 +6,22 @@ from enums.snomed_codes import SnomedCode, SnomedCodes from models.document_reference import DocumentReference from models.fhir.R4.base_models import CodeableConcept, Identifier, Reference -from models.fhir.R4.fhir_document_reference import ( - SNOMED_URL, - Attachment, -) +from models.fhir.R4.fhir_document_reference import SNOMED_URL, Attachment from models.fhir.R4.fhir_document_reference import ( DocumentReference as FhirDocumentReference, ) -from models.fhir.R4.fhir_document_reference import ( - DocumentReferenceContent, -) +from models.fhir.R4.fhir_document_reference import DocumentReferenceContent from services.fhir_document_reference_service_base import ( FhirDocumentReferenceServiceBase, ) from services.post_fhir_document_reference_service import ( PostFhirDocumentReferenceService, ) -from tests.unit.conftest import ( - APIM_API_URL, -) +from tests.unit.conftest import APIM_API_URL from tests.unit.conftest import ( EXPECTED_PARSED_PATIENT_BASE_CASE as mock_pds_patient_details, ) -from tests.unit.conftest import ( - MOCK_LG_TABLE_NAME, - TEST_UUID, -) +from tests.unit.conftest import MOCK_LG_TABLE_NAME, TEST_UUID from utils.exceptions import FhirDocumentReferenceException from utils.lambda_exceptions import DocumentRefException from utils.request_context import request_context @@ -46,16 +36,16 @@ def mock_post_fhir_doc_ref_service(set_env): @pytest.fixture def mock_fhir_doc_ref_base_service(mocker, setup_request_context): mock_document_service = mocker.patch( - "services.fhir_document_reference_service_base.DocumentService", + "services.fhir_document_reference_service_base.DocumentService" ) mock_s3_service = mocker.patch( - "services.fhir_document_reference_service_base.S3Service", + "services.fhir_document_reference_service_base.S3Service" ) mock_dynamo_service = mocker.patch( - "services.fhir_document_reference_service_base.DynamoDBService", + "services.fhir_document_reference_service_base.DynamoDBService" ) mock_doc_type_table_router = mocker.patch( - "services.fhir_document_reference_service_base.DocTypeTableRouter", + "services.fhir_document_reference_service_base.DocTypeTableRouter" ) service = FhirDocumentReferenceServiceBase() service.document_service = mock_document_service.return_value @@ -110,7 +100,7 @@ def valid_fhir_doc_json(): "identifier": { "system": "https://fhir.nhs.uk/Id/nhs-number", "value": "9000000009", - }, + } }, "type": { "coding": [ @@ -118,22 +108,22 @@ def valid_fhir_doc_json(): "system": "http://snomed.info/sct", "code": SnomedCodes.LLOYD_GEORGE.value.code, "display": SnomedCodes.LLOYD_GEORGE.value.display_name, - }, - ], + } + ] }, "custodian": { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "A12345", - }, + } }, "author": [ { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "A12345", - }, - }, + } + } ], "content": [ { @@ -142,10 +132,10 @@ def valid_fhir_doc_json(): "language": "en-GB", "title": "test-file.pdf", "creation": "2023-01-01T12:00:00Z", - }, - }, + } + } ], - }, + } ) @@ -175,7 +165,7 @@ def test_process_fhir_document_reference_with_presigned_url( mock_handle_document_save.return_value = mock_presigned_url_response result = mock_post_fhir_doc_ref_service.process_fhir_document_reference( - valid_fhir_doc_json, + valid_fhir_doc_json ) expected_pre_sign_url = mock_presigned_url_response @@ -197,7 +187,7 @@ def test_process_fhir_document_reference_with_binary( custom_endpoint = f"{APIM_API_URL}/DocumentReference" mock_handle_document_save.return_value = None result = mock_post_fhir_doc_ref_service.process_fhir_document_reference( - valid_fhir_doc_with_binary, + valid_fhir_doc_with_binary ) assert isinstance(result, str) @@ -208,8 +198,7 @@ def test_process_fhir_document_reference_with_binary( def test_validation_error( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service ): """Test handling of an invalid FHIR document.""" with pytest.raises(DocumentRefException) as excinfo: @@ -233,7 +222,6 @@ def test_validation_error( ], ) def test_doc_ref_no_parse_message_includes_details_format( - mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, valid_fhir_doc_json, nhs_number, @@ -246,7 +234,7 @@ def test_doc_ref_no_parse_message_includes_details_format( with pytest.raises(DocumentRefException) as error: mock_post_fhir_doc_ref_service.process_fhir_document_reference( - invalid_nhs_doc_json, + invalid_nhs_doc_json ) assert error.value.status_code == 400 @@ -280,8 +268,8 @@ def test_doc_ref_no_parse_message_includes_details_format( "system": "http://snomed.info/sct", "code": "invalid-code", "display": "Invalid", - }, - ], + } + ] }, }, LambdaError.DocRefInvalidType, @@ -309,9 +297,7 @@ def test_document_validation_errors( def test_raise_dynamo_error( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - valid_fhir_doc_json, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, valid_fhir_doc_json ): """Test handling of DynamoDB error.""" mock_fhir_doc_ref_base_service.dynamo_service.create_item.side_effect = ClientError( @@ -321,7 +307,7 @@ def test_raise_dynamo_error( with pytest.raises(DocumentRefException) as excinfo: mock_post_fhir_doc_ref_service.process_fhir_document_reference( - valid_fhir_doc_json, + valid_fhir_doc_json ) assert excinfo.value.status_code == 500 @@ -355,9 +341,7 @@ def test_save_document_reference_to_dynamo_error( with pytest.raises(DocumentRefException) as excinfo: mock_post_fhir_doc_ref_service._handle_document_save( - document_ref, - valid_fhir_doc_object, - "test_table", + document_ref, valid_fhir_doc_object, "test_table" ) assert excinfo.value.status_code == 500 @@ -375,12 +359,12 @@ def test_process_fhir_document_reference_with_pds_error( """Test process_fhir_document_reference with a real PDS error (PatientNotFoundException).""" mock_check_nhs_number_with_pds.side_effect = FhirDocumentReferenceException( - "Patient not found", + "Patient not found" ) with pytest.raises(DocumentRefException) as excinfo: mock_post_fhir_doc_ref_service.process_fhir_document_reference( - valid_fhir_doc_json, + valid_fhir_doc_json ) assert excinfo.value.status_code == 400 @@ -388,9 +372,7 @@ def test_process_fhir_document_reference_with_pds_error( def test_s3_presigned_url_error( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - valid_fhir_doc_json, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, valid_fhir_doc_json ): """Test handling of S3 presigned URL error.""" mock_fhir_doc_ref_base_service.s3_service.create_put_presigned_url.side_effect = ( @@ -402,7 +384,7 @@ def test_s3_presigned_url_error( with pytest.raises(DocumentRefException) as excinfo: mock_post_fhir_doc_ref_service.process_fhir_document_reference( - valid_fhir_doc_json, + valid_fhir_doc_json ) assert excinfo.value.status_code == 500 @@ -416,13 +398,12 @@ def test_s3_upload_error( ): """Test handling of S3 upload error.""" mock_fhir_doc_ref_base_service.s3_service.upload_file_obj.side_effect = ClientError( - {"Error": {"Code": "InternalServerError", "Message": "Test error"}}, - "PutObject", + {"Error": {"Code": "InternalServerError", "Message": "Test error"}}, "PutObject" ) with pytest.raises(DocumentRefException) as excinfo: mock_post_fhir_doc_ref_service.process_fhir_document_reference( - valid_fhir_doc_with_binary, + valid_fhir_doc_with_binary ) assert excinfo.value.status_code == 500 @@ -438,12 +419,12 @@ def test_extract_nhs_number_from_fhir_with_invalid_system( """Test _extract_nhs_number_from_fhir method with an invalid NHS number system.""" valid_fhir_doc_object.subject = Reference( - identifier=Identifier(system="invalid-system", value="9000000009"), + identifier=Identifier(system="invalid-system", value="9000000009") ) with pytest.raises(DocumentRefException) as excinfo: mock_post_fhir_doc_ref_service.process_fhir_document_reference( - valid_fhir_doc_object.model_dump_json(), + valid_fhir_doc_object.model_dump_json() ) assert excinfo.value.status_code == 400 @@ -461,7 +442,7 @@ def test_extract_nhs_number_from_fhir_with_missing_identifier( with pytest.raises(DocumentRefException) as excinfo: mock_post_fhir_doc_ref_service.process_fhir_document_reference( - valid_fhir_doc_object.model_dump_json(), + valid_fhir_doc_object.model_dump_json() ) assert excinfo.value.status_code == 400 @@ -469,9 +450,7 @@ def test_extract_nhs_number_from_fhir_with_missing_identifier( def test_create_document_reference_with_author( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker ): """Test _create_document_reference method with author information included.""" @@ -482,22 +461,20 @@ def test_create_document_reference_with_author( contentType="application/pdf", title="test-file.pdf", creation="2023-01-01T12:00:00Z", - ), - ), + ) + ) ] fhir_doc.custodian = Reference( identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="A12345", - ), + system="https://fhir.nhs.uk/Id/ods-organization-code", value="A12345" + ) ) fhir_doc.author = [ Reference( identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="B67890", - ), - ), + system="https://fhir.nhs.uk/Id/ods-organization-code", value="B67890" + ) + ) ] doc_type = SnomedCode(code="test-code", display_name="Test Type") @@ -519,9 +496,7 @@ def test_create_document_reference_with_author( def test_create_document_reference_without_custodian( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker ): """Test _create_document_reference method without custodian information.""" @@ -532,16 +507,15 @@ def test_create_document_reference_without_custodian( contentType="application/pdf", title="test-file.pdf", creation="2023-01-01T12:00:00Z", - ), - ), + ) + ) ] fhir_doc.author = [ Reference( identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="B67890", - ), - ), + system="https://fhir.nhs.uk/Id/ods-organization-code", value="B67890" + ) + ) ] fhir_doc.custodian = None @@ -569,8 +543,8 @@ def test_create_document_reference_without_custodian( identifier=Identifier( system="https://fhir.nhs.uk/Id/ods-organization-code", value="A12345", - ), - ), + ) + ) ], "A12345", ), @@ -605,19 +579,16 @@ def test_extract_author_from_fhir( [ Reference( identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - ), - ), + system="https://fhir.nhs.uk/Id/ods-organization-code" + ) + ) ] ), ([Reference(identifier=None)]), ], ) def test_extract_author_from_fhir_raises_error( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, - fhir_author, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker, fhir_author ): """Test _extract_author_from_fhir method with malformed json returns Validation errors.""" fhir_doc = mocker.MagicMock(spec=FhirDocumentReference) @@ -630,9 +601,7 @@ def test_extract_author_from_fhir_raises_error( def test_determine_document_type_with_missing_type( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker ): """Test _determine_document_type method when type is missing entirely.""" fhir_doc = mocker.MagicMock(spec=FhirDocumentReference) @@ -646,9 +615,7 @@ def test_determine_document_type_with_missing_type( def test_determine_document_type_with_unknown_config( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker ): """Test _determine_document_type method when type is missing entirely.""" fhir_doc = mocker.MagicMock(spec=FhirDocumentReference) @@ -657,7 +624,7 @@ def test_determine_document_type_with_unknown_config( "system": SNOMED_URL, "code": "1234567890", "display": "unknown code", - }, + } ] fhir_doc.type = CodeableConcept(coding=mock_coding) @@ -669,9 +636,7 @@ def test_determine_document_type_with_unknown_config( def test_determine_document_type_with_missing_coding( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker ): """Test _determine_document_type method when coding is missing.""" fhir_doc = mocker.MagicMock(spec=FhirDocumentReference) @@ -686,8 +651,7 @@ def test_determine_document_type_with_missing_coding( def test_process_fhir_document_reference_with_malformed_json( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service ): """Test process_fhir_document_reference with malformed JSON.""" malformed_json = '{"resourceType": "DocumentReference", "invalid": }' @@ -700,8 +664,7 @@ def test_process_fhir_document_reference_with_malformed_json( def test_process_fhir_document_reference_with_empty_string( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service ): """Test process_fhir_document_reference with an empty string.""" with pytest.raises(DocumentRefException) as excinfo: @@ -712,8 +675,7 @@ def test_process_fhir_document_reference_with_empty_string( def test_process_fhir_document_reference_with_none( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service ): """Test process_fhir_document_reference with None input.""" with pytest.raises(DocumentRefException) as excinfo: @@ -723,28 +685,8 @@ def test_process_fhir_document_reference_with_none( assert excinfo.value.error == LambdaError.DocRefNoParse -def test_create_lg_document_reference_without_content_raises_error( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, -): - """Test _create_document_reference method without content attachment raises error.""" - - fhir_doc = mocker.MagicMock(spec=FhirDocumentReference) - fhir_doc.content = None - - with pytest.raises(DocumentRefException) as excinfo: - mock_post_fhir_doc_ref_service.process_fhir_document_reference(fhir_doc) - - assert excinfo.value.status_code == 400 - assert excinfo.value.error == LambdaError.DocRefNoParse - assert excinfo.value.message == "Failed to parse document upload request data" - - def test_s3_file_key_for_lg( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, + mock_fhir_doc_ref_base_service, mock_post_fhir_doc_ref_service, mocker ): """Test _create_document_reference method without custodian information.""" @@ -755,16 +697,15 @@ def test_s3_file_key_for_lg( contentType="application/pdf", title="test-file.pdf", creation="2023-01-01T12:00:00Z", - ), - ), + ) + ) ] fhir_doc.author = [ Reference( identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="B67890", - ), - ), + system="https://fhir.nhs.uk/Id/ods-organization-code", value="B67890" + ) + ) ] fhir_doc.custodian = None @@ -783,47 +724,3 @@ def test_s3_file_key_for_lg( assert "user_upload/9000000009" in result.s3_upload_key assert f"9000000009/{result.id}" in result.s3_file_key assert result.sub_folder == "user_upload" - - -def test_create_lg_document_reference_without_title_raises_error( - mock_fhir_doc_ref_base_service, - mock_post_fhir_doc_ref_service, - mocker, -): - """Test _create_document_reference method without title information raises error.""" - - fhir_doc = mocker.MagicMock(spec=FhirDocumentReference) - fhir_doc.content = [ - DocumentReferenceContent( - attachment=Attachment( - contentType="application/pdf", - creation="2023-01-01T12:00:00Z", - ), - ), - ] - fhir_doc.author = [ - Reference( - identifier=Identifier( - system="https://fhir.nhs.uk/Id/ods-organization-code", - value="B67890", - ), - ), - ] - fhir_doc.custodian = None - - doc_type = SnomedCodes.LLOYD_GEORGE.value - current_gp_ods = "C13579" - - with pytest.raises(DocumentRefException) as excinfo: - mock_post_fhir_doc_ref_service._create_document_reference( - nhs_number="9000000009", - author="B67890", - doc_type=doc_type, - fhir_doc=fhir_doc, - current_gp_ods=current_gp_ods, - raw_fhir_doc=json.dumps({"foo": "bar"}), - ) - - assert excinfo.value.status_code == 400 - assert excinfo.value.error == LambdaError.DocRefNoParse - assert excinfo.value.message == "Failed to parse document upload request data" diff --git a/lambdas/tests/unit/services/test_update_document_reference_service.py b/lambdas/tests/unit/services/test_update_document_reference_service.py index 05eedf133e..1a09166a45 100644 --- a/lambdas/tests/unit/services/test_update_document_reference_service.py +++ b/lambdas/tests/unit/services/test_update_document_reference_service.py @@ -28,15 +28,15 @@ def mock_update_doc_ref_service(mocker): @pytest.fixture -def mock_fhir_doc_ref_base_service(mocker, setup_request_context, set_env): +def mock_fhir_doc_ref_base_service(mocker, setup_request_context): mock_document_service = mocker.patch( - "services.fhir_document_reference_service_base.DocumentService", + "services.fhir_document_reference_service_base.DocumentService" ) mock_s3_service = mocker.patch( - "services.fhir_document_reference_service_base.S3Service", + "services.fhir_document_reference_service_base.S3Service" ) mock_dynamo_service = mocker.patch( - "services.fhir_document_reference_service_base.DynamoDBService", + "services.fhir_document_reference_service_base.DynamoDBService" ) service = FhirDocumentReferenceServiceBase() service.document_service = mock_document_service.return_value @@ -66,11 +66,10 @@ def mock_stop_if_upload_is_in_progress(mock_update_doc_ref_service, mocker): @pytest.fixture() def mock_validate_files_for_access_and_store( - mocker, - mock_getting_patient_info_from_pds, + mocker, mock_getting_patient_info_from_pds ): yield mocker.patch( - "services.update_document_reference_service.validate_files_for_access_and_store", + "services.update_document_reference_service.validate_files_for_access_and_store" ) @@ -93,29 +92,26 @@ def mock_process_fhir_document_reference(mocker): return_value=json.dumps( { "content": [ - {"attachment": {"url": "https://test-bucket.s3.amazonaws.com/"}}, - ], - }, + {"attachment": {"url": "https://test-bucket.s3.amazonaws.com/"}} + ] + } ), ) @pytest.fixture def mock_get_allowed_list_of_ods_codes_for_upload_pilot( - mock_update_doc_ref_service, - mocker, + mock_update_doc_ref_service, mocker ): return mocker.patch.object( - mock_update_doc_ref_service.feature_flag_service, - "get_allowed_list_of_ods_codes_for_upload_pilot", + mock_update_doc_ref_service, "get_allowed_list_of_ods_codes_for_upload_pilot" ) @pytest.fixture def mock_check_if_ods_code_is_in_pilot(mock_update_doc_ref_service, mocker): return mocker.patch.object( - mock_update_doc_ref_service, - "check_if_ods_code_is_in_pilot", + mock_update_doc_ref_service, "check_if_ods_code_is_in_pilot" ) @@ -138,8 +134,8 @@ def mock_fetch_documents_from_table(mocker, mock_update_doc_ref_service): def test_update_document_reference_request_with_lg_list_happy_path( - mock_fhir_doc_ref_base_service, mock_update_doc_ref_service, + mock_fhir_doc_ref_base_service, mock_getting_patient_info_from_pds, mock_stop_if_upload_is_in_progress, mock_get_allowed_list_of_ods_codes_for_upload_pilot, @@ -149,7 +145,7 @@ def test_update_document_reference_request_with_lg_list_happy_path( mock_fetch_documents_from_table, ): mock_get_allowed_list_of_ods_codes_for_upload_pilot.return_value = [ - TEST_CURRENT_GP_ODS, + TEST_CURRENT_GP_ODS ] mock_getting_patient_info_from_pds.return_value = mock_pds_patient mock_fetch_documents_from_table.return_value = create_test_doc_store_refs() @@ -161,9 +157,7 @@ def test_update_document_reference_request_with_lg_list_happy_path( ) url_references = mock_update_doc_ref_service.update_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE, - TEST_UUID, + TEST_NHS_NUMBER, LG_FILE, TEST_UUID ) expected_response = {"uuid1": mock_presigned_url_response} @@ -189,9 +183,7 @@ def test_ods_code_not_in_pilot_raises_exception( with pytest.raises(DocumentRefException) as exc_info: mock_update_doc_ref_service.update_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE, - TEST_UUID, + TEST_NHS_NUMBER, LG_FILE, TEST_UUID ) mock_process_fhir_document_reference.assert_not_called() @@ -217,9 +209,7 @@ def test_nhs_number_not_found_raises_exception( with pytest.raises(DocumentRefException) as exc_info: mock_update_doc_ref_service.update_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE, - TEST_UUID, + TEST_NHS_NUMBER, LG_FILE, TEST_UUID ) exception = exc_info.value @@ -233,28 +223,26 @@ def test_nhs_number_not_found_raises_exception( # covers for number of files expected, non-pdf files, incorrect file name format, duplicate files def test_invalid_files_raises_exception( - mock_fhir_doc_ref_base_service, mock_update_doc_ref_service, mock_validate_files_for_access_and_store, mock_getting_patient_info_from_pds, mock_pds_patient, mock_get_allowed_list_of_ods_codes_for_upload_pilot, + mock_fhir_doc_ref_base_service, mock_process_fhir_document_reference, mock_stop_if_upload_is_in_progress, mock_fetch_documents_from_table, ): mock_getting_patient_info_from_pds.return_value = mock_pds_patient mock_get_allowed_list_of_ods_codes_for_upload_pilot.return_value = [ - TEST_CURRENT_GP_ODS, + TEST_CURRENT_GP_ODS ] mock_validate_files_for_access_and_store.side_effect = LGInvalidFilesException mock_fetch_documents_from_table.return_value = create_test_doc_store_refs() with pytest.raises(DocumentRefException) as exc_info: mock_update_doc_ref_service.update_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE, - TEST_UUID, + TEST_NHS_NUMBER, LG_FILE, TEST_UUID ) exception = exc_info.value @@ -267,35 +255,29 @@ def test_invalid_files_raises_exception( @freeze_time("2023-10-30T10:25:00") def test_upload_already_in_progress_raises_exception( - mock_fhir_doc_ref_base_service, mock_update_doc_ref_service, mock_fetch_document_by_type, mock_get_allowed_list_of_ods_codes_for_upload_pilot, mock_getting_patient_info_from_pds, mock_pds_patient, + mock_fhir_doc_ref_base_service, mock_process_fhir_document_reference, mock_validate_files_for_access_and_store, mock_fetch_documents_from_table, ): mock_getting_patient_info_from_pds.return_value = mock_pds_patient mock_get_allowed_list_of_ods_codes_for_upload_pilot.return_value = [ - TEST_CURRENT_GP_ODS, + TEST_CURRENT_GP_ODS ] mock_fetch_documents_from_table.return_value = create_test_doc_store_refs() two_minutes_ago = 1698661380 # 2023-10-30T10:23:00 mock_records_upload_in_process = create_test_lloyd_george_doc_store_refs( - override={ - "uploaded": False, - "uploading": True, - "last_updated": two_minutes_ago, - }, + override={"uploaded": False, "uploading": True, "last_updated": two_minutes_ago} ) mock_fetch_document_by_type.return_value = mock_records_upload_in_process with pytest.raises(DocumentRefException) as exc_info: mock_update_doc_ref_service.update_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE, - TEST_UUID, + TEST_NHS_NUMBER, LG_FILE, TEST_UUID ) exception = exc_info.value @@ -305,7 +287,6 @@ def test_upload_already_in_progress_raises_exception( def test_fail_early_if_there_is_no_document_reference_to_update( - mock_fhir_doc_ref_base_service, mock_update_doc_ref_service, mock_fetch_documents_from_table, mock_process_fhir_document_reference, @@ -314,9 +295,7 @@ def test_fail_early_if_there_is_no_document_reference_to_update( mock_fetch_documents_from_table.return_value = [] with pytest.raises(DocumentRefException) as exc_info: mock_update_doc_ref_service.update_document_reference_request( - TEST_NHS_NUMBER, - LG_FILE, - TEST_UUID, + TEST_NHS_NUMBER, LG_FILE, TEST_UUID ) exception = exc_info.value From 5687494a7eddc33d30ad9a2f14a3076e4aa92646 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 09:55:15 +0000 Subject: [PATCH 32/43] Revert "Merge remote-tracking branch 'origin/main' into PRMP-939" This reverts commit 7299031d91317bad15238a1b13120090dd7c4d7d, reversing changes made to 6d066e7e9c15de9dd0ecd59b9e1edc7a1cb0d5cf. --- .../ReviewDetailsDocumentSelectStage.test.tsx | 222 ++++++++---------- .../ReviewDetailsDocumentSelectStage.tsx | 10 - .../DocumentSelectStage.test.tsx | 27 --- .../DocumentSelectStage.tsx | 6 - .../pages/adminRoutesPage/AdminRoutesPage.tsx | 5 - app/src/types/generic/routes.ts | 1 - 6 files changed, 99 insertions(+), 172 deletions(-) diff --git a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.test.tsx b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.test.tsx index a66c96d61e..dd5c163e61 100644 --- a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.test.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.test.tsx @@ -1,6 +1,4 @@ -// need to use happy-dom for this test file as jsdom doesn't support DOMMatrix and scrollIntoView -// @vitest-environment happy-dom -import { render, screen, waitFor, fireEvent, RenderResult } from '@testing-library/react'; +import { render, screen, waitFor } from '@testing-library/react'; import { describe, expect, it, vi, beforeEach } from 'vitest'; import userEvent from '@testing-library/user-event'; import ReviewDetailsDocumentSelectStage from './ReviewDetailsDocumentSelectStage'; @@ -12,8 +10,6 @@ import { UploadDocument, } from '../../../../types/pages/UploadDocumentsPage/types'; import { routeChildren } from '../../../../types/generic/routes'; -import { getDocument } from 'pdfjs-dist'; -import { PDF_PARSING_ERROR_TYPE } from '../../../../helpers/utils/fileUploadErrorMessages'; const mockNavigate = vi.fn(); @@ -53,7 +49,7 @@ vi.mock('react-router-dom', () => ({ })); describe('ReviewDetailsDocumentSelectStage', () => { - const testReviewSnomed: DOCUMENT_TYPE = DOCUMENT_TYPE.LLOYD_GEORGE; + const testReviewSnoMed: DOCUMENT_TYPE = DOCUMENT_TYPE.LLOYD_GEORGE; let mockReviewData: ReviewDetails; let mockDocuments: UploadDocument[]; @@ -64,7 +60,7 @@ describe('ReviewDetailsDocumentSelectStage', () => { mockReviewData = new ReviewDetails( 'test-review-id', - testReviewSnomed, + testReviewSnoMed, '2024-01-01T12:00:00Z', 'Test Uploader', '2024-01-01T12:00:00Z', @@ -78,35 +74,39 @@ describe('ReviewDetailsDocumentSelectStage', () => { mockSetDocuments = vi.fn() as SetUploadDocuments; }); - const renderApp = (props?: { - reviewData?: ReviewDetails | null; - documents?: UploadDocument[]; - setDocuments?: SetUploadDocuments; - }): RenderResult => { - const defaultProps = { - reviewData: mockReviewData, - documents: mockDocuments, - setDocuments: mockSetDocuments, - }; - - return render(); - }; - describe('Rendering', () => { it('shows spinner when reviewData is null', () => { - renderApp({ reviewData: null }); + render( + , + ); expect(screen.getByTestId('mock-spinner')).toBeInTheDocument(); }); it('shows spinner when files is null', () => { - renderApp({ reviewData: { ...mockReviewData, files: null } as any }); + render( + , + ); expect(screen.getByTestId('mock-spinner')).toBeInTheDocument(); }); it('shows spinner when documents are not initialised', () => { - renderApp(); + render( + , + ); expect(screen.getByTestId('mock-spinner')).toBeInTheDocument(); }); @@ -120,14 +120,22 @@ describe('ReviewDetailsDocumentSelectStage', () => { file: new File(['test'], 'test.pdf', { type: 'application/pdf' }), state: DOCUMENT_UPLOAD_STATE.SELECTED, progress: 0, - docType: testReviewSnomed, + docType: testReviewSnoMed, attempts: 0, numPages: 1, validated: false, }, ]; - render( + const { rerender } = render( + , + ); + + rerender( { }), state: DOCUMENT_UPLOAD_STATE.SELECTED, progress: 0, - docType: testReviewSnomed, + docType: testReviewSnoMed, attempts: 0, numPages: 1, validated: false, }, ]; - renderApp({ documents: testDocuments }); + const { rerender } = render( + , + ); + + rerender( + , + ); await waitFor(() => { expect(screen.queryByTestId('mock-spinner')).not.toBeInTheDocument(); @@ -178,14 +200,28 @@ describe('ReviewDetailsDocumentSelectStage', () => { file: new File(['test'], 'test.pdf', { type: 'application/pdf' }), state: DOCUMENT_UPLOAD_STATE.SELECTED, progress: 0, - docType: testReviewSnomed, + docType: testReviewSnoMed, attempts: 0, numPages: 1, validated: false, }, ]; - renderApp({ documents: testDocuments }); + const { rerender } = render( + , + ); + + rerender( + , + ); await waitFor(() => { expect(screen.queryByTestId('mock-spinner')).not.toBeInTheDocument(); @@ -207,14 +243,28 @@ describe('ReviewDetailsDocumentSelectStage', () => { file: new File(['test'], 'test.pdf', { type: 'application/pdf' }), state: DOCUMENT_UPLOAD_STATE.SELECTED, progress: 0, - docType: testReviewSnomed, + docType: testReviewSnoMed, attempts: 0, numPages: 1, validated: false, }, ]; - renderApp({ documents: testDocuments }); + const { rerender } = render( + , + ); + + rerender( + , + ); await waitFor(() => { expect(screen.queryByTestId('mock-spinner')).not.toBeInTheDocument(); @@ -237,7 +287,7 @@ describe('ReviewDetailsDocumentSelectStage', () => { const user = userEvent.setup(); const customReviewData = new ReviewDetails( 'custom-id', - testReviewSnomed, + testReviewSnoMed, '2024-01-01T12:00:00Z', 'Test Uploader', '2024-01-01T12:00:00Z', @@ -253,14 +303,28 @@ describe('ReviewDetailsDocumentSelectStage', () => { file: new File(['test'], 'test.pdf', { type: 'application/pdf' }), state: DOCUMENT_UPLOAD_STATE.SELECTED, progress: 0, - docType: testReviewSnomed, + docType: testReviewSnoMed, attempts: 0, numPages: 1, validated: false, }, ]; - renderApp({ reviewData: customReviewData, documents: testDocuments }); + const { rerender } = render( + , + ); + + rerender( + , + ); await waitFor(() => { expect(screen.queryByTestId('mock-spinner')).not.toBeInTheDocument(); @@ -274,92 +338,4 @@ describe('ReviewDetailsDocumentSelectStage', () => { }); }); }); - - describe('Error handling', () => { - const errorCases = [ - ['password protected file', PDF_PARSING_ERROR_TYPE.PASSWORD_MISSING], - ['invalid PDF structure', PDF_PARSING_ERROR_TYPE.INVALID_PDF_STRUCTURE], - ['empty PDF', PDF_PARSING_ERROR_TYPE.EMPTY_PDF], - ]; - - it.each(errorCases)( - 'navigates to admin file errors page when user selects a %s', - async (_description, errorType) => { - const testDocuments: UploadDocument[] = [ - { - id: 'test-id', - file: new File(['test'], 'test.pdf', { type: 'application/pdf' }), - state: DOCUMENT_UPLOAD_STATE.SELECTED, - progress: 0, - docType: testReviewSnomed, - attempts: 0, - numPages: 1, - validated: false, - }, - ]; - - renderApp({ documents: testDocuments }); - - await waitFor(() => { - expect(screen.queryByTestId('mock-spinner')).not.toBeInTheDocument(); - }); - - // Set up mock to throw error AFTER component is ready - vi.mocked(getDocument).mockImplementationOnce(() => { - throw new Error(errorType as string); - }); - - const errorFile = new File(['test'], 'error-file.pdf', { type: 'application/pdf' }); - const dropzone = screen.getByTestId('dropzone'); - fireEvent.drop(dropzone, { - dataTransfer: { files: [errorFile] }, - }); - - await waitFor(() => { - expect(mockNavigate).toHaveBeenCalledWith( - routeChildren.ADMIN_REVIEW_FILE_ERRORS.replaceAll( - ':reviewId', - 'test-review-id.1', - ), - ); - }); - }, - ); - - it('navigates to admin file errors page when user selects a non-PDF file', async () => { - const testDocuments: UploadDocument[] = [ - { - id: 'test-id', - file: new File(['test'], 'test.pdf', { type: 'application/pdf' }), - state: DOCUMENT_UPLOAD_STATE.SELECTED, - progress: 0, - docType: testReviewSnomed, - attempts: 0, - numPages: 1, - validated: false, - }, - ]; - - renderApp({ documents: testDocuments }); - - await waitFor(() => { - expect(screen.queryByTestId('mock-spinner')).not.toBeInTheDocument(); - }); - - const nonPdfFile = new File(['test'], 'nonPdfFile.txt', { type: 'text/plain' }); - const dropzone = screen.getByTestId('dropzone'); - fireEvent.drop(dropzone, { - dataTransfer: { files: [nonPdfFile] }, - }); - - await waitFor(() => { - expect(mockNavigate).toHaveBeenCalledWith( - routeChildren.ADMIN_REVIEW_FILE_ERRORS.replaceAll( - ':reviewId', - 'test-review-id.1', - ), - ); - }); - }); - }); }); diff --git a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx index 3dfa3bd040..045a38e4b9 100644 --- a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx @@ -55,15 +55,6 @@ const ReviewDetailsDocumentSelectStage = ({ ), ); }; - - const onError = (): void => { - navigate( - routeChildren.ADMIN_REVIEW_FILE_ERRORS.replaceAll( - ':reviewId', - `${reviewData?.id}.${reviewData?.version}`, - ), - ); - }; if (!reviewData?.snomedCode) { return ; } @@ -76,7 +67,6 @@ const ReviewDetailsDocumentSelectStage = ({ filesErrorRef={filesErrorRef} documentConfig={getConfigForDocType(reviewData.snomedCode)} onSuccessOverride={onSuccess} - onErrorOverride={onError} backLinkOverride={(): void => { navigate(-1); }} diff --git a/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.test.tsx b/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.test.tsx index 0e261866aa..5b76b16f8d 100644 --- a/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.test.tsx +++ b/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.test.tsx @@ -343,30 +343,6 @@ describe('DocumentSelectStage', () => { ); }); }); - - it('should call onErrorOverride when provided instead of navigating to default error route', async () => { - const mockOnErrorOverride = vi.fn(); - const lgDocumentOne = buildLgFile(1); - - vi.mocked(getDocument).mockImplementationOnce(() => { - throw new Error(PDF_PARSING_ERROR_TYPE.PASSWORD_MISSING); - }); - - renderApp(history, { onErrorOverride: mockOnErrorOverride }); - - const dropzone = screen.getByTestId('dropzone'); - fireEvent.drop(dropzone, { - dataTransfer: { files: [lgDocumentOne] }, - }); - - await waitFor(() => { - expect(mockOnErrorOverride).toHaveBeenCalled(); - }); - - expect(mockedUseNavigate).not.toHaveBeenCalledWith( - routeChildren.DOCUMENT_UPLOAD_FILE_ERRORS, - ); - }); }); describe('Update Journey', () => { @@ -765,7 +741,6 @@ describe('DocumentSelectStage', () => { documentConfig?: DOCUMENT_TYPE_CONFIG; isReview?: boolean; initialDocuments?: Array; - onErrorOverride?: () => void; }; const TestApp = ({ @@ -776,7 +751,6 @@ describe('DocumentSelectStage', () => { documentConfig, isReview, initialDocuments, - onErrorOverride, }: TestAppProps): JSX.Element => { const [documents, setDocuments] = useState>( initialDocuments ?? [], @@ -795,7 +769,6 @@ describe('DocumentSelectStage', () => { showSkiplink={showSkipLink} removeAllFilesLinkOverride={removeAllFilesLinkOverride} isReview={isReview} - onErrorOverride={onErrorOverride} /> ); }; diff --git a/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.tsx b/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.tsx index bca2333505..b79df0c569 100644 --- a/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.tsx +++ b/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.tsx @@ -42,7 +42,6 @@ export type Props = { filesErrorRef: RefObject; documentConfig: DOCUMENT_TYPE_CONFIG; onSuccessOverride?: () => void; - onErrorOverride?: () => void; backLinkOverride?: () => void; removeAllFilesLinkOverride?: string; goToNextDocType?: () => void; @@ -60,7 +59,6 @@ const DocumentSelectStage = ({ filesErrorRef, documentConfig, onSuccessOverride, - onErrorOverride, backLinkOverride, removeAllFilesLinkOverride, goToNextDocType, @@ -199,10 +197,6 @@ const DocumentSelectStage = ({ if (failedDocs.length > 0) { filesErrorRef.current = true; setDocuments(failedDocs); - if (onErrorOverride) { - onErrorOverride(); - return; - } navigate(routeChildren.DOCUMENT_UPLOAD_FILE_ERRORS); return; } diff --git a/app/src/pages/adminRoutesPage/AdminRoutesPage.tsx b/app/src/pages/adminRoutesPage/AdminRoutesPage.tsx index 69daec7c7d..303cec71be 100644 --- a/app/src/pages/adminRoutesPage/AdminRoutesPage.tsx +++ b/app/src/pages/adminRoutesPage/AdminRoutesPage.tsx @@ -15,7 +15,6 @@ import ReviewsDetailsStage from '../../components/blocks/_admin/reviewsDetailsSt import ReviewDetailsPatientSearchStage from '../../components/blocks/_admin/reviewDetailsPatientSearchStage/ReviewDetailsPatientSearchStage'; import { ReviewsPage } from '../../components/blocks/_admin/reviewsPage/ReviewsPage'; import PatientVerifyPage from '../../components/blocks/generic/patientVerifyPage/PatientVerifyPage'; -import DocumentSelectFileErrorsPage from '../../components/blocks/_documentUpload/documentSelectFileErrorsPage/DocumentSelectFileErrorsPage'; import useConfig from '../../helpers/hooks/useConfig'; import { getLastURLPath } from '../../helpers/utils/urlManipulations'; import { routeChildren, routes } from '../../types/generic/routes'; @@ -178,10 +177,6 @@ const AdminRoutesPage = (): JSX.Element => { /> } /> - } - /> } diff --git a/app/src/types/generic/routes.ts b/app/src/types/generic/routes.ts index cc118920d7..aed587d44b 100644 --- a/app/src/types/generic/routes.ts +++ b/app/src/types/generic/routes.ts @@ -83,7 +83,6 @@ export enum routeChildren { ADMIN_REVIEW_REMOVE_ALL = '/admin/reviews/:reviewId/remove-all', ADMIN_REVIEW_UPLOAD_FILE_ORDER = '/admin/reviews/:reviewId/upload-file-order', ADMIN_REVIEW_UPLOAD = '/admin/reviews/:reviewId/upload', - ADMIN_REVIEW_FILE_ERRORS = '/admin/reviews/:reviewId/file-errors', REVIEWS = 'reviews/*', COOKIES_POLICY_UPDATED = '/cookies-policy/confirmation', From a32dd3a26b984e8a3a3e78d79914f76116e34cf0 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 09:55:26 +0000 Subject: [PATCH 33/43] Revert "Merge remote-tracking branch 'origin/main' into PRMP-939" This reverts commit dcfb4d72990b7abd1cad9fe25bfb8c3525839294, reversing changes made to 6b5098a7122aabe4002dba8a1ac69f3d88b14d7e. --- .github/workflows/automated-pr-validator.yml | 98 ------ .github/workflows/base-deploy-ui.yml | 7 + ...base-lambda-layer-reusable-publish-all.yml | 12 - .../base-lambdas-reusable-deploy-all.yml | 2 +- .../workflows/base-lambdas-reusable-test.yml | 4 + .lintstagedrc | 4 +- Makefile | 26 +- app/Dockerfile | 3 +- .../download_lloyd_george_workflow.cy.js | 15 +- .../download_patient_files_workflow.cy.js | 5 +- app/docker/nginx.conf | 2 +- .../ReviewDetailsCompleteStage.test.tsx | 8 +- .../ReviewDetailsCompleteStage.tsx | 27 +- .../ReviewDetailsDocumentSelectStage.test.tsx | 13 +- .../ReviewDetailsDocumentSelectStage.tsx | 7 +- ...viewDetailsDontKnowNHSNumberStage.test.tsx | 10 - .../ReviewDetailsDontKnowNHSNumberStage.tsx | 2 - .../ReviewsDetailsStage.test.tsx | 4 +- .../ReviewsDetailsStage.tsx | 4 +- .../DeleteSubmitStage.test.tsx | 13 - .../deleteSubmitStage/DeleteSubmitStage.tsx | 9 +- .../RemoveRecordStage.test.tsx | 14 +- .../DocumentSelectStage.test.tsx | 16 + .../DocumentSelectStage.tsx | 4 +- .../DocumentUploadCompleteStage.tsx | 4 +- .../DocumentUploadIndex.tsx | 16 +- .../DocumentUploadLloydGeorgePreview.tsx | 4 +- .../DocumentUploadingStage.tsx | 2 +- .../PatientVerifyPage.test.tsx | 17 +- .../patientVerifyPage/PatientVerifyPage.tsx | 5 +- app/src/config/documentTypesConfig.json | 32 +- ...ectronicHealthRecordAttachmentsConfig.json | 5 +- .../config/electronicHealthRecordConfig.json | 3 +- app/src/config/lettersAndDocumentsConfig.json | 1 - app/src/config/lloydGeorgeConfig.json | 4 +- .../requests/getDocumentSearchResults.test.ts | 2 +- .../requests/getDocumentSearchResults.ts | 7 +- app/src/helpers/test/testBuilders.ts | 4 +- app/src/helpers/utils/documentType.ts | 6 +- .../pages/adminRoutesPage/AdminRoutesPage.tsx | 4 + app/src/pages/mockLoginPage/MockLoginPage.tsx | 2 +- app/src/pages/startPage/StartPage.test.tsx | 24 +- app/src/pages/startPage/StartPage.tsx | 27 +- lambdas/enums/document_status.py | 1 - lambdas/enums/dynamo_filter.py | 2 - lambdas/enums/lambda_error.py | 12 +- lambdas/enums/virus_scan_result.py | 1 - .../bulk_upload_metadata_processor_handler.py | 13 +- .../document_reference_search_handler.py | 54 ++-- .../fhir_document_reference_search_handler.py | 21 +- .../bulk_upload/bulk_upload_sqs_repository.py | 8 +- .../requirements_files_lambda_layer.txt | 1 - lambdas/ruff.toml | 3 +- lambdas/services/base/s3_service.py | 57 ++-- lambdas/services/bulk_upload_service.py | 114 +++---- .../document_reference_search_service.py | 231 ++++---------- .../document_review_processor_service.py | 24 +- .../document_upload_review_service.py | 79 ++--- .../services/get_document_upload_status.py | 9 +- lambdas/services/pdf_stitch_service.py | 34 ++ .../upload_document_reference_service.py | 125 +++----- ...test_retrieve_document_fhir_api_failure.py | 26 +- .../api/fhir/test_search_patient_fhir_api.py | 58 +--- .../tests/e2e/api/test_search_patient_api.py | 83 +---- lambdas/tests/unit/conftest.py | 41 +-- .../test_document_reference_search_handler.py | 298 ++++++------------ .../helpers/data/dynamo/dynamo_responses.py | 11 +- .../tests/unit/helpers/data/test_documents.py | 30 +- .../test_bulk_upload_sqs_repository.py | 12 +- .../test_document_reference_search_service.py | 276 +++++----------- .../test_document_review_processor_service.py | 125 +++----- .../test_get_document_upload_status.py | 82 ++--- ...est_get_fhir_document_reference_service.py | 28 +- .../unit/services/test_pdf_stitch_service.py | 68 ++++ .../services/test_pdf_stitching_service.py | 171 ++-------- ..._fhir_document_reference_search_service.py | 55 ++-- .../test_upload_document_reference_service.py | 159 +++------- lambdas/tests/unit/utils/test_file_utils.py | 145 +-------- lambdas/utils/constants/file_extensions.py | 3 - lambdas/utils/file_utils.py | 52 +-- poetry.lock | 135 +++----- pyproject.toml | 3 - 82 files changed, 984 insertions(+), 2144 deletions(-) delete mode 100644 lambdas/requirements/layers/requirements_files_lambda_layer.txt create mode 100755 lambdas/services/pdf_stitch_service.py create mode 100644 lambdas/tests/unit/services/test_pdf_stitch_service.py delete mode 100644 lambdas/utils/constants/file_extensions.py diff --git a/.github/workflows/automated-pr-validator.yml b/.github/workflows/automated-pr-validator.yml index ba656d5869..a26b69bcb0 100644 --- a/.github/workflows/automated-pr-validator.yml +++ b/.github/workflows/automated-pr-validator.yml @@ -7,25 +7,6 @@ on: types: [opened, edited, synchronize] jobs: - changes: - runs-on: ubuntu-latest - permissions: - pull-requests: read - outputs: - frontend: ${{ steps.filter.outputs.frontend }} - backend: ${{ steps.filter.outputs.backend }} - steps: - - uses: dorny/paths-filter@v3 - id: filter - with: - filters: | - frontend: - - 'app/src/**' - backend: - - '*.py' - - 'lambdas/*.py' - - 'lambdas/**/*.py' - checklist_validator: runs-on: ubuntu-latest permissions: @@ -160,82 +141,3 @@ jobs: BRANCH_NAME=${{ github.event.repository.default_branch }} chmod +x scripts/markdown-validator.sh scripts/markdown-validator.sh - - react_lint_and_build: - name: React Lint and Build - runs-on: ubuntu-latest - permissions: - contents: read - needs: changes - if: needs.changes.outputs.frontend == 'true' - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - - name: Install packages - id: install - run: | - make install - - - name: Run Lint - id: lint - working-directory: app - run: | - npm run lint - - - name: Run Build - id: build - working-directory: app - if: always() - run: | - npm run build - - python_lint: - name: Python Lint - runs-on: ubuntu-latest - permissions: - contents: read - needs: changes - if: needs.changes.outputs.backend == 'true' - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - - name: Set up Python 3.11 - uses: actions/setup-python@v6 - with: - python-version: 3.11 - - - name: Setup env - run: | - make env - - - name: Get changed files - id: changed-files - run: | - git remote set-branches origin main && git fetch --depth 1 origin main && git branch main origin/main - echo "CHANGED_FILES=$(git diff main --name-status | grep -E '^[^D].*\.py$' | cut -f2 | tr '\n' ' ')" >> $GITHUB_OUTPUT - - - name: Run black - id: black - run: | - if [ -z "${{ steps.changed-files.outputs.CHANGED_FILES }}" ]; then echo "No changed Python files to format"; exit 0; fi; \ - ./lambdas/venv/bin/python3 -m black --check --diff --color ${{ steps.changed-files.outputs.CHANGED_FILES }} - - - name: Run ruff - id: ruff - if: always() - run: | - if [ -z "${{ steps.changed-files.outputs.CHANGED_FILES }}" ]; then echo "No changed Python files to lint"; exit 0; fi; \ - ./lambdas/venv/bin/ruff check ${{ steps.changed-files.outputs.CHANGED_FILES }} - - - name: Run isort with black - id: isort - if: always() - run: | - if [ -z "${{ steps.changed-files.outputs.CHANGED_FILES }}" ]; then echo "No changed Python files to sort imports"; exit 0; fi; \ - ./lambdas/venv/bin/python3 -m isort --profile black --check-only ${{ steps.changed-files.outputs.CHANGED_FILES }} \ No newline at end of file diff --git a/.github/workflows/base-deploy-ui.yml b/.github/workflows/base-deploy-ui.yml index 6cd85e3864..fecd8dc01f 100644 --- a/.github/workflows/base-deploy-ui.yml +++ b/.github/workflows/base-deploy-ui.yml @@ -60,6 +60,12 @@ jobs: echo "::add-mask::$container_port" echo "CONTAINER_PORT=$container_port" >> $GITHUB_ENV + - name: Get CloudFront domain name + id: cloudfront-domain-name + run: | + cloudfront_domain_name=$(aws cloudfront list-distributions --query "DistributionList.Items[?starts_with(Origins.Items[0].DomainName, '${{ inputs.sandbox }}')].DomainName" --output text) + echo "Cloudfront domain name found for environment: $cloudfront_domain_name" + echo "CLOUDFRONT_DOMAIN_NAME=$cloudfront_domain_name" >> $GITHUB_ENV - name: Login to Amazon ECR id: login-ecr @@ -106,6 +112,7 @@ jobs: run: | docker build \ --build-arg="CONTAINER_PORT=$CONTAINER_PORT" \ + --build-arg="CLOUDFRONT_DOMAIN_NAME=$CLOUDFRONT_DOMAIN_NAME" \ --build-arg="BUILD_ENV=$BUILD_ENV" \ -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG \ -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA . diff --git a/.github/workflows/base-lambda-layer-reusable-publish-all.yml b/.github/workflows/base-lambda-layer-reusable-publish-all.yml index a7e49b91b9..be97edb37f 100644 --- a/.github/workflows/base-lambda-layer-reusable-publish-all.yml +++ b/.github/workflows/base-lambda-layer-reusable-publish-all.yml @@ -87,15 +87,3 @@ jobs: lambda_layer_name: alerting_lambda_layer secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - - deploy_files_lambda_layer: - name: Deploy files_lambda_layer - uses: ./.github/workflows/base-lambda-layer-reusable-publish.yml - with: - environment: ${{ inputs.environment}} - python_version: ${{ inputs.python_version }} - build_branch: ${{ inputs.build_branch }} - sandbox: ${{ inputs.sandbox }} - lambda_layer_name: files_lambda_layer - secrets: - AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} \ No newline at end of file diff --git a/.github/workflows/base-lambdas-reusable-deploy-all.yml b/.github/workflows/base-lambdas-reusable-deploy-all.yml index 32d347ae45..495c36fb46 100644 --- a/.github/workflows/base-lambdas-reusable-deploy-all.yml +++ b/.github/workflows/base-lambdas-reusable-deploy-all.yml @@ -695,7 +695,7 @@ jobs: sandbox: ${{ inputs.sandbox }} lambda_handler_name: document_reference_virus_scan_handler lambda_aws_name: DocumentReferenceVirusScanCheck - lambda_layer_names: "core_lambda_layer,files_lambda_layer" + lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} diff --git a/.github/workflows/base-lambdas-reusable-test.yml b/.github/workflows/base-lambdas-reusable-test.yml index abe270808d..ca5f980f64 100644 --- a/.github/workflows/base-lambdas-reusable-test.yml +++ b/.github/workflows/base-lambdas-reusable-test.yml @@ -53,6 +53,10 @@ jobs: source ./lambdas/venv/bin/activate echo PATH=$PATH >> $GITHUB_ENV + - name: Format Code and ruff check + run: | + make format + - name: Test with pytest run: | make test-unit diff --git a/.lintstagedrc b/.lintstagedrc index 0cfe966e6a..9567680eb1 100644 --- a/.lintstagedrc +++ b/.lintstagedrc @@ -7,8 +7,8 @@ "./app/node_modules/prettier/bin/prettier.cjs --write" ], "*.py": [ - "./lambdas/venv/bin/ruff check --fix", - "./lambdas/venv/bin/python3 -m black", "./lambdas/venv/bin/python3 -m isort --profile black", + "./lambdas/venv/bin/python3 -m black", + "./lambdas/venv/bin/ruff check ./lambdas" ] } \ No newline at end of file diff --git a/Makefile b/Makefile index 7dd4df5c7c..25017ef8d4 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,6 @@ GITHUB_REQUIREMENTS=$(REQUIREMENTS_PATH)/requirements_github_runner.txt TEST_REQUIREMENTS=$(REQUIREMENTS_PATH)/requirements_test.txt CORE_REQUIREMENTS=$(LAMBDA_LAYER_REQUIREMENTS_PATH)/requirements_core_lambda_layer.txt DATA_REQUIREMENTS=$(LAMBDA_LAYER_REQUIREMENTS_PATH)/requirements_data_lambda_layer.txt -FILES_REQUIREMENTS=$(LAMBDA_LAYER_REQUIREMENTS_PATH)/requirements_files_lambda_layer.txt REPORTS_REQUIREMENTS=$(LAMBDA_LAYER_REQUIREMENTS_PATH)/requirements_reports_lambda_layer.txt ALERTING_REQUIREMENTS=$(LAMBDA_LAYER_REQUIREMENTS_PATH)/requirements_alerting_lambda_layer.txt EDGE_REQUIREMENTS=$(REQUIREMENTS_PATH)/requirements_edge_lambda.txt @@ -18,8 +17,6 @@ LAMBDA_LAYER_PYTHON_PATH=python/lib/python$(PYTHON_VERSION)/site-packages ZIP_BASE_PATH = ./$(LAMBDAS_BUILD_PATH)/$(lambda_name)/tmp ZIP_COMMON_FILES = lambdas/utils lambdas/models lambdas/services lambdas/repositories lambdas/enums lambdas/scripts CONTAINER ?= false -VENV_PATH_PREFIX := $(if $(filter true,$(CONTAINER)),./.venv,./lambdas/venv) -FORMAT_ALL ?= false .PHONY: \ install clean help format list requirements ruff build-and-deploy-sandbox \ @@ -84,22 +81,21 @@ clean-test: find . -name '.cache' -exec rm -fr {} + format: - @if [ $(FORMAT_ALL) = true ]; then \ - CHANGED_FILES=''; \ - else \ - CHANGED_FILES=$$(git diff main --name-status | grep -E '^[^D].*\.py$$' | cut -f2 | xargs); \ - echo $$CHANGED_FILES; \ - if [ -z "$$CHANGED_FILES" ]; then echo "No changed files to format"; exit 0; fi; \ - fi; \ - $(VENV_PATH_PREFIX)/bin/ruff check $$CHANGED_FILES --fix; \ - $(VENV_PATH_PREFIX)/bin/python3 -m black $$CHANGED_FILES; \ - $(VENV_PATH_PREFIX)/bin/python3 -m isort --profile black $$CHANGED_FILES +ifeq ($(CONTAINER), true) + ./.venv/bin/python3 -m isort --profile black lambdas/ + ./.venv/bin/python3 -m black lambdas/ + ./.venv/bin/ruff check lambdas/ --fix +else + ./lambdas/venv/bin/python3 -m isort --profile black lambdas/ + ./lambdas/venv/bin/python3 -m black lambdas/ + ./lambdas/venv/bin/ruff check lambdas/ --fix +endif + sort-requirements: sort -o $(TEST_REQUIREMENTS) $(TEST_REQUIREMENTS) sort -o $(CORE_REQUIREMENTS) $(CORE_REQUIREMENTS) sort -o $(DATA_REQUIREMENTS) $(DATA_REQUIREMENTS) - sort -o $(FILES_REQUIREMENTS) $(FILES_REQUIREMENTS) sort -o $(REPORTS_REQUIREMENTS) $(REPORTS_REQUIREMENTS) sort -o $(ALERTING_REQUIREMENTS) $(ALERTING_REQUIREMENTS) @@ -108,7 +104,6 @@ check-packages: ./lambdas/venv/bin/pip-audit -r $(TEST_REQUIREMENTS) ./lambdas/venv/bin/pip-audit -r $(CORE_REQUIREMENTS) ./lambdas/venv/bin/pip-audit -r $(DATA_REQUIREMENTS) - ./lambdas/venv/bin/pip-audit -r $(FILES_REQUIREMENTS) ./lambdas/venv/bin/pip-audit -r $(REPORTS_REQUIREMENTS) ./lambdas/venv/bin/pip-audit -r $(ALERTING_REQUIREMENTS) @@ -209,7 +204,6 @@ env: @./lambdas/venv/bin/pip3 install -r $(TEST_REQUIREMENTS) --no-cache-dir @./lambdas/venv/bin/pip3 install -r $(CORE_REQUIREMENTS) --no-cache-dir @./lambdas/venv/bin/pip3 install -r $(DATA_REQUIREMENTS) --no-cache-dir - @./lambdas/venv/bin/pip3 install -r $(FILES_REQUIREMENTS) --no-cache-dir @./lambdas/venv/bin/pip3 install -r $(REPORTS_REQUIREMENTS) --no-cache-dir @./lambdas/venv/bin/pip3 install -r $(ALERTING_REQUIREMENTS) --no-cache-dir @echo " " diff --git a/app/Dockerfile b/app/Dockerfile index 95e520af65..444eafe554 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -22,6 +22,7 @@ RUN npm run build -- --mode $BUILD_ENV FROM nginx:latest RUN apt update && apt list --upgradable && apt upgrade -y && rm -rf /var/lib/apt/lists/* ARG CONTAINER_PORT +ARG CLOUDFRONT_DOMAIN_NAME WORKDIR /usr/share/nginx/html RUN rm -rf ./* COPY --from=builder /app/dist . @@ -30,7 +31,7 @@ WORKDIR /etc/nginx COPY --from=builder ./app/docker/nginx.conf ./nginx.conf.template RUN sed -i "s/\$CONTAINER_PORT/${CONTAINER_PORT}/g" ./nginx.conf.template -RUN cp ./nginx.conf.template ./nginx.conf +RUN sed "s/\$CLOUDFRONT_DOMAIN_NAME/${CLOUDFRONT_DOMAIN_NAME}/g" ./nginx.conf.template > ./nginx.conf EXPOSE ${CONTAINER_PORT} ENTRYPOINT ["nginx", "-g", "daemon off;"] diff --git a/app/cypress/e2e/0-ndr-core-tests/gp_user_workflows/download_lloyd_george_workflow.cy.js b/app/cypress/e2e/0-ndr-core-tests/gp_user_workflows/download_lloyd_george_workflow.cy.js index f36f814113..11e4411005 100644 --- a/app/cypress/e2e/0-ndr-core-tests/gp_user_workflows/download_lloyd_george_workflow.cy.js +++ b/app/cypress/e2e/0-ndr-core-tests/gp_user_workflows/download_lloyd_george_workflow.cy.js @@ -122,10 +122,7 @@ describe('GP Workflow: View Lloyd George record', () => { cy.intercept('GET', '/SearchDocumentReferences*', { statusCode: 200, - body: { - references: testFiles, - nextPageToken: 'abc', - }, + body: testFiles, }).as('searchDocumentReferences'); cy.get('#verify-submit').click(); @@ -145,10 +142,7 @@ describe('GP Workflow: View Lloyd George record', () => { cy.intercept('GET', '/SearchDocumentReferences*', { statusCode: 200, - body: { - references: testFiles, - nextPageToken: 'abc', - }, + body: testFiles, }).as('searchDocumentReferences'); setUpDownloadManifestIntercepts(); @@ -265,10 +259,7 @@ describe('GP Workflow: View Lloyd George record', () => { cy.intercept('GET', '/SearchDocumentReferences*', { statusCode: 200, - body: { - references: singleTestFile, - nextPageToken: 'abc' - }, + body: singleTestFile, }).as('searchDocumentReferences'); setUpDownloadManifestIntercepts(); diff --git a/app/cypress/e2e/0-ndr-core-tests/pcse_user_workflows/download_patient_files_workflow.cy.js b/app/cypress/e2e/0-ndr-core-tests/pcse_user_workflows/download_patient_files_workflow.cy.js index eeca32ea22..bc7337aa09 100644 --- a/app/cypress/e2e/0-ndr-core-tests/pcse_user_workflows/download_patient_files_workflow.cy.js +++ b/app/cypress/e2e/0-ndr-core-tests/pcse_user_workflows/download_patient_files_workflow.cy.js @@ -40,10 +40,7 @@ describe('PCSE Workflow: Access and download found files', () => { cy.intercept('GET', '/SearchDocumentReferences*', { statusCode: 200, - body: { - references: searchDocumentReferencesResponse, - nextPageToken: 'abc', - }, + body: searchDocumentReferencesResponse, }).as('documentSearch'); cy.get('#verify-submit').click(); diff --git a/app/docker/nginx.conf b/app/docker/nginx.conf index afc01494a6..84f2aef3a9 100644 --- a/app/docker/nginx.conf +++ b/app/docker/nginx.conf @@ -18,7 +18,7 @@ http { add_header Cache-Control "no-store, no-cache, must-revalidate" always; add_header Pragma "no-cache" always; add_header Strict-Transport-Security "max-age=63072000" always; - add_header Content-Security-Policy "frame-ancestors 'self'; img-src 'self' blob:; script-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'self' blob:;" always; + add_header Content-Security-Policy "frame-ancestors 'self'; img-src 'self' blob:; script-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'self' blob: https://$CLOUDFRONT_DOMAIN_NAME;" always; add_header Referrer-Policy "no-referrer" always; add_header Permissions-Policy "accelerometer=(self), autoplay=(self), camera=(self), cross-origin-isolated=(self), display-capture=(self), encrypted-media=(self), fullscreen=(self), geolocation=(self), gyroscope=(self), keyboard-map=(self), magnetometer=(self), microphone=(self), midi=(self), payment=(self), picture-in-picture=(self), publickey-credentials-get=(self), screen-wake-lock=(self), sync-xhr=(self), usb=(self), xr-spatial-tracking=(self), clipboard-read=(self), clipboard-write=(self), gamepad=(self), hid=(self), idle-detection=(self), interest-cohort=(self), serial=(self), unload=(self) " always; add_header X-Content-Type-Options "nosniff" always; diff --git a/app/src/components/blocks/_admin/reviewDetailsCompleteStage/ReviewDetailsCompleteStage.test.tsx b/app/src/components/blocks/_admin/reviewDetailsCompleteStage/ReviewDetailsCompleteStage.test.tsx index 7821587ee8..414e649b2a 100644 --- a/app/src/components/blocks/_admin/reviewDetailsCompleteStage/ReviewDetailsCompleteStage.test.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsCompleteStage/ReviewDetailsCompleteStage.test.tsx @@ -105,7 +105,7 @@ describe('ReviewDetailsCompletePage', () => { ); expect( - screen.getByRole('button', { name: 'Go to documents to review' }), + screen.getByRole('button', { name: 'Go to Documents to Review' }), ).toBeInTheDocument(); }); }); @@ -579,7 +579,7 @@ describe('ReviewDetailsCompletePage', () => { />, ); - const button = screen.getByRole('button', { name: 'Go to documents to review' }); + const button = screen.getByRole('button', { name: 'Go to Documents to Review' }); await user.click(button); expect(mockSetPatientDetails).toHaveBeenCalledWith(null); @@ -596,7 +596,7 @@ describe('ReviewDetailsCompletePage', () => { />, ); - const button = screen.getByRole('button', { name: 'Go to documents to review' }); + const button = screen.getByRole('button', { name: 'Go to Documents to Review' }); await user.click(button); expect(mockNavigate).toHaveBeenCalledWith(routeChildren.ADMIN_REVIEW, { @@ -615,7 +615,7 @@ describe('ReviewDetailsCompletePage', () => { />, ); - const button = screen.getByRole('button', { name: 'Go to documents to review' }); + const button = screen.getByRole('button', { name: 'Go to Documents to Review' }); await user.click(button); expect(mockSetPatientDetails).toHaveBeenCalledBefore(mockNavigate as Mock); diff --git a/app/src/components/blocks/_admin/reviewDetailsCompleteStage/ReviewDetailsCompleteStage.tsx b/app/src/components/blocks/_admin/reviewDetailsCompleteStage/ReviewDetailsCompleteStage.tsx index e48e7c1f29..88b5f24d95 100644 --- a/app/src/components/blocks/_admin/reviewDetailsCompleteStage/ReviewDetailsCompleteStage.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsCompleteStage/ReviewDetailsCompleteStage.tsx @@ -109,17 +109,10 @@ const ReviewDetailsCompleteStage = ({ const getDefaultPrmEmailSupportMessage = (): JSX.Element => { return ( - <> -

- This document has been matched to the patient whose NHS number you entered. If - this patient is registered at your practice, you will see this document on the - list of documents to review again. -

-

- If you think you've made a mistake, contact the Patient Record Management team - at england.prmteam@nhs.net. -

- +

+ If you think you've made a mistake, contact the Patient Record Management team at{' '} + england.prmteam@nhs.net. +

); }; @@ -140,6 +133,16 @@ const ReviewDetailsCompleteStage = ({ }; const getPanelBody = (): JSX.Element => { + if (completeState === CompleteState.PATIENT_MATCHED) { + return ( +

+ This document has been matched to the patient whose NHS number you entered. If + this patient is registered at your practice, you will see this document on the + list of documents to review again. +

+ ); + } + if (completeState === CompleteState.PATIENT_UNKNOWN) { return (

@@ -269,7 +272,7 @@ const ReviewDetailsCompleteStage = ({ {getBody()}

); diff --git a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.test.tsx b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.test.tsx index dd5c163e61..b585a35326 100644 --- a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.test.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.test.tsx @@ -149,7 +149,9 @@ describe('ReviewDetailsDocumentSelectStage', () => { // Check that the actual DocumentSelectStage component is rendered // by looking for the page title - expect(screen.getByText('Choose scanned paper notes to upload')).toBeInTheDocument(); + expect( + screen.getByText('Choose scanned paper notes files to upload'), + ).toBeInTheDocument(); }); it('displays document information correctly', async () => { @@ -192,7 +194,7 @@ describe('ReviewDetailsDocumentSelectStage', () => { expect(screen.getByText('test-document.pdf')).toBeInTheDocument(); }); - it('navigates to previous page on back clicked', async () => { + it('provides correct back link based on review ID', async () => { const user = userEvent.setup(); const testDocuments: UploadDocument[] = [ { @@ -227,10 +229,15 @@ describe('ReviewDetailsDocumentSelectStage', () => { expect(screen.queryByTestId('mock-spinner')).not.toBeInTheDocument(); }); + const expectedBackLink = routeChildren.ADMIN_REVIEW_ADD_MORE_CHOICE.replaceAll( + ':reviewId', + 'test-review-id.1', + ); + const backButton = screen.getByTestId('back-button'); await user.click(backButton); - expect(mockNavigate).toHaveBeenCalledWith(-1); + expect(mockNavigate).toHaveBeenCalledWith(expectedBackLink); }); }); diff --git a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx index 045a38e4b9..df5845b547 100644 --- a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx @@ -67,9 +67,10 @@ const ReviewDetailsDocumentSelectStage = ({ filesErrorRef={filesErrorRef} documentConfig={getConfigForDocType(reviewData.snomedCode)} onSuccessOverride={onSuccess} - backLinkOverride={(): void => { - navigate(-1); - }} + backLinkOverride={routeChildren.ADMIN_REVIEW_ADD_MORE_CHOICE.replaceAll( + ':reviewId', + `${reviewData?.id}.${reviewData?.version}`, + )} removeAllFilesLinkOverride={routeChildren.ADMIN_REVIEW_REMOVE_ALL.replaceAll( ':reviewId', `${reviewData?.id}.${reviewData?.version}`, diff --git a/app/src/components/blocks/_admin/reviewDetailsDontKnowNHSNumberStage/ReviewDetailsDontKnowNHSNumberStage.test.tsx b/app/src/components/blocks/_admin/reviewDetailsDontKnowNHSNumberStage/ReviewDetailsDontKnowNHSNumberStage.test.tsx index e836fd4d4b..933dddbab5 100644 --- a/app/src/components/blocks/_admin/reviewDetailsDontKnowNHSNumberStage/ReviewDetailsDontKnowNHSNumberStage.test.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsDontKnowNHSNumberStage/ReviewDetailsDontKnowNHSNumberStage.test.tsx @@ -90,16 +90,6 @@ describe('ReviewDetailsDontKnowNHSNumberPage', () => { screen.getByText(/following their process for record transfers/i), ).toBeInTheDocument(); }); - - it('renders the go back button with correct text and data-testid', () => { - render( - , - ); - - const backButton = screen.getByTestId('back-button'); - expect(backButton).toBeInTheDocument(); - expect(backButton).toHaveTextContent('Go back'); - }); }); describe('User Interactions', () => { diff --git a/app/src/components/blocks/_admin/reviewDetailsDontKnowNHSNumberStage/ReviewDetailsDontKnowNHSNumberStage.tsx b/app/src/components/blocks/_admin/reviewDetailsDontKnowNHSNumberStage/ReviewDetailsDontKnowNHSNumberStage.tsx index f4fde1a499..1427a071f8 100644 --- a/app/src/components/blocks/_admin/reviewDetailsDontKnowNHSNumberStage/ReviewDetailsDontKnowNHSNumberStage.tsx +++ b/app/src/components/blocks/_admin/reviewDetailsDontKnowNHSNumberStage/ReviewDetailsDontKnowNHSNumberStage.tsx @@ -5,7 +5,6 @@ import { ReviewDetails } from '../../../../types/generic/reviews'; import { navigateUrlParam, routeChildren } from '../../../../types/generic/routes'; import { ReviewUploadDocument } from '../../../../types/pages/UploadDocumentsPage/types'; import Spinner from '../../../generic/spinner/Spinner'; -import BackButton from '../../../generic/backButton/BackButton'; type ReviewDetailsDontKnowNHSNumberStageProps = { reviewData: ReviewDetails | null; @@ -39,7 +38,6 @@ const ReviewDetailsDontKnowNHSNumberStage = ({
-

Download this document

diff --git a/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.test.tsx b/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.test.tsx index dbfe647f16..8b6eede4e6 100644 --- a/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.test.tsx +++ b/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.test.tsx @@ -1,6 +1,6 @@ import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi, Mock } from 'vitest'; import ReviewsDetailsPageComponent from './ReviewsDetailsStage'; import { runAxeTest } from '../../../../helpers/test/axeTestHelper'; import { buildPatientDetails } from '../../../../helpers/test/testBuilders'; @@ -214,7 +214,7 @@ describe('ReviewDetailsStage', () => { await waitFor(() => { expect( screen.getByText( - 'Check the patient details in the document shown matches these patient demographics:', + 'Check the patient details in this document match these patient demographics:', ), ).toBeInTheDocument(); }); diff --git a/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.tsx b/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.tsx index 6dbd256d43..61c232acc1 100644 --- a/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.tsx +++ b/app/src/components/blocks/_admin/reviewsDetailsStage/ReviewsDetailsStage.tsx @@ -295,9 +295,7 @@ const ReviewsDetailsStage = ({

Check this document is for the correct patient

-

- Check the patient details in the document shown matches these patient demographics: -

+

Check the patient details in this document match these patient demographics:

diff --git a/app/src/components/blocks/_delete/deleteSubmitStage/DeleteSubmitStage.test.tsx b/app/src/components/blocks/_delete/deleteSubmitStage/DeleteSubmitStage.test.tsx index fee2c1102b..3a3dad3d35 100644 --- a/app/src/components/blocks/_delete/deleteSubmitStage/DeleteSubmitStage.test.tsx +++ b/app/src/components/blocks/_delete/deleteSubmitStage/DeleteSubmitStage.test.tsx @@ -388,19 +388,6 @@ describe('DeleteSubmitStage', () => { expect(mockedUseNavigate).toHaveBeenCalledWith(routes.SESSION_EXPIRED); }); }); - - it('navigates to previous route when back link is clicked', async () => { - renderComponent(DOCUMENT_TYPE.LLOYD_GEORGE, history); - - const backLink = screen.getByRole('link', { name: 'Go back' }); - expect(backLink).toBeInTheDocument(); - - userEvent.click(backLink); - - await waitFor(() => { - expect(mockedUseNavigate).toHaveBeenCalledWith(-1); - }); - }); }); }); diff --git a/app/src/components/blocks/_delete/deleteSubmitStage/DeleteSubmitStage.tsx b/app/src/components/blocks/_delete/deleteSubmitStage/DeleteSubmitStage.tsx index 8f852865ec..35d690946a 100644 --- a/app/src/components/blocks/_delete/deleteSubmitStage/DeleteSubmitStage.tsx +++ b/app/src/components/blocks/_delete/deleteSubmitStage/DeleteSubmitStage.tsx @@ -151,7 +151,14 @@ export const DeleteSubmitStageIndexView = ({ return ( <> - + {deletionStage === SUBMISSION_STATE.FAILED && } {showNoOptionSelectedMessage && ( { ).toBeInTheDocument(); }); - expect(screen.getByText(searchResults.references[0].fileName)).toBeInTheDocument(); - expect(screen.getByText(searchResults.references[1].fileName)).toBeInTheDocument(); + expect(screen.getByText(searchResults[0].fileName)).toBeInTheDocument(); + expect(screen.getByText(searchResults[1].fileName)).toBeInTheDocument(); }); }); diff --git a/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.test.tsx b/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.test.tsx index 5b76b16f8d..8eb94f4878 100644 --- a/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.test.tsx +++ b/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.test.tsx @@ -230,6 +230,19 @@ describe('DocumentSelectStage', () => { }); }); + it('should call backLinkOverride when go back is clicked and function is provided', async () => { + const backLinkOverride = 'test'; + renderApp(history, { + backLinkOverride, + }); + + await userEvent.click(await screen.findByTestId('back-button')); + + await waitFor(() => { + expect(mockedUseNavigate).toHaveBeenCalledWith(backLinkOverride); + }); + }); + it('should call goToNextDocType when skip clicked and function is provided', async () => { const goToNextDocType = vi.fn(); renderApp(history, { @@ -736,6 +749,7 @@ describe('DocumentSelectStage', () => { type TestAppProps = { goToPreviousDocType?: () => void; goToNextDocType?: () => void; + backLinkOverride?: string; removeAllFilesLinkOverride?: string; showSkipLink?: boolean; documentConfig?: DOCUMENT_TYPE_CONFIG; @@ -746,6 +760,7 @@ describe('DocumentSelectStage', () => { const TestApp = ({ goToPreviousDocType, goToNextDocType, + backLinkOverride, removeAllFilesLinkOverride, showSkipLink, documentConfig, @@ -767,6 +782,7 @@ describe('DocumentSelectStage', () => { goToPreviousDocType={goToPreviousDocType} goToNextDocType={goToNextDocType} showSkiplink={showSkipLink} + backLinkOverride={backLinkOverride} removeAllFilesLinkOverride={removeAllFilesLinkOverride} isReview={isReview} /> diff --git a/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.tsx b/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.tsx index b79df0c569..bda9fff0a2 100644 --- a/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.tsx +++ b/app/src/components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.tsx @@ -42,7 +42,7 @@ export type Props = { filesErrorRef: RefObject; documentConfig: DOCUMENT_TYPE_CONFIG; onSuccessOverride?: () => void; - backLinkOverride?: () => void; + backLinkOverride?: string; removeAllFilesLinkOverride?: string; goToNextDocType?: () => void; goToPreviousDocType?: () => void; @@ -406,7 +406,7 @@ const DocumentSelectStage = ({ const backClicked = (): void => { if (backLinkOverride) { - backLinkOverride(); + navigate(backLinkOverride); } else if (goToPreviousDocType) { goToPreviousDocType(); resetErrors(); diff --git a/app/src/components/blocks/_documentUpload/documentUploadCompleteStage/DocumentUploadCompleteStage.tsx b/app/src/components/blocks/_documentUpload/documentUploadCompleteStage/DocumentUploadCompleteStage.tsx index 994d6a7afe..660ce7559b 100644 --- a/app/src/components/blocks/_documentUpload/documentUploadCompleteStage/DocumentUploadCompleteStage.tsx +++ b/app/src/components/blocks/_documentUpload/documentUploadCompleteStage/DocumentUploadCompleteStage.tsx @@ -11,6 +11,7 @@ import { } from '../../../../types/pages/UploadDocumentsPage/types'; import { useEffect, useState } from 'react'; import { allDocsHaveState } from '../../../../helpers/utils/uploadDocumentHelpers'; +import { getJourney } from '../../../../helpers/utils/urlManipulations'; import { DOCUMENT_TYPE_CONFIG } from '../../../../helpers/utils/documentType'; import { Button, ChevronLeftIcon, ChevronRightIcon } from 'nhsuk-react-components'; @@ -26,6 +27,7 @@ const DocumentUploadCompleteStage = ({ documents, documentConfig }: Props): Reac const formattedNhsNumber = formatNhsNumber(nhsNumber); const dob: string = getFormattedDateFromString(patientDetails?.birthDate); const patientName = getFormattedPatientFullName(patientDetails); + const journey = getJourney(); const [showFiles, setShowFiles] = useState(false); const failedDocuments = documents.filter((doc) => doc.state === DOCUMENT_UPLOAD_STATE.ERROR); @@ -117,7 +119,7 @@ const DocumentUploadCompleteStage = ({ documents, documentConfig }: Props): Reac <>

What happens next

- {patientDetails.canManageRecord && ( + {journey === 'update' && patientDetails.canManageRecord && (

You can now view the updated {documentConfig.displayName} for this patient in this service by{' '} diff --git a/app/src/components/blocks/_documentUpload/documentUploadIndex/DocumentUploadIndex.tsx b/app/src/components/blocks/_documentUpload/documentUploadIndex/DocumentUploadIndex.tsx index 37996c8790..10c8691376 100644 --- a/app/src/components/blocks/_documentUpload/documentUploadIndex/DocumentUploadIndex.tsx +++ b/app/src/components/blocks/_documentUpload/documentUploadIndex/DocumentUploadIndex.tsx @@ -146,29 +146,23 @@ const DocumentUploadIndex = ({ {documentTypesConfig .filter((doc) => doc.canUploadIndependently) .map((documentConfig) => ( - + => documentTypeSelected( - documentConfig.snomedCode as DOCUMENT_TYPE, + documentConfig.snomed_code as DOCUMENT_TYPE, ) } > - {documentConfig.content.uploadTitle} + {documentConfig.content.upload_title} - {( - documentConfig.content.uploadDescription as string[] - ).map((paragraph, index) => ( -

- {paragraph} -

- ))} + {documentConfig.content.upload_description} diff --git a/app/src/components/blocks/_documentUpload/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview.tsx b/app/src/components/blocks/_documentUpload/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview.tsx index 0f476dabc3..8ae8e86f34 100644 --- a/app/src/components/blocks/_documentUpload/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview.tsx +++ b/app/src/components/blocks/_documentUpload/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview.tsx @@ -72,8 +72,8 @@ const DocumentUploadLloydGeorgePreview = ({ {documentConfig.stitched ? ( <>

- This shows how these {documentConfig.displayName} will look when - combined into a single document.{' '} + This shows how the final record will look when combined into a + single document.{' '} {journey === 'update' && `Any files added will appear after the existing ${documentConfig.displayName}.`}

diff --git a/app/src/components/blocks/_documentUpload/documentUploadingStage/DocumentUploadingStage.tsx b/app/src/components/blocks/_documentUpload/documentUploadingStage/DocumentUploadingStage.tsx index d8e6dde329..55331f8d86 100644 --- a/app/src/components/blocks/_documentUpload/documentUploadingStage/DocumentUploadingStage.tsx +++ b/app/src/components/blocks/_documentUpload/documentUploadingStage/DocumentUploadingStage.tsx @@ -59,7 +59,7 @@ const DocumentUploadingStage = ({ {documentConfig.stitched && ( {journey === 'update' - ? `Your files will be added to the existing ${documentConfig.displayName} when the upload is complete.` + ? 'Your files will be added to the existing record when the upload is complete.' : 'Your files will be combined into one document when the upload is complete.'} )} diff --git a/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.test.tsx b/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.test.tsx index d5ad7801a8..2f0ad4a7fc 100644 --- a/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.test.tsx +++ b/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.test.tsx @@ -71,7 +71,22 @@ describe('PatientVerifyPage', () => { const backLink = screen.getByRole('link', { name: /back/i }); await userEvent.click(backLink); - expect(mockNavigate).toHaveBeenCalledWith(-1); + expect(mockNavigate).toHaveBeenCalledWith('/patient/search'); + }); + + it('renders back button with custom backLinkOverride when clicked', async () => { + mockNavigate.mockClear(); + render( + , + ); + + const backLink = screen.getByRole('link', { name: /back/i }); + await userEvent.click(backLink); + + expect(mockNavigate).toHaveBeenCalledWith('/admin/reviews/test-123/search-patient'); }); it('renders patient summary', () => { diff --git a/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.tsx b/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.tsx index 3cd9dd8d36..bffbebcc7c 100644 --- a/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.tsx +++ b/app/src/components/blocks/generic/patientVerifyPage/PatientVerifyPage.tsx @@ -3,6 +3,7 @@ import { Button, WarningCallout } from 'nhsuk-react-components'; import useTitle from '../../../../helpers/hooks/useTitle'; import BackButton from '../../../generic/backButton/BackButton'; import PatientSummary from '../../../generic/patientSummary/PatientSummary'; +import { routes } from '../../../../types/generic/routes'; import { useForm } from 'react-hook-form'; import usePatient from '../../../../helpers/hooks/usePatient'; import useRole from '../../../../helpers/hooks/useRole'; @@ -13,11 +14,13 @@ import { PatientDetails } from '../../../../types/generic/patientDetails'; type PatientVerifyPageProps = { onSubmit: (setInputError: Dispatch>) => void; reviewPatientDetails?: PatientDetails; + backLinkOverride?: string; }; const PatientVerifyPage = ({ onSubmit, reviewPatientDetails, + backLinkOverride, }: PatientVerifyPageProps): JSX.Element => { const role = useRole(); let patientDetails = usePatient(); @@ -36,7 +39,7 @@ const PatientVerifyPage = ({ return (
- + {inputError && ( { test('Document search results handles a 2XX response', async () => { const searchResult = buildSearchResult(); - const mockResults = { references: [searchResult] }; + const mockResults = [searchResult]; mockedAxios.get.mockImplementation(() => Promise.resolve({ status: 200, data: mockResults }), ); diff --git a/app/src/helpers/requests/getDocumentSearchResults.ts b/app/src/helpers/requests/getDocumentSearchResults.ts index 528b1e9676..85a53934ed 100644 --- a/app/src/helpers/requests/getDocumentSearchResults.ts +++ b/app/src/helpers/requests/getDocumentSearchResults.ts @@ -14,7 +14,7 @@ export type DocumentSearchResultsArgs = { }; export type GetDocumentSearchResultsResponse = { - references: Array; + data: Array; }; const getDocumentSearchResults = async ({ @@ -26,17 +26,16 @@ const getDocumentSearchResults = async ({ const gatewayUrl = baseUrl + endpoints.DOCUMENT_SEARCH; try { - const { data } = await axios.get(gatewayUrl, { + const response: GetDocumentSearchResultsResponse = await axios.get(gatewayUrl, { headers: { ...baseHeaders, }, params: { patientId: nhsNumber?.replaceAll(/\s/g, ''), // replace whitespace docType: docType === DOCUMENT_TYPE.ALL ? undefined : docType, - limit: 9999, }, }); - return data.references; + return response?.data; } catch (e) { if (isLocal) { return [ diff --git a/app/src/helpers/test/testBuilders.ts b/app/src/helpers/test/testBuilders.ts index c53bd0fb99..77d53315fc 100644 --- a/app/src/helpers/test/testBuilders.ts +++ b/app/src/helpers/test/testBuilders.ts @@ -193,8 +193,8 @@ const buildDocumentConfig = ( acceptedFileTypes: ['PDF'], content: { viewDocumentTitle: 'Scanned paper notes', - addFilesSelectTitle: 'Add scanned paper notes to this record', - uploadFilesSelectTitle: 'Choose scanned paper notes to upload', + addFilesSelectTitle: 'Add scanned paper notes files to this record', + uploadFilesSelectTitle: 'Choose scanned paper notes files to upload', uploadFilesBulletPoints: [ 'You can only upload PDF files', 'Check your files open correctly', diff --git a/app/src/helpers/utils/documentType.ts b/app/src/helpers/utils/documentType.ts index d1e60497c0..f34d075b8e 100644 --- a/app/src/helpers/utils/documentType.ts +++ b/app/src/helpers/utils/documentType.ts @@ -48,14 +48,14 @@ export type DOCUMENT_TYPE_CONFIG = { content: IndividualDocumentTypeContent; }; -export type DocumentTypeContentKey = 'uploadTitle' | 'uploadDescription'; +export type DocumentTypeContentKey = 'upload_title' | 'upload_description'; export interface DocumentTypeContent extends Record {} // The document type as defined in the documentTypesConfig.json export interface DocumentType { name: string; - snomedCode: string; - configName: string; + snomed_code: string; + config_name: string; content: DocumentTypeContent; } diff --git a/app/src/pages/adminRoutesPage/AdminRoutesPage.tsx b/app/src/pages/adminRoutesPage/AdminRoutesPage.tsx index 303cec71be..49f04efce2 100644 --- a/app/src/pages/adminRoutesPage/AdminRoutesPage.tsx +++ b/app/src/pages/adminRoutesPage/AdminRoutesPage.tsx @@ -210,6 +210,10 @@ const AdminRoutesPage = (): JSX.Element => { } /> diff --git a/app/src/pages/mockLoginPage/MockLoginPage.tsx b/app/src/pages/mockLoginPage/MockLoginPage.tsx index f8e0e8f2fe..9de0a2685e 100644 --- a/app/src/pages/mockLoginPage/MockLoginPage.tsx +++ b/app/src/pages/mockLoginPage/MockLoginPage.tsx @@ -59,7 +59,7 @@ const MockLoginPage = (): React.JSX.Element => {
{ it('renders start page content', () => { const contentStrings = [ - 'view, upload, download or remove a document', - "add files to a patient's scanned paper notes", - 'review and action pending patient documents', + 'This service gives you access to Lloyd George digital health records. ' + + 'You may have received a note within a patient record, stating that the paper record has been digitised.', + 'If you are part of a GP practice, you can use this service to:', + 'view a patient record', + 'remove a patient record', 'If you are managing records on behalf of NHS England, you can:', 'Not every patient will have a digital record available.', 'Before you start', @@ -37,18 +39,18 @@ describe('StartPage', () => { render(); - screen.getByText( - 'This service gives you access to digital Lloyd George records. Within a record we store the following documents:', - ); - - expect( - screen.getAllByText('download a report on the records stored in this service'), - ).toHaveLength(2); - contentStrings.forEach((s) => { expect(screen.getByText(s)).toBeInTheDocument(); }); + const downloadPatientRecord = screen.getAllByText('download a patient record'); + expect(downloadPatientRecord).toHaveLength(2); + + const downloadOdsReport = screen.getAllByText( + 'download a report on the records held within this service', + ); + expect(downloadOdsReport).toHaveLength(2); + expect(screen.getByText(/Contact the/i)).toBeInTheDocument(); expect( screen.getByRole('link', { diff --git a/app/src/pages/startPage/StartPage.tsx b/app/src/pages/startPage/StartPage.tsx index fb542a3d60..7e593861d8 100644 --- a/app/src/pages/startPage/StartPage.tsx +++ b/app/src/pages/startPage/StartPage.tsx @@ -33,30 +33,21 @@ const StartPage = (): React.JSX.Element => { <>

{pageHeader}

- This service gives you access to digital Lloyd George records. Within a record we - store the following documents: -

-
    -
  • Lloyd George scanned paper notes
  • -
  • Electronic health record notes
  • -
  • Electronic health record attachments
  • -
  • Patient letters and documents
  • -
-

- You may have received a note within a patient's Lloyd George notes, stating that - they have been digitised. + This service gives you access to Lloyd George digital health records. You may have + received a note within a patient record, stating that the paper record has been + digitised.

If you are part of a GP practice, you can use this service to:

    -
  • view, upload, download or remove a document
  • -
  • add files to a patient's scanned paper notes
  • -
  • review and action pending patient documents
  • -
  • download a report on the records stored in this service
  • +
  • view a patient record
  • +
  • download a patient record
  • +
  • remove a patient record
  • +
  • download a report on the records held within this service

If you are managing records on behalf of NHS England, you can:

    -
  • download documents
  • -
  • download a report on the records stored in this service
  • +
  • download a patient record
  • +
  • download a report on the records held within this service

Not every patient will have a digital record available.

Before you start

diff --git a/lambdas/enums/document_status.py b/lambdas/enums/document_status.py index 65ccac376b..2a16cd5bec 100644 --- a/lambdas/enums/document_status.py +++ b/lambdas/enums/document_status.py @@ -6,7 +6,6 @@ class DocumentStatus(Enum): FORBIDDEN = ("forbidden", "UC_4003") NOT_FOUND = ("not-found", "UC_4004") INFECTED = ("infected", "UC_4005") - INVALID = ("invalid", "UC_4006") @property def code(self): diff --git a/lambdas/enums/dynamo_filter.py b/lambdas/enums/dynamo_filter.py index aa0f6e77dd..5a3749f0ee 100644 --- a/lambdas/enums/dynamo_filter.py +++ b/lambdas/enums/dynamo_filter.py @@ -15,5 +15,3 @@ class AttributeOperator(Enum): class ConditionOperator(Enum): OR = "|" AND = "&" - EQUAL = "=" - NOT_EQUAL = "<>" diff --git a/lambdas/enums/lambda_error.py b/lambdas/enums/lambda_error.py index d5c2a62e5f..57563fd3db 100644 --- a/lambdas/enums/lambda_error.py +++ b/lambdas/enums/lambda_error.py @@ -43,9 +43,7 @@ def create_error_response( return error_response def to_str( - self, - params: Optional[dict] = None, - details: Optional[str] = None, + self, params: Optional[dict] = None, details: Optional[str] = None ) -> str: message = self.value["message"] if "%" in message and params: @@ -61,9 +59,7 @@ def create_error_body( **kwargs, ) -> str: return self.create_error_response( - params=params, - details=details, - **kwargs, + params=params, details=details, **kwargs ).create() """ @@ -444,10 +440,6 @@ def create_error_body( "err_code": "UC_4005", "message": "Some of the given document references are not referring to clean files", } - UploadConfirmResultFilesInvalid = { - "err_code": "UC_4006", - "message": "Some of the given document references are password protected or corrupted", - } UploadConfirmResultAWSFailure = { "err_code": "UC_5004", "message": "Error occurred with an AWS service", diff --git a/lambdas/enums/virus_scan_result.py b/lambdas/enums/virus_scan_result.py index ade769ab5c..484d9e9027 100644 --- a/lambdas/enums/virus_scan_result.py +++ b/lambdas/enums/virus_scan_result.py @@ -7,7 +7,6 @@ class VirusScanResult(StrEnum): INFECTED_ALLOWED = "InfectedAllowed" UNSCANNABLE = "Unscannable" ERROR = "Error" - INVALID = "Invalid" SCAN_RESULT_TAG_KEY = "scan-result" diff --git a/lambdas/handlers/bulk_upload_metadata_processor_handler.py b/lambdas/handlers/bulk_upload_metadata_processor_handler.py index 85a0c88825..048214cd38 100644 --- a/lambdas/handlers/bulk_upload_metadata_processor_handler.py +++ b/lambdas/handlers/bulk_upload_metadata_processor_handler.py @@ -18,13 +18,13 @@ @set_request_context_for_logging @override_error_check @ensure_environment_variables( - names=["STAGING_STORE_BUCKET_NAME", "METADATA_SQS_QUEUE_URL"], + names=["STAGING_STORE_BUCKET_NAME", "METADATA_SQS_QUEUE_URL"] ) @handle_lambda_exceptions def lambda_handler(event, _context): feature_flag_service = FeatureFlagService() send_to_review_flag_object = feature_flag_service.get_feature_flags_by_flag( - FeatureFlags.BULK_UPLOAD_SEND_TO_REVIEW_ENABLED.value, + FeatureFlags.BULK_UPLOAD_SEND_TO_REVIEW_ENABLED.value ) send_to_review_enabled = send_to_review_flag_object[ FeatureFlags.BULK_UPLOAD_SEND_TO_REVIEW_ENABLED.value @@ -32,12 +32,11 @@ def lambda_handler(event, _context): if send_to_review_enabled: logger.info( - "Bulk upload send to review queue is enabled for metadata processor", + "Bulk upload send to review queue is enabled for metadata processor" ) raw_pre_format_type = event.get( - "preFormatType", - LloydGeorgePreProcessFormat.GENERAL, + "preFormatType", LloydGeorgePreProcessFormat.GENERAL ) formatter_service_class = get_formatter_service(raw_pre_format_type) input_file_location = event.get("inputFileLocation", "") @@ -59,12 +58,12 @@ def lambda_handler(event, _context): if not input_file_location: logger.error( - "Failed to start metadata processing due to missing field: inputFileLocation", + "Failed to start metadata processing due to missing field: inputFileLocation" ) return logger.info( - f"Starting metadata processing for file location: {input_file_location}", + f"Starting metadata processing for file location: {input_file_location}" ) fixed_values = event.get("fixedValues", {}) diff --git a/lambdas/handlers/document_reference_search_handler.py b/lambdas/handlers/document_reference_search_handler.py index b6f4ad126e..74c5d37bff 100755 --- a/lambdas/handlers/document_reference_search_handler.py +++ b/lambdas/handlers/document_reference_search_handler.py @@ -10,32 +10,32 @@ from utils.decorators.handle_lambda_exceptions import handle_lambda_exceptions from utils.decorators.override_error_check import override_error_check from utils.decorators.set_audit_arg import set_request_context_for_logging -from utils.decorators.validate_patient_id import validate_patient_id +from utils.decorators.validate_patient_id import ( + extract_nhs_number_from_event, + validate_patient_id, +) from utils.document_type_utils import extract_document_type_to_enum from utils.lambda_exceptions import DocumentRefSearchException from utils.lambda_response import ApiGatewayResponse from utils.request_context import request_context -from utils.utilities import camelize_dict logger = LoggingService(__name__) @set_request_context_for_logging @validate_patient_id -@ensure_environment_variables(names=["LLOYD_GEORGE_DYNAMODB_NAME"]) +@ensure_environment_variables(names=["DYNAMODB_TABLE_LIST"]) @override_error_check @handle_lambda_exceptions def lambda_handler(event, context): request_context.app_interaction = LoggingAppInteraction.VIEW_PATIENT.value logger.info("Starting document reference search process") - nhs_number, next_page_token, limit = extract_querystring_params(event) - + nhs_number = extract_nhs_number_from_event(event) + doc_type = event.get("queryStringParameters", {}).get("docType", None) try: - document_snomed_code = ( - extract_document_type_to_enum(doc_type) if doc_type else None - ) + document_snomed_code = extract_document_type_to_enum(doc_type) if doc_type else None except ValueError: raise DocumentRefSearchException(400, LambdaError.DocTypeInvalid) @@ -43,40 +43,30 @@ def lambda_handler(event, context): document_reference_search_service = DocumentReferenceSearchService() upload_lambda_enabled_flag_object = FeatureFlagService().get_feature_flags_by_flag( - FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED, + FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED ) doc_upload_iteration2_enabled = upload_lambda_enabled_flag_object[ FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED ] + additional_filters = {} if doc_upload_iteration2_enabled: additional_filters["doc_status"] = "final" if document_snomed_code: additional_filters["document_snomed_code"] = document_snomed_code[0].value - logger.info("Searching for patient references with pagination.") - - response_dict = ( - document_reference_search_service.get_paginated_references_by_nhs_number( - nhs_number=nhs_number, - limit=limit, - next_page_token=next_page_token, - filter=additional_filters, - ) + response = document_reference_search_service.get_document_references( + nhs_number, + check_upload_completed=True, + additional_filters=additional_filters ) - response = camelize_dict(response_dict) logger.info("User is able to view docs", {"Result": "Successful viewing docs"}) - return ApiGatewayResponse( - 200, - json.dumps(response), - "GET", - ).create_api_gateway_response() - - -def extract_querystring_params(event): - nhs_number = event["queryStringParameters"]["patientId"] - next_page_token = event["queryStringParameters"].get("nextPageToken") - limit = event["queryStringParameters"].get("limit") - - return nhs_number, next_page_token, limit + if response: + return ApiGatewayResponse( + 200, json.dumps(response), "GET" + ).create_api_gateway_response() + else: + return ApiGatewayResponse( + 204, json.dumps([]), "GET" + ).create_api_gateway_response() diff --git a/lambdas/handlers/fhir_document_reference_search_handler.py b/lambdas/handlers/fhir_document_reference_search_handler.py index 8f342c82ce..a6c1093de6 100644 --- a/lambdas/handlers/fhir_document_reference_search_handler.py +++ b/lambdas/handlers/fhir_document_reference_search_handler.py @@ -31,7 +31,7 @@ @ensure_environment_variables( - names=["LLOYD_GEORGE_DYNAMODB_NAME", "DOCUMENT_RETRIEVE_ENDPOINT_APIM"], + names=["DYNAMODB_TABLE_LIST", "DOCUMENT_RETRIEVE_ENDPOINT_APIM"] ) @set_request_context_for_logging @validate_patient_id_fhir @@ -51,7 +51,7 @@ def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]: selected_role_id = event.get("headers", {}).get(HEADER_CIS2_USER_ID, "") nhs_number, search_filters = parse_query_parameters( - event.get("queryStringParameters", {}), + event.get("queryStringParameters", {}) ) request_context.patient_nhs_no = nhs_number @@ -70,14 +70,12 @@ def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]: if document_references["total"] < 1: logger.info(f"No document references found for NHS number: {nhs_number}") return ApiGatewayResponse( - 200, - json.dumps(document_references), - "GET", + 200, json.dumps(document_references), "GET" ).create_api_gateway_response() def parse_query_parameters( - query_string: Dict[str, str], + query_string: Dict[str, str] ) -> Tuple[Optional[str], Dict[str, str]]: """ Parse and extract NHS number and search filters from query parameters. @@ -107,9 +105,7 @@ def parse_query_parameters( def validate_user_access( - bearer_token: str, - selected_role_id: str, - nhs_number: str, + bearer_token: str, selected_role_id: str, nhs_number: str ) -> None: """ Validate that the user has permission to access the requested patient data. @@ -135,9 +131,7 @@ def validate_user_access( userinfo = oidc_service.fetch_userinfo(bearer_token) org_ods_code = oidc_service.fetch_user_org_code(userinfo, selected_role_id) smartcard_role_code, _ = oidc_service.fetch_user_role_code( - userinfo, - selected_role_id, - "R", + userinfo, selected_role_id, "R" ) except (OidcApiException, AuthorisationException) as e: logger.error(f"Authorization failed: {e}") @@ -146,8 +140,7 @@ def validate_user_access( try: # Validate patient access search_patient_service = SearchPatientDetailsService( - smartcard_role_code, - org_ods_code, + smartcard_role_code, org_ods_code ) search_patient_service.handle_search_patient_request(nhs_number, False) except SearchPatientException as e: diff --git a/lambdas/repositories/bulk_upload/bulk_upload_sqs_repository.py b/lambdas/repositories/bulk_upload/bulk_upload_sqs_repository.py index 2837f6e150..9bdba35e41 100644 --- a/lambdas/repositories/bulk_upload/bulk_upload_sqs_repository.py +++ b/lambdas/repositories/bulk_upload/bulk_upload_sqs_repository.py @@ -38,7 +38,7 @@ def send_message_to_review_queue( request_context.patient_nhs_no = staging_metadata.nhs_number review_files = [ ReviewMessageFile( - file_name=file.file_path.split("/")[-1], + file_name=file.stored_file_name.split("/")[-1], file_path=file.file_path.lstrip("/"), ) for file in staging_metadata.files @@ -56,7 +56,7 @@ def send_message_to_review_queue( logger.info( f"Sending message to review queue for NHS number {staging_metadata.nhs_number} " - f"with failure reason: {failure_reason}", + f"with failure reason: {failure_reason}" ) self.sqs_repository.send_message_standard( @@ -80,9 +80,7 @@ def put_sqs_message_back_to_queue(self, sqs_message: dict): ) def send_message_to_pdf_stitching_queue( - self, - queue_url: str, - message: PdfStitchingSqsMessage, + self, queue_url: str, message: PdfStitchingSqsMessage ): self.sqs_repository.send_message_standard( queue_url=queue_url, diff --git a/lambdas/requirements/layers/requirements_files_lambda_layer.txt b/lambdas/requirements/layers/requirements_files_lambda_layer.txt deleted file mode 100644 index 0d4bff021d..0000000000 --- a/lambdas/requirements/layers/requirements_files_lambda_layer.txt +++ /dev/null @@ -1 +0,0 @@ -msoffcrypto-tool==6.0.0 \ No newline at end of file diff --git a/lambdas/ruff.toml b/lambdas/ruff.toml index 9b92d3839a..b461c7568d 100644 --- a/lambdas/ruff.toml +++ b/lambdas/ruff.toml @@ -32,8 +32,7 @@ line-length = 130 # Enable the pycodestyle (`E`) and Pyflakes (`F`) rules by default. # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or # McCabe complexity (`C901`) by default. -# COM812: Enforce trailing commas on multi-line constructs. -select = ["E", "F", "COM812", "RET505"] +select = ["E", "F"] ignore = [] # Allow autofix for all enabled rules (when `--fix`) is provided. diff --git a/lambdas/services/base/s3_service.py b/lambdas/services/base/s3_service.py index 7d39123566..aea283c6aa 100644 --- a/lambdas/services/base/s3_service.py +++ b/lambdas/services/base/s3_service.py @@ -40,9 +40,7 @@ def __init__(self, custom_aws_role=None): if custom_aws_role: self.iam_service = IAMService() self.custom_client, self.expiration_time = self.iam_service.assume_role( - self.custom_aws_role, - "s3", - config=self.config, + self.custom_aws_role, "s3", config=self.config ) # S3 Location should be a minimum of a s3_object_key but can also be a directory location in the form of @@ -50,13 +48,11 @@ def __init__(self, custom_aws_role=None): def create_upload_presigned_url(self, s3_bucket_name: str, s3_object_location: str): if self.custom_client: if datetime.now(timezone.utc) > self.expiration_time - timedelta( - minutes=10, + minutes=10 ): logger.info(S3Service.EXPIRED_SESSION_WARNING) self.custom_client, self.expiration_time = self.iam_service.assume_role( - self.custom_aws_role, - "s3", - config=self.config, + self.custom_aws_role, "s3", config=self.config ) return self.custom_client.generate_presigned_post( s3_bucket_name, @@ -69,13 +65,11 @@ def create_upload_presigned_url(self, s3_bucket_name: str, s3_object_location: s def create_put_presigned_url(self, s3_bucket_name: str, file_key: str): if self.custom_client: if datetime.now(timezone.utc) > self.expiration_time - timedelta( - minutes=10, + minutes=10 ): logger.info(S3Service.EXPIRED_SESSION_WARNING) self.custom_client, self.expiration_time = self.iam_service.assume_role( - self.custom_aws_role, - "s3", - config=self.config, + self.custom_aws_role, "s3", config=self.config ) logger.info("Generating presigned URL") return self.custom_client.generate_presigned_url( @@ -88,13 +82,11 @@ def create_put_presigned_url(self, s3_bucket_name: str, file_key: str): def create_download_presigned_url(self, s3_bucket_name: str, file_key: str): if self.custom_client: if datetime.now(timezone.utc) > self.expiration_time - timedelta( - minutes=10, + minutes=10 ): logger.info(S3Service.EXPIRED_SESSION_WARNING) self.custom_client, self.expiration_time = self.iam_service.assume_role( - self.custom_aws_role, - "s3", - config=self.config, + self.custom_aws_role, "s3", config=self.config ) logger.info("Generating presigned URL") return self.custom_client.generate_presigned_url( @@ -151,32 +143,24 @@ def copy_across_bucket( if_none_match, False, ) - raise e + else: + raise e else: logger.error(f"Copy failed: {e}") raise e def delete_object( - self, - s3_bucket_name: str, - file_key: str, - version_id: str | None = None, + self, s3_bucket_name: str, file_key: str, version_id: str | None = None ): if version_id is None: return self.client.delete_object(Bucket=s3_bucket_name, Key=file_key) return self.client.delete_object( - Bucket=s3_bucket_name, - Key=file_key, - VersionId=version_id, + Bucket=s3_bucket_name, Key=file_key, VersionId=version_id ) def create_object_tag( - self, - s3_bucket_name: str, - file_key: str, - tag_key: str, - tag_value: str, + self, s3_bucket_name: str, file_key: str, tag_key: str, tag_value: str ): return self.client.put_object_tagging( Bucket=s3_bucket_name, @@ -184,7 +168,7 @@ def create_object_tag( Tagging={ "TagSet": [ {"Key": tag_key, "Value": tag_value}, - ], + ] }, ) @@ -198,7 +182,7 @@ def get_tag_value(self, s3_bucket_name: str, file_key: str, tag_key: str) -> str return key_value_pair["Value"] raise TagNotFoundException( - f"Object {file_key} doesn't have a tag of key {tag_key}", + f"Object {file_key} doesn't have a tag of key {tag_key}" ) def file_exist_on_s3(self, s3_bucket_name: str, file_key: str) -> bool: @@ -234,11 +218,8 @@ def get_file_size(self, s3_bucket_name: str, object_key: str) -> int: def get_head_object(self, bucket: str, key: str): return self.client.head_object(Bucket=bucket, Key=key) - def get_object_stream(self, bucket: str, key: str, byte_range: str | None = None): - params = {"Bucket": bucket, "Key": key} - if byte_range: - params["Range"] = byte_range - response = self.client.get_object(**params) + def get_object_stream(self, bucket: str, key: str): + response = self.client.get_object(Bucket=bucket, Key=key) return response.get("Body") def stream_s3_object_to_memory(self, bucket: str, key: str) -> BytesIO: @@ -266,15 +247,13 @@ def upload_file_obj( logger.info(f"Uploaded file object to s3://{s3_bucket_name}/{file_key}") except ClientError as e: logger.error( - f"Failed to upload file object to s3://{s3_bucket_name}/{file_key} - {e}", + f"Failed to upload file object to s3://{s3_bucket_name}/{file_key} - {e}" ) raise e def save_or_create_file(self, source_bucket: str, file_key: str, body: bytes): return self.client.put_object( - Bucket=source_bucket, - Key=file_key, - Body=BytesIO(body), + Bucket=source_bucket, Key=file_key, Body=BytesIO(body) ) def list_all_object_versions(self, bucket_name: str): diff --git a/lambdas/services/bulk_upload_service.py b/lambdas/services/bulk_upload_service.py index 9b46673744..21bf7eddfb 100644 --- a/lambdas/services/bulk_upload_service.py +++ b/lambdas/services/bulk_upload_service.py @@ -78,20 +78,20 @@ def process_message_queue(self, records: list): logger.error(error) logger.info( - "Cannot validate patient due to PDS responded with Too Many Requests", + "Cannot validate patient due to PDS responded with Too Many Requests" ) logger.info("Cannot process for now due to PDS rate limit reached.") logger.info( - "All remaining messages in this batch will be returned to sqs queue to retry later.", + "All remaining messages in this batch will be returned to sqs queue to retry later." ) all_unprocessed_message = records[index - 1 :] for unprocessed_message in all_unprocessed_message: self.sqs_repository.put_sqs_message_back_to_queue( - unprocessed_message, + unprocessed_message ) raise BulkUploadException( - "Bulk upload process paused due to PDS rate limit reached", + "Bulk upload process paused due to PDS rate limit reached" ) except ( ClientError, @@ -104,15 +104,14 @@ def process_message_queue(self, records: list): logger.info("Continue on next message") logger.info( - f"Finish Processing successfully {len(records) - len(self.unhandled_messages)} of {len(records)} messages", + f"Finish Processing successfully {len(records) - len(self.unhandled_messages)} of {len(records)} messages" ) if self.unhandled_messages: logger.info("Unable to process the following messages:") for message in self.unhandled_messages: message_body = json.loads(message.get("body", "{}")) request_context.patient_nhs_no = message_body.get( - "NHS-NO", - "no number found", + "NHS-NO", "no number found" ) logger.info(message_body) @@ -123,12 +122,7 @@ def handle_sqs_message(self, message: dict): try: staging_metadata_json = message["body"] staging_metadata = StagingSqsMetadata.model_validate_json( - staging_metadata_json, - ) - uploader_ods = ( - staging_metadata.files[0].gp_practice_code - if staging_metadata.files - else "" + staging_metadata_json ) except (pydantic.ValidationError, KeyError) as e: logger.error(f"Got incomprehensible message: {message}") @@ -143,18 +137,16 @@ def handle_sqs_message(self, message: dict): file_names.append(os.path.basename(file_metadata.stored_file_name)) file_metadata.scan_date = validate_scan_date(file_metadata.scan_date) file_metadata.file_path = self.strip_leading_slash( - file_metadata.file_path, + file_metadata.file_path ) request_context.patient_nhs_no = staging_metadata.nhs_number validate_nhs_number(staging_metadata.nhs_number) pds_patient_details = getting_patient_info_from_pds( - staging_metadata.nhs_number, + staging_metadata.nhs_number ) - patient_ods_code = ( pds_patient_details.get_ods_code_or_inactive_status_for_gp() ) - validate_lg_file_names(file_names, staging_metadata.nhs_number) if not self.bypass_pds: @@ -163,29 +155,25 @@ def handle_sqs_message(self, message: dict): name_validation_accepted_reason, is_name_validation_based_on_historic_name, ) = validate_filename_with_patient_details_lenient( - file_names, - pds_patient_details, + file_names, pds_patient_details ) accepted_reason = self.concatenate_acceptance_reason( - accepted_reason, - name_validation_accepted_reason, + accepted_reason, name_validation_accepted_reason ) else: is_name_validation_based_on_historic_name = ( validate_filename_with_patient_details_strict( - file_names, - pds_patient_details, + file_names, pds_patient_details ) ) if is_name_validation_based_on_historic_name: accepted_reason = self.concatenate_acceptance_reason( - accepted_reason, - "Patient matched on historical name", + accepted_reason, "Patient matched on historical name" ) if not allowed_to_ingest_ods_code(patient_ods_code): raise LGInvalidFilesException( - "Patient not registered at your practice", + "Patient not registered at your practice" ) patient_death_notification_status = ( pds_patient_details.get_death_notification_status() @@ -193,13 +181,11 @@ def handle_sqs_message(self, message: dict): if patient_death_notification_status: deceased_accepted_reason = f"Patient is deceased - {patient_death_notification_status.name}" accepted_reason = self.concatenate_acceptance_reason( - accepted_reason, - deceased_accepted_reason, + accepted_reason, deceased_accepted_reason ) if patient_ods_code is PatientOdsInactiveStatus.RESTRICTED: accepted_reason = self.concatenate_acceptance_reason( - accepted_reason, - "PDS record is restricted", + accepted_reason, "PDS record is restricted" ) except ( @@ -209,18 +195,20 @@ def handle_sqs_message(self, message: dict): PatientRecordAlreadyExistException, ) as error: logger.info( - f"Detected issue related to patient number: {staging_metadata.nhs_number}", + f"Detected issue related to patient number: {staging_metadata.nhs_number}" ) logger.error(error) logger.info("Will stop processing Lloyd George record for this patient.") reason = str(error) + uploader_ods = ( + staging_metadata.files[0].gp_practice_code + if staging_metadata.files + else "" + ) self.dynamo_repository.write_report_upload_to_dynamo( - staging_metadata, - UploadStatus.FAILED, - reason, - patient_ods_code, + staging_metadata, UploadStatus.FAILED, reason, patient_ods_code ) if isinstance(error, (InvalidNhsNumberException, PatientNotFoundException)): logger.info("Invalid NHS number detected. Will set as placeholder") @@ -229,34 +217,29 @@ def handle_sqs_message(self, message: dict): return logger.info( - "NHS Number and filename validation complete. Checking virus scan has marked files as Clean", + "NHS Number and filename validation complete. Checking virus scan has marked files as Clean" ) try: self.resolve_source_file_path(staging_metadata) self.bulk_upload_s3_repository.check_virus_result( - staging_metadata, - self.file_path_cache, + staging_metadata, self.file_path_cache ) logger.info("Virus scan validation complete. Checking PDF file integrity") self.bulk_upload_s3_repository.check_pdf_integrity( - staging_metadata, - self.file_path_cache, + staging_metadata, self.file_path_cache ) except VirusScanNoResultException as e: logger.info(e) logger.info( - f"Waiting on virus scan results for: {staging_metadata.nhs_number}, adding message back to queue", + f"Waiting on virus scan results for: {staging_metadata.nhs_number}, adding message back to queue" ) if staging_metadata.retries > 14: err = ( "File was not scanned for viruses before maximum retries attempted" ) self.dynamo_repository.write_report_upload_to_dynamo( - staging_metadata, - UploadStatus.FAILED, - err, - patient_ods_code, + staging_metadata, UploadStatus.FAILED, err, patient_ods_code ) else: self.sqs_repository.put_staging_metadata_back_to_queue(staging_metadata) @@ -264,7 +247,7 @@ def handle_sqs_message(self, message: dict): except (VirusScanFailedException, DocumentInfectedException) as e: logger.info(e) logger.info( - f"Virus scan results check failed for: {staging_metadata.nhs_number}, removing from queue", + f"Virus scan results check failed for: {staging_metadata.nhs_number}, removing from queue" ) logger.info("Will stop processing Lloyd George record for this patient") @@ -278,7 +261,7 @@ def handle_sqs_message(self, message: dict): except CorruptedFileException as e: logger.info(e) logger.info( - f"PDF integrity check failed for: {staging_metadata.nhs_number}, removing from queue", + f"PDF integrity check failed for: {staging_metadata.nhs_number}, removing from queue" ) logger.info("Will stop processing Lloyd George record for this patient") @@ -292,7 +275,7 @@ def handle_sqs_message(self, message: dict): except S3FileNotFoundException as e: logger.info(e) logger.info( - f"One or more of the files is not accessible from S3 bucket for patient {staging_metadata.nhs_number}", + f"One or more of the files is not accessible from S3 bucket for patient {staging_metadata.nhs_number}" ) logger.info("Will stop processing Lloyd George record for this patient") @@ -310,7 +293,7 @@ def handle_sqs_message(self, message: dict): self.dynamo_repository.init_transaction() logger.info( - "Transaction initialised. Transferring files to main S3 bucket and creating metadata", + "Transaction initialised. Transferring files to main S3 bucket and creating metadata" ) try: @@ -336,13 +319,10 @@ def handle_sqs_message(self, message: dict): return logger.info( - "File transfer complete. Removing uploaded files from staging bucket", + "File transfer complete. Removing uploaded files from staging bucket" ) self.bulk_upload_s3_repository.remove_ingested_file_from_source_bucket() - if uploader_ods != patient_ods_code: - logger.info("Ingested files for a different practice.") - logger.info( f"Completed file ingestion for patient {staging_metadata.nhs_number}", {"Result": "Successful upload"}, @@ -364,7 +344,7 @@ def handle_sqs_message(self, message: dict): message=pdf_stitching_sqs_message, ) logger.info( - f"Message sent to stitching queue for patient {staging_metadata.nhs_number}", + f"Message sent to stitching queue for patient {staging_metadata.nhs_number}" ) def resolve_source_file_path(self, staging_metadata: StagingSqsMetadata): @@ -387,43 +367,38 @@ def resolve_source_file_path(self, staging_metadata: StagingSqsMetadata): file_path_in_nfd_form = convert_to_nfd_form(file_path_in_metadata) if self.bulk_upload_s3_repository.file_exists_on_staging_bucket( - file_path_in_nfc_form, + file_path_in_nfc_form ): resolved_file_paths[file_path_in_metadata] = file_path_in_nfc_form elif self.bulk_upload_s3_repository.file_exists_on_staging_bucket( - file_path_in_nfd_form, + file_path_in_nfd_form ): resolved_file_paths[file_path_in_metadata] = file_path_in_nfd_form else: logger.info( - "No file matching the provided file path was found on S3 bucket", + "No file matching the provided file path was found on S3 bucket" ) logger.info("Please check whether files are named correctly") raise S3FileNotFoundException( - f"Failed to access file {sample_file_path}", + f"Failed to access file {sample_file_path}" ) self.file_path_cache = resolved_file_paths def create_lg_records_and_copy_files( - self, - staging_metadata: StagingSqsMetadata, - current_gp_ods: str, + self, staging_metadata: StagingSqsMetadata, current_gp_ods: str ): nhs_number = staging_metadata.nhs_number for file_metadata in staging_metadata.files: document_reference = self.convert_to_document_reference( - file_metadata, - nhs_number, - current_gp_ods, + file_metadata, nhs_number, current_gp_ods ) source_file_key = self.file_path_cache[file_metadata.file_path] dest_file_key = document_reference.s3_file_key copy_result = self.bulk_upload_s3_repository.copy_to_lg_bucket( - source_file_key=source_file_key, - dest_file_key=dest_file_key, + source_file_key=source_file_key, dest_file_key=dest_file_key ) s3_bucket_name = self.bulk_upload_s3_repository.lg_bucket_name @@ -431,8 +406,7 @@ def create_lg_records_and_copy_files( document_reference.file_size = ( self.bulk_upload_s3_repository.s3_repository.get_file_size( - s3_bucket_name=s3_bucket_name, - object_key=dest_file_key, + s3_bucket_name=s3_bucket_name, object_key=dest_file_key ) ) document_reference.set_uploaded_to_true() @@ -446,7 +420,7 @@ def rollback_transaction(self): logger.info("Rolled back an incomplete transaction") except ClientError as e: logger.error( - f"Failed to rollback the incomplete transaction due to error: {e}", + f"Failed to rollback the incomplete transaction due to error: {e}" ) def convert_to_document_reference( @@ -497,7 +471,7 @@ def send_to_review_queue_if_enabled( uploader_ods=uploader_ods, ) logger.info( - f"Sent failed record to review queue with reason: {review_reason}", + f"Sent failed record to review queue with reason: {review_reason}" ) except Exception as e: logger.error( diff --git a/lambdas/services/document_reference_search_service.py b/lambdas/services/document_reference_search_service.py index 04d6a2c0e4..a4046bb45e 100644 --- a/lambdas/services/document_reference_search_service.py +++ b/lambdas/services/document_reference_search_service.py @@ -1,8 +1,9 @@ +import json import os from json import JSONDecodeError from botocore.exceptions import ClientError -from enums.dynamo_filter import AttributeOperator, ConditionOperator +from enums.dynamo_filter import AttributeOperator from enums.infrastructure import MAP_MTLS_TO_DYNAMO from enums.lambda_error import LambdaError from enums.metadata_field_names import DocumentReferenceMetadataFields @@ -16,7 +17,6 @@ from utils.audit_logging_setup import LoggingService from utils.common_query_filters import NotDeleted, UploadCompleted from utils.dynamo_query_filter_builder import DynamoQueryFilterBuilder -from utils.dynamo_utils import build_mixed_condition_expression from utils.exceptions import DynamoServiceException from utils.lambda_exceptions import DocumentRefSearchException from utils.lambda_header_utils import validate_common_name_in_mtls @@ -36,23 +36,20 @@ def get_document_references( """ Fetch document references for a given NHS number. - Args: - nhs_number (str): NHS number - return_fhir (bool, optional): Return FHIR document references. Defaults to False. - additional_filters (dict, optional): Additional filters to apply to DynamoDB query. (Defaults to None.) - check_upload_completed (bool): Check upload of document is complete. (Defaults to True.) - api_request_context (dict, optional): API request context, used to obtain MTLS common name. (Defaults to {}.) - Returns: - List of document references or FHIR DocumentReferences. + :param nhs_number: The NHS number to search for. + :param return_fhir: If True, return FHIR DocumentReference objects. + :param additional_filters: Additional filters to apply to the search. + :param check_upload_completed: If True, check if the upload is completed before returning the results. + :return: List of document references or FHIR DocumentReferences. """ common_name = validate_common_name_in_mtls( - api_request_context=api_request_context, + api_request_context=api_request_context ) try: - table_name = self._get_table_name(common_name) + list_of_table_names = self._get_table_names(common_name) results = self._search_tables_for_documents( nhs_number, - table_name, + list_of_table_names, return_fhir, additional_filters, check_upload_completed, @@ -70,51 +67,54 @@ def get_document_references( ) raise DocumentRefSearchException(500, LambdaError.DocRefClient) - def _get_table_name(self, common_name: MtlsCommonNames | None) -> str: - logger.info("Getting table name for document search") + def _get_table_names(self, common_name: MtlsCommonNames | None) -> list[str]: + table_list = [] + try: + table_list = json.loads(os.environ["DYNAMODB_TABLE_LIST"]) + except JSONDecodeError as e: + logger.error(f"Failed to decode table list: {str(e)}") + raise + if not common_name or common_name not in MtlsCommonNames: - return os.environ["LLOYD_GEORGE_DYNAMODB_NAME"] + return table_list - return str(MAP_MTLS_TO_DYNAMO[common_name]) + return [str(MAP_MTLS_TO_DYNAMO[common_name])] def _search_tables_for_documents( self, nhs_number: str, - table_name: str, + table_names: list[str], return_fhir: bool, filters=None, check_upload_completed=False, ): document_resources = [] - logger.info(f"Searching for results in {table_name}") - filter_expression = self._build_filter_expression( - filters, - check_upload_completed, - ) - - if "coredocumentmetadata" not in table_name.lower(): - documents = self.fetch_documents_from_table_with_nhs_number( - nhs_number, - table_name, - query_filter=filter_expression, - ) - else: - documents = self.fetch_documents_from_table( - search_condition=nhs_number, - search_key="NhsNumber", - table_name=table_name, - query_filter=filter_expression, + for table_name in table_names: + logger.info(f"Searching for results in {table_name}") + filter_expression = self._get_filter_expression( + filters, upload_completed=check_upload_completed ) - if check_upload_completed: - self._validate_upload_status(documents) + if "coredocumentmetadata" not in table_name.lower(): + documents = self.fetch_documents_from_table_with_nhs_number( + nhs_number, table_name, query_filter=filter_expression + ) + else: + documents = self.fetch_documents_from_table( + search_condition=nhs_number, + search_key="NhsNumber", + table_name=table_name, + query_filter=filter_expression, + ) - processed_documents = self._process_documents( - documents, - return_fhir=return_fhir, - ) - document_resources.extend(processed_documents) + if check_upload_completed: + self._validate_upload_status(documents) + + processed_documents = self._process_documents( + documents, return_fhir=return_fhir + ) + document_resources.extend(processed_documents) logger.info(f"Found {len(document_resources)} document references") @@ -123,6 +123,16 @@ def _search_tables_for_documents( return document_resources or None + def _get_filter_expression( + self, filters: dict[str, str | None] = None, upload_completed=False + ): + if filters: + return self._build_filter_expression(filters) + elif upload_completed: + return UploadCompleted + else: + return None + def _create_fhir_bundle(self, document_resources: list[dict]) -> dict: entries = [ BundleEntry(resource=doc_resource) for doc_resource in document_resources @@ -145,9 +155,7 @@ def _validate_upload_status(self, documents: list[DocumentReference]): raise DocumentRefSearchException(423, LambdaError.UploadInProgressError) def _process_documents( - self, - documents: list[DocumentReference], - return_fhir: bool, + self, documents: list[DocumentReference], return_fhir: bool ) -> list[dict]: results = [] for document in documents: @@ -181,16 +189,7 @@ def _build_document_model(self, document: DocumentReference) -> dict: ) return document_formatted - def _build_filter_expression( - self, - filter_values: dict[str, str] | None, - upload_completed=False, - ): - if not filter_values: - if not upload_completed: - return NotDeleted - return UploadCompleted - + def _build_filter_expression(self, filter_values: dict[str, str]): filter_builder = DynamoQueryFilterBuilder() for filter_key, filter_value in filter_values.items(): if filter_key == "custodian": @@ -211,13 +210,16 @@ def _build_filter_expression( elif filter_key == "document_snomed_code": filter_builder.add_condition( attribute=str( - DocumentReferenceMetadataFields.DOCUMENT_SNOMED_CODE_TYPE.value, + DocumentReferenceMetadataFields.DOCUMENT_SNOMED_CODE_TYPE.value ), attr_operator=AttributeOperator.EQUAL, filter_value=filter_value, ) - - return filter_builder.build() & NotDeleted + if filter_values: + filter_expression = filter_builder.build() & NotDeleted + else: + filter_expression = NotDeleted + return filter_expression def create_document_reference_fhir_response( self, @@ -240,119 +242,10 @@ def create_document_reference_fhir_response( attachment=document_details, custodian=document_reference.current_gp_ods, snomed_code_doc_type=SnomedCodes.find_by_code( - document_reference.document_snomed_code_type, + document_reference.document_snomed_code_type ), ) .create_fhir_document_reference_object(document_reference) .model_dump(exclude_none=True) ) return fhir_document_reference - - def get_paginated_references_by_nhs_number( - self, - nhs_number: str, - limit: int | None = None, - next_page_token: str | None = None, - filter: dict | None = None, - api_request_context: dict = {}, - return_fhir: bool = False, - ): - - filter_expression, condition_attribute_names, condition_attribute_values = ( - self._build_pagination_filter(filter) - ) - - common_name = validate_common_name_in_mtls( - api_request_context=api_request_context, - ) - - references, next_page_token = self.query_table_with_paginator( - table_name=self._get_table_name(common_name), - index_name="NhsNumberIndex", - search_key="NhsNumber", - search_condition=nhs_number, - limit=limit, - start_key=next_page_token, - filter_expression=filter_expression, - expression_attribute_names=condition_attribute_names, - expression_attribute_values=condition_attribute_values, - ) - - logger.info("Validating upload status") - self._validate_upload_status(references) - - document_references = self._process_documents( - references, - return_fhir=return_fhir, - ) - - return { - "references": document_references, - "next_page_token": next_page_token, - } - - def _build_pagination_filter( - self, - filter_values: dict[str, str] | None, - ) -> tuple[str, dict, dict]: - logger.info("Creating filter for pagination") - conditions = [ - { - "field": DocumentReferenceMetadataFields.DELETED.value, - "operator": ConditionOperator.EQUAL.value, - "value": "", - }, - { - "field": DocumentReferenceMetadataFields.DELETED.value, - "operator": "attribute_not_exists", - }, - ] - - query_filter, condition_attribute_names, condition_attribute_values = ( - build_mixed_condition_expression(conditions=conditions, join_operator="OR") - ) - - if filter_values: - logger.info("Adding additional filters for pagination") - additional_conditions = [] - for filter_key, filter_value in filter_values.items(): - if filter_key == "custodian": - additional_conditions.append( - { - "field": DocumentReferenceMetadataFields.CUSTODIAN.value, - "operator": ConditionOperator.EQUAL.value, - "value": filter_value, - }, - ) - elif filter_key == "document_snomed_code": - additional_conditions.append( - { - "field": DocumentReferenceMetadataFields.DOCUMENT_SNOMED_CODE_TYPE.value, - "operator": ConditionOperator.EQUAL.value, - "value": filter_value, - }, - ) - elif filter_key == "doc_status": - additional_conditions.append( - { - "field": DocumentReferenceMetadataFields.DOC_STATUS.value, - "operator": ConditionOperator.EQUAL.value, - "value": filter_value, - }, - ) - - ( - additional_filter, - additional_condition_attribute_names, - additional_condition_attribute_values, - ) = build_mixed_condition_expression(conditions=additional_conditions) - condition_attribute_names.update(additional_condition_attribute_names) - condition_attribute_values.update(additional_condition_attribute_values) - - return ( - f"({query_filter}) AND " + additional_filter, - condition_attribute_names, - condition_attribute_values, - ) - - return query_filter, condition_attribute_names, condition_attribute_values diff --git a/lambdas/services/document_review_processor_service.py b/lambdas/services/document_review_processor_service.py index f39e555fc5..a16cdf413c 100644 --- a/lambdas/services/document_review_processor_service.py +++ b/lambdas/services/document_review_processor_service.py @@ -43,10 +43,7 @@ def process_review_message(self, review_message: ReviewMessageBody) -> None: review_files = self._move_files_to_review_bucket(review_message, review_id) custodian = self._get_patient_custodian(review_message) document_upload_review = self._build_review_record( - review_message, - review_id, - review_files, - custodian, + review_message, review_id, review_files, custodian ) try: self.document_review_service.create_dynamo_entry(document_upload_review) @@ -67,13 +64,13 @@ def _get_patient_custodian(self, review_message: ReviewMessageBody) -> str: or review_message.nhs_number == NHS_NUMBER_PLACEHOLDER ): logger.info( - "No valid NHS number found in message. Using uploader ODS as custodian", + "No valid NHS number found in message. Using uploader ODS as custodian" ) return review_message.uploader_ods validate_nhs_number(review_message.nhs_number) pds_service = get_pds_service() patient_details = pds_service.fetch_patient_details( - review_message.nhs_number, + review_message.nhs_number ) return patient_details.general_practice_ods except PdsErrorException: @@ -85,7 +82,7 @@ def _get_patient_custodian(self, review_message: ReviewMessageBody) -> str: InvalidNhsNumberException, ): logger.info( - "Patient not found in PDS. Using uploader ODS as custodian, and nhs number placeholder", + "Patient not found in PDS. Using uploader ODS as custodian, and nhs number placeholder" ) review_message.nhs_number = NHS_NUMBER_PLACEHOLDER return review_message.uploader_ods @@ -109,9 +106,7 @@ def _build_review_record( ) def _move_files_to_review_bucket( - self, - message_data: ReviewMessageBody, - review_record_id: str, + self, message_data: ReviewMessageBody, review_record_id: str ) -> list[DocumentReviewFileDetails]: new_file_keys: list[DocumentReviewFileDetails] = [] @@ -120,7 +115,7 @@ def _move_files_to_review_bucket( new_file_key = f"{review_record_id}/{object_key}" logger.info( - f"Copying file from ({file.file_path}) in staging to review bucket: {new_file_key}", + f"Copying file from ({file.file_path}) in staging to review bucket: {new_file_key}" ) try: @@ -143,8 +138,8 @@ def _move_files_to_review_bucket( new_file_keys.append( DocumentReviewFileDetails( file_name=file.file_name, - file_location=f"{self.s3_service.S3_PREFIX}{self.review_bucket_name}/{new_file_key}", - ), + file_location=new_file_key, + ) ) return new_file_keys @@ -153,8 +148,7 @@ def _delete_files_from_staging(self, message_data: ReviewMessageBody) -> None: try: logger.info(f"Deleting file from staging bucket: {file.file_path}") self.s3_service.delete_object( - s3_bucket_name=self.staging_bucket_name, - file_key=file.file_path, + s3_bucket_name=self.staging_bucket_name, file_key=file.file_path ) except Exception as e: logger.error(f"Error deleting files from staging: {str(e)}") diff --git a/lambdas/services/document_upload_review_service.py b/lambdas/services/document_upload_review_service.py index 38c0d00090..cbbd5478ec 100644 --- a/lambdas/services/document_upload_review_service.py +++ b/lambdas/services/document_upload_review_service.py @@ -4,7 +4,7 @@ from boto3.dynamodb.conditions import Attr, ConditionBase from botocore.exceptions import ClientError from enums.document_review_status import DocumentReviewStatus -from enums.dynamo_filter import AttributeOperator, ConditionOperator +from enums.dynamo_filter import AttributeOperator from enums.lambda_error import ErrorMessage from enums.metadata_field_names import DocumentReferenceMetadataFields from models.document_review import DocumentUploadReviewReference @@ -55,8 +55,7 @@ def query_docs_pending_review_with_paginator( filter_expression, condition_attribute_names, condition_attribute_values = ( self.build_paginator_query_filter( - nhs_number=nhs_number, - uploader=uploader, + nhs_number=nhs_number, uploader=uploader ) ) references, last_evaluated_key = self.query_table_with_paginator( @@ -77,8 +76,7 @@ def query_docs_pending_review_with_paginator( raise DocumentReviewException(ErrorMessage.FAILED_TO_QUERY_DYNAMO) def _validate_review_references( - self, - items: list[dict], + self, items: list[dict] ) -> list[DocumentUploadReviewReference]: try: logger.info("Validating document review search response") @@ -91,48 +89,42 @@ def _validate_review_references( raise DocumentReviewException(ErrorMessage.FAILED_TO_VALIDATE.value) def build_paginator_query_filter( - self, - nhs_number: str | None = None, - uploader: str | None = None, + self, nhs_number: str | None = None, uploader: str | None = None ): conditions = [ { "field": "ReviewStatus", - "operator": ConditionOperator.EQUAL.value, + "operator": "=", "value": DocumentReviewStatus.PENDING_REVIEW.value, - }, + } ] if nhs_number: conditions.append( { "field": "NhsNumber", - "operator": ConditionOperator.EQUAL.value, + "operator": "=", "value": nhs_number, - }, + } ) if uploader: conditions.append( { "field": "Author", - "operator": ConditionOperator.EQUAL.value, + "operator": "=", "value": uploader, - }, + } ) return build_mixed_condition_expression(conditions) def get_document( - self, - document_id: str, - version: int | None, + self, document_id: str, version: int | None ) -> DocumentUploadReviewReference | None: try: sort_key = {"Version": version} response = self.get_item( - table_name=self.table_name, - document_id=document_id, - sort_key=sort_key, + table_name=self.table_name, document_id=document_id, sort_key=sort_key ) return response @@ -153,7 +145,7 @@ def update_document_review_custodian( for review in patient_documents: if review.custodian == updated_ods_code: logger.info( - f"Custodian {updated_ods_code} already assigned to review ID: {review.id}", + f"Custodian {updated_ods_code} already assigned to review ID: {review.id}" ) continue @@ -168,15 +160,11 @@ def update_document_review_custodian( if review.review_status == DocumentReviewStatus.PENDING_REVIEW: self._handle_pending_review_custodian_update( - review, - updated_ods_code, - review_update_field, + review, updated_ods_code, review_update_field ) else: self._handle_standard_custodian_update( - review, - updated_ods_code, - review_update_field, + review, updated_ods_code, review_update_field ) except (ClientError, DocumentReviewException) as e: @@ -245,9 +233,7 @@ def get_document_review_by_id(self, document_id: str, document_version: int): return self.get_item(document_id, {"Version": document_version}) def update_pending_review_status( - self, - review_update: DocumentUploadReviewReference, - field_names: set[str], + self, review_update: DocumentUploadReviewReference, field_names: set[str] ) -> None: self.update_review_document_with_status_filter( review_update, @@ -267,9 +253,7 @@ def update_review_document_with_status_filter( & Attr("ReviewStatus").eq(status) ) self.update_document_review_for_patient( - review_update, - field_names, - condition_expression, + review_update, field_names, condition_expression ) def update_document_review_for_patient( @@ -302,10 +286,7 @@ def update_document_review_for_patient( raise DocumentReviewException(ErrorMessage.FAILED_TO_UPDATE_DYNAMO) def update_document_review_with_transaction( - self, - new_review_item, - existing_review_item, - additional_update_fields=None, + self, new_review_item, existing_review_item, additional_update_fields=None ): transact_items = [] try: @@ -314,9 +295,7 @@ def update_document_review_with_transaction( action="Update", key={"ID": new_review_item.id, "Version": new_review_item.version}, update_fields=new_review_item.model_dump( - exclude_none=True, - by_alias=True, - exclude={"version", "id"}, + exclude_none=True, by_alias=True, exclude={"version", "id"} ), conditions=[{"field": "ID", "operator": "attribute_not_exists"}], ) @@ -337,9 +316,7 @@ def update_document_review_with_transaction( "Version": existing_review_item.version, }, update_fields=existing_review_item.model_dump( - exclude_none=True, - by_alias=True, - include=existing_update_fields, + exclude_none=True, by_alias=True, include=existing_update_fields ), conditions=[ { @@ -379,20 +356,18 @@ def update_document_review_with_transaction( return response def delete_document_review_files( - self, - document_review: DocumentUploadReviewReference, + self, document_review: DocumentUploadReviewReference ): for file in document_review.files: location_without_prefix = file.file_location.replace( - self.s3_service.S3_PREFIX, - "", + self.s3_service.S3_PREFIX, "" ) bucket, file_key = location_without_prefix.split("/", 1) try: self.s3_service.delete_object(bucket, file_key) except ClientError as e: logger.warning( - f"Unable to delete file {file.file_name} from S3 due to error: {e}", + f"Unable to delete file {file.file_name} from S3 due to error: {e}" ) logger.warning(f"Skipping file deletion for {file.file_name}") continue @@ -406,16 +381,12 @@ def build_review_dynamo_filter( filter_builder = DynamoQueryFilterBuilder() if status: filter_builder.add_condition( - "ReviewStatus", - AttributeOperator.EQUAL, - status, + "ReviewStatus", AttributeOperator.EQUAL, status ) if nhs_number: filter_builder.add_condition( - "NhsNumber", - AttributeOperator.EQUAL, - nhs_number, + "NhsNumber", AttributeOperator.EQUAL, nhs_number ) if uploader: diff --git a/lambdas/services/get_document_upload_status.py b/lambdas/services/get_document_upload_status.py index 734671a3ec..113b08908b 100644 --- a/lambdas/services/get_document_upload_status.py +++ b/lambdas/services/get_document_upload_status.py @@ -24,16 +24,12 @@ def _determine_document_status(self, doc_ref, nhs_number): if doc_ref.doc_status == "cancelled": if doc_ref.virus_scanner_result == VirusScanResult.INFECTED: return DocumentStatus.INFECTED.display, DocumentStatus.INFECTED.code - if doc_ref.virus_scanner_result == VirusScanResult.INVALID: - return DocumentStatus.INVALID.display, DocumentStatus.INVALID.code return DocumentStatus.CANCELLED.display, DocumentStatus.CANCELLED.code return doc_ref.doc_status, None def get_document_references_by_id( - self, - nhs_number: str, - document_ids: list[str], + self, nhs_number: str, document_ids: list[str] ) -> dict: """ Checks the status of a list of documents for a given patient. @@ -46,8 +42,7 @@ def get_document_references_by_id( A dictionary with a list of document IDs and their corresponding statuses. """ found_docs = self.document_service.get_batch_document_references_by_id( - document_ids, - SupportedDocumentTypes.LG, + document_ids, SupportedDocumentTypes.LG ) found_docs_by_id = {doc.id: doc for doc in found_docs} results = {} diff --git a/lambdas/services/pdf_stitch_service.py b/lambdas/services/pdf_stitch_service.py new file mode 100755 index 0000000000..d08a20d1ab --- /dev/null +++ b/lambdas/services/pdf_stitch_service.py @@ -0,0 +1,34 @@ +import os +from uuid import uuid4 + +from pypdf import PdfReader, PdfWriter +from utils.audit_logging_setup import LoggingService + +logger = LoggingService(__name__) + + +def stitch_pdf(filenames: list[str], temp_folder: str = "/tmp/") -> str: + """ + Given a list of local PDF files, stitch them into one file and return the local file path of a resulting file. + + Example usage: + filenames = ["file1.pdf", "file2.pdf", "file3.pdf"] + tmp_folder = "/tmp/" + stitch_pdf(filename, tmp_folder) + + Result: + "/tmp/(filename_of_stitched_file).pdf" + """ + merger = PdfWriter() + for filename in filenames: + merger.append(filename) + output_filename = os.path.join(temp_folder, f"{str(uuid4())}.pdf") + merger.write(output_filename) + return output_filename + + +def count_page_number(filename: str) -> int: + """ + Return the total number of pages in a PDF file + """ + return len(PdfReader(filename).pages) diff --git a/lambdas/services/upload_document_reference_service.py b/lambdas/services/upload_document_reference_service.py index 5917047d9a..685d2e1544 100644 --- a/lambdas/services/upload_document_reference_service.py +++ b/lambdas/services/upload_document_reference_service.py @@ -1,4 +1,3 @@ -import io import os from typing import Optional @@ -22,7 +21,6 @@ FileProcessingException, TransactionConflictException, ) -from utils.file_utils import check_file_locked_or_corrupt from utils.lambda_exceptions import InvalidDocTypeException from utils.s3_utils import DocTypeS3BucketRouter from utils.utilities import get_virus_scan_service @@ -44,9 +42,7 @@ def __init__(self): self.bucket_router = DocTypeS3BucketRouter() def handle_upload_document_reference_request( - self, - object_key: str, - object_size: int = 0, + self, object_key: str, object_size: int = 0 ): """Handle the upload document reference request with comprehensive error handling""" if not object_key: @@ -62,16 +58,13 @@ def handle_upload_document_reference_request( self._get_infrastructure_for_document_key(object_parts) preliminary_document_reference = self._fetch_preliminary_document_reference( - document_key, - nhs_number, + document_key, nhs_number ) if not preliminary_document_reference: return self._process_preliminary_document_reference( - preliminary_document_reference, - object_key, - object_size, + preliminary_document_reference, object_key, object_size ) except Exception as e: @@ -93,14 +86,12 @@ def _get_infrastructure_for_document_key(self, object_parts: list[str]) -> None: self.destination_bucket_name = self.bucket_router.resolve(doc_type) except KeyError: logger.error( - f"SNOMED code {doc_type.code} - {doc_type.display_name} is not supported", + f"SNOMED code {doc_type.code} - {doc_type.display_name} is not supported" ) raise InvalidDocTypeException(400, LambdaError.DocTypeDB) def _fetch_preliminary_document_reference( - self, - document_key: str, - nhs_number: str | None = None, + self, document_key: str, nhs_number: str | None = None ) -> Optional[DocumentReference]: """Fetch document reference from the database""" try: @@ -110,7 +101,7 @@ def _fetch_preliminary_document_reference( else: if not nhs_number: logger.error( - f"Failed to process object key with ID: {document_key}", + f"Failed to process object key with ID: {document_key}" ) raise FileProcessingException(400, LambdaError.DocRefInvalidFiles) @@ -126,24 +117,24 @@ def _fetch_preliminary_document_reference( if not documents: logger.error( - f"No document with the following key found in {self.table_name} table: {document_key}", + f"No document with the following key found in {self.table_name} table: {document_key}" ) logger.info("Skipping this object") return None if len(documents) > 1: logger.warning( - f"Multiple documents found for key {document_key}, using first one", + f"Multiple documents found for key {document_key}, using first one" ) return documents[0] except ClientError as e: logger.error( - f"Error fetching document reference for key {document_key}: {str(e)}", + f"Error fetching document reference for key {document_key}: {str(e)}" ) raise DocumentServiceException( - f"Failed to fetch document reference: {str(e)}", + f"Failed to fetch document reference: {str(e)}" ) def _process_preliminary_document_reference( @@ -155,37 +146,20 @@ def _process_preliminary_document_reference( """Process the preliminary (uploading) document reference with virus scanning and file operations""" try: virus_scan_result = self._perform_virus_scan( - preliminary_document_reference, - object_key, + preliminary_document_reference, object_key ) + preliminary_document_reference.virus_scanner_result = virus_scan_result if virus_scan_result == VirusScanResult.CLEAN: - is_file_protected = False - if getattr(preliminary_document_reference, "file_name", None): - file_type_extension = ( - preliminary_document_reference.file_name.split(".")[-1].lower() - ) - is_file_protected = self.is_file_invalid( - object_key, - file_type_extension, - ) - if is_file_protected: - logger.warning( - f"Document {preliminary_document_reference.id} is password protected or corrupt, " - f"marking as such in database", - ) - virus_scan_result = VirusScanResult.INVALID - else: - self._process_clean_document( - preliminary_document_reference, - object_key, - ) + self._process_clean_document( + preliminary_document_reference, + object_key, + ) else: logger.warning( - f"Document {preliminary_document_reference.id} failed virus scan", + f"Document {preliminary_document_reference.id} failed virus scan" ) - preliminary_document_reference.virus_scanner_result = virus_scan_result preliminary_document_reference.file_size = object_size preliminary_document_reference.uploaded = True preliminary_document_reference.uploading = False @@ -199,7 +173,7 @@ def _process_preliminary_document_reference( and self.doc_type.code != SnomedCodes.PATIENT_DATA.value.code ): self._finalize_and_supersede_with_transaction( - preliminary_document_reference, + preliminary_document_reference ) # Update NRL Pointer @@ -210,7 +184,7 @@ def _process_preliminary_document_reference( except Exception as e: logger.error( - f"Error processing document reference {preliminary_document_reference.id}: {str(e)}", + f"Error processing document reference {preliminary_document_reference.id}: {str(e)}" ) raise @@ -225,7 +199,7 @@ def _finalize_and_supersede_with_transaction(self, new_document: DocumentReferen """ try: logger.info( - f"Checking for existing final documents to supersede for NHS number {new_document.nhs_number}", + f"Checking for existing final documents to supersede for NHS number {new_document.nhs_number}" ) existing_docs: list[DocumentReference] = ( @@ -269,7 +243,7 @@ def _finalize_and_supersede_with_transaction(self, new_document: DocumentReferen # Supersede existing final documents if existing_docs: logger.info( - f"Superseding {len(existing_docs)} existing final document(s) for NHS number {new_document.nhs_number}", + f"Superseding {len(existing_docs)} existing final document(s) for NHS number {new_document.nhs_number}" ) for doc in existing_docs: @@ -323,85 +297,77 @@ def _finalize_and_supersede_with_transaction(self, new_document: DocumentReferen f" and superseded {len(existing_docs)} document(s)" if existing_docs else "" - ), + ) ) except ClientError as e: error_code = e.response.get("Error", {}).get("Code", "") if error_code == "TransactionCanceledException": logger.error( - f"Transaction cancelled - concurrent update detected for NHS number {new_document.nhs_number}", + f"Transaction cancelled - concurrent update detected for NHS number {new_document.nhs_number}" ) raise TransactionConflictException( f"Concurrent update detected while finalizing document for NHS number {new_document.nhs_number}. " - f"Another process may have already finalized a document for this patient.", + f"Another process may have already finalized a document for this patient." ) raise except Exception as e: if isinstance(e, TransactionConflictException): logger.error( - f"Cancelling preliminary document {new_document.id} due to transaction conflict", + f"Cancelling preliminary document {new_document.id} due to transaction conflict" ) else: logger.error( - f"Unexpected error while finalizing document for {new_document.nhs_number}: {e}", + f"Unexpected error while finalizing document for {new_document.nhs_number}: {e}" ) - + new_document.doc_status = "cancelled" new_document.uploaded = False new_document.uploading = False new_document.file_size = None self._update_dynamo_table(new_document) self.delete_file_from_bucket( - new_document.file_location, - new_document.s3_version_id, + new_document.file_location, new_document.s3_version_id ) def document_reference_key(self, document_id): return {DocumentReferenceMetadataFields.ID.value: document_id} def _perform_virus_scan( - self, - document_reference: DocumentReference, - object_key: str, + self, document_reference: DocumentReference, object_key: str ) -> VirusScanResult: """Perform a virus scan on the document""" try: return self.virus_scan_service.scan_file( - object_key, - nhs_number=document_reference.nhs_number, + object_key, nhs_number=document_reference.nhs_number ) except Exception as e: logger.error( - f"Virus scan failed for document {document_reference.id}: {str(e)}", + f"Virus scan failed for document {document_reference.id}: {str(e)}" ) return VirusScanResult.ERROR def _process_clean_document( - self, - document_reference: DocumentReference, - object_key: str, + self, document_reference: DocumentReference, object_key: str ): """Process a document that passed virus scanning""" try: self.copy_files_from_staging_bucket(document_reference, object_key) - + logger.info( - f"Successfully processed clean document: {document_reference.id}", + f"Successfully processed clean document: {document_reference.id}" ) except Exception as e: logger.error( - f"Error processing clean document {document_reference.id}: {str(e)}", + f"Error processing clean document {document_reference.id}: {str(e)}" ) document_reference.doc_status = "cancelled" raise FileProcessingException(f"Failed to process clean document: {str(e)}") def copy_files_from_staging_bucket( - self, - document_reference: DocumentReference, - source_file_key: str, + self, document_reference: DocumentReference, source_file_key: str ): """Copy files from staging bucket to destination bucket""" try: @@ -423,8 +389,7 @@ def copy_files_from_staging_bucket( ) document_reference.s3_bucket_name = self.destination_bucket_name document_reference.file_location = document_reference._build_s3_location( - self.destination_bucket_name, - dest_file_key, + self.destination_bucket_name, dest_file_key ) document_reference.s3_version_id = copy_result.get("VersionId") return copy_result @@ -432,7 +397,7 @@ def copy_files_from_staging_bucket( except ClientError as e: logger.error(f"Error copying files from staging bucket: {str(e)}") raise FileProcessingException( - f"Failed to copy file from staging bucket: {str(e)}", + f"Failed to copy file from staging bucket: {str(e)}" ) def delete_file_from_staging_bucket(self, source_file_key: str): @@ -448,10 +413,10 @@ def delete_file_from_bucket(self, file_location: str, version_id: str): """Delete file from bucket""" try: s3_bucket_name, source_file_key = DocumentReference._parse_s3_location( - file_location, + file_location ) logger.info( - f"Deleting file from bucket: {s3_bucket_name}/{source_file_key}", + f"Deleting file from bucket: {s3_bucket_name}/{source_file_key}" ) self.s3_service.delete_object(s3_bucket_name, source_file_key, version_id) @@ -492,13 +457,5 @@ def _update_dynamo_table( except ClientError as e: logger.error(f"Error updating DynamoDB table: {str(e)}") raise DocumentServiceException( - f"Failed to update document in database: {str(e)}", + f"Failed to update document in database: {str(e)}" ) - - def is_file_invalid(self, object_key: str, file_type_extension: str) -> bool: - entire_object = self.s3_service.get_object_stream( - self.staging_s3_bucket_name, - object_key, - ) - file_stream = io.BytesIO(entire_object.read()) - return check_file_locked_or_corrupt(file_stream, file_type_extension) diff --git a/lambdas/tests/e2e/api/fhir/test_retrieve_document_fhir_api_failure.py b/lambdas/tests/e2e/api/fhir/test_retrieve_document_fhir_api_failure.py index e1cfebe33a..0640a412bc 100644 --- a/lambdas/tests/e2e/api/fhir/test_retrieve_document_fhir_api_failure.py +++ b/lambdas/tests/e2e/api/fhir/test_retrieve_document_fhir_api_failure.py @@ -1,5 +1,5 @@ -import uuid from datetime import datetime, timezone +import uuid import pytest from enums.document_retention import DocumentRetentionDays @@ -20,13 +20,11 @@ def _assert_operation_outcome(body, code): @pytest.mark.parametrize( "doc_status, response_status", [ - ("deprecated", 404), + ("deprecated", 200), # TODO Fix in NDR-363, this should return a 404 ], ) def test_retrieval_of_deleted_document_reference( - test_data, - doc_status, - response_status, + test_data, doc_status, response_status ): deletion_date = datetime.now(timezone.utc) document_ttl_days = DocumentRetentionDays.SOFT_DELETE @@ -35,7 +33,7 @@ def test_retrieval_of_deleted_document_reference( pdm_record = create_and_store_pdm_record( test_data, doc_status=doc_status, - Deleted=deletion_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), + deleted=deletion_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), ttl=document_reference_ttl, ) @@ -43,7 +41,7 @@ def test_retrieval_of_deleted_document_reference( assert response.status_code == response_status response_json = response.json() - _assert_operation_outcome(body=response_json, code="RESOURCE_NOT_FOUND") + assert response_json.get("docStatus") == doc_status @pytest.mark.parametrize( @@ -53,10 +51,7 @@ def test_retrieval_of_deleted_document_reference( ], ) def test_retrieve_non_existant_document_reference( - record_id, - expected_status, - expected_code, - expected_diagnostics, + record_id, expected_status, expected_code, expected_diagnostics ): response = get_pdm_document_reference(record_id) assert response.status_code == expected_status @@ -78,9 +73,7 @@ def test_forbidden_with_invalid_cert(test_data, temp_cert_and_key): cert_path, key_path = temp_cert_and_key response = get_pdm_document_reference( - pdm_record["id"], - client_cert_path=cert_path, - client_key_path=key_path, + pdm_record["id"], client_cert_path=cert_path, client_key_path=key_path ) body = response.json() @@ -110,10 +103,7 @@ def test_retrieve_invalid_resource_type(test_data): ], ) def test_incorrectly_formatted_path_param_id( - test_data, - param, - expected_status, - expected_code, + test_data, param, expected_status, expected_code ): response = get_pdm_document_reference( endpoint_override=param, diff --git a/lambdas/tests/e2e/api/fhir/test_search_patient_fhir_api.py b/lambdas/tests/e2e/api/fhir/test_search_patient_fhir_api.py index 92783b115c..b2022432e9 100644 --- a/lambdas/tests/e2e/api/fhir/test_search_patient_fhir_api.py +++ b/lambdas/tests/e2e/api/fhir/test_search_patient_fhir_api.py @@ -1,7 +1,4 @@ -from datetime import datetime, timezone - import pytest -from enums.document_retention import DocumentRetentionDays from tests.e2e.api.fhir.conftest import ( MTLS_ENDPOINT, PDM_SNOMED, @@ -111,10 +108,7 @@ def test_multiple_cancelled_search_patient_details(test_data): ], ) def test_search_edge_cases( - nhs_number, - expected_status, - expected_code, - expected_diagnostics, + nhs_number, expected_status, expected_code, expected_diagnostics ): response = search_document_reference(nhs_number) assert response.status_code == expected_status @@ -135,9 +129,7 @@ def test_search_patient_unauthorized_mtls(test_data, temp_cert_and_key): cert_path, key_path = temp_cert_and_key response = search_document_reference( - "9912003071", - client_cert_path=cert_path, - client_key_path=key_path, + "9912003071", client_cert_path=cert_path, client_key_path=key_path ) body = response.json() @@ -150,49 +142,3 @@ def test_search_invalid_resource_type(test_data): response = search_document_reference("9912003071", resource_type="FooBar") assert response.status_code == 400 - - -def test_search_patient_details_deleted_are_not_returned(test_data): - created_record_1 = create_and_store_pdm_record(test_data) - expected_record_id_1 = created_record_1["id"] - - deletion_date = datetime.now(timezone.utc) - document_ttl_days = DocumentRetentionDays.SOFT_DELETE - ttl_seconds = document_ttl_days * 24 * 60 * 60 - document_reference_ttl = int(deletion_date.timestamp() + ttl_seconds) - created_record_2 = create_and_store_pdm_record( - test_data, - doc_status="deprecated", - Deleted=deletion_date.strftime("%Y-%m-%dT%H:%M:%S.%fZ"), - ttl=document_reference_ttl, - ) - expected_record_id_2 = created_record_2["id"] - - response = search_document_reference("9912003071") - assert response.status_code == 200 - - bundle = response.json() - assert bundle["total"] < 2 - entries = bundle.get("entry", []) - assert entries - - # Find the entry with the matching record_id - matching_entry = next( - ( - e - for e in entries - if e["resource"].get("id") == f"{PDM_SNOMED}~{expected_record_id_1}" - ), - None, - ) - assert matching_entry - # Assert deleted item doesn't exist - non_matching_entry = next( - ( - e - for e in entries - if e["resource"].get("id") == f"{PDM_SNOMED}~{expected_record_id_2}" - ), - None, - ) - assert non_matching_entry is None diff --git a/lambdas/tests/e2e/api/test_search_patient_api.py b/lambdas/tests/e2e/api/test_search_patient_api.py index 2a28349c66..ad7c7c79f6 100644 --- a/lambdas/tests/e2e/api/test_search_patient_api.py +++ b/lambdas/tests/e2e/api/test_search_patient_api.py @@ -43,7 +43,7 @@ def test_search_patient_details(test_data, snapshot_json): "entry.0.resource.date", "entry.0.resource.content.0.attachment.url", "timestamp", - ), + ) ) @@ -81,17 +81,13 @@ def test_multiple_cancelled_search_patient_details(test_data, snapshot_json): assert bundle["entry"][0] == snapshot_json( exclude=paths( - "resource.id", - "resource.date", - "resource.content.0.attachment.url", - ), + "resource.id", "resource.date", "resource.content.0.attachment.url" + ) ) assert bundle["entry"][1] == snapshot_json( exclude=paths( - "resource.id", - "resource.date", - "resource.content.0.attachment.url", - ), + "resource.id", "resource.date", "resource.content.0.attachment.url" + ) ) @@ -114,7 +110,7 @@ def test_no_records(snapshot_json): "entry.0.resource.date", "entry.0.resource.content.0.attachment.url", "timestamp", - ), + ) ) @@ -132,70 +128,3 @@ def test_invalid_patient(snapshot_json): bundle = response.json() assert bundle == snapshot_json - - -def test_search_patient_details_deleted_are_not_returned(test_data): - lloyd_george_record = {} - test_data.append(lloyd_george_record) - - lloyd_george_record["id"] = str(uuid.uuid4()) - lloyd_george_record["nhs_number"] = "9449305943" - lloyd_george_record["data"] = io.BytesIO(b"Sample PDF Content") - - data_helper.create_metadata(lloyd_george_record) - data_helper.create_resource(lloyd_george_record) - - second_lloyd_george_record = {} - test_data.append(second_lloyd_george_record) - - second_lloyd_george_record["id"] = str(uuid.uuid4()) - second_lloyd_george_record["nhs_number"] = "9449305943" - second_lloyd_george_record["data"] = io.BytesIO(b"Sample PDF Content") - - data_helper.create_metadata(second_lloyd_george_record) - data_helper.create_resource(second_lloyd_george_record) - - url = f"https://{API_ENDPOINT}/FhirDocumentReference?subject:identifier=https://fhir.nhs.uk/Id/nhs-number|{lloyd_george_record['nhs_number']}&_id={second_lloyd_george_record['id']}" - headers = { - "Authorization": "Bearer 123", - "X-Api-Key": API_KEY, - "X-Correlation-Id": "1234", - } - - delete_response = requests.request("DELETE", url, headers=headers) - assert delete_response.status_code == 204 - - url = f"https://{API_ENDPOINT}/FhirDocumentReference?subject:identifier=https://fhir.nhs.uk/Id/nhs-number|{lloyd_george_record['nhs_number']}" - headers = { - "Authorization": "Bearer 123", - "X-Api-Key": API_KEY, - "X-Correlation-Id": "1234", - } - response = requests.request("GET", url, headers=headers) - bundle = response.json() - assert bundle["total"] < 2 - entries = bundle.get("entry", []) - assert entries - - # Find the entry with the matching record_id - matching_entry = next( - ( - e - for e in entries - if e["resource"].get("id") - == f"{LLOYD_GEORGE_SNOMED}~{lloyd_george_record['id']}" - ), - None, - ) - assert matching_entry - # Assert deleted item doesn't exist - non_matching_entry = next( - ( - e - for e in entries - if e["resource"].get("id") - == f"{LLOYD_GEORGE_SNOMED}~{second_lloyd_george_record['id']}" - ), - None, - ) - assert non_matching_entry is None diff --git a/lambdas/tests/unit/conftest.py b/lambdas/tests/unit/conftest.py index dbd9e699d8..b3afba0f82 100644 --- a/lambdas/tests/unit/conftest.py +++ b/lambdas/tests/unit/conftest.py @@ -18,7 +18,6 @@ REGION_NAME = "eu-west-2" -S3_PREFIX = "s3://" MOCK_TABLE_NAME = "test-table" MOCK_BUCKET = "test-s3-bucket" MOCK_CLOUDFRONT_URL = "test-cloudfront-url.com" @@ -85,7 +84,6 @@ TEST_UUID = "1234-4567-8912-HSDF-TEST" TEST_FILE_KEY = "test_file_key" TEST_FILE_NAME = "test.pdf" -TEST_FILE_SIZE = 24000 TEST_VIRUS_SCANNER_RESULT = "not_scanned" TEST_DOCUMENT_LOCATION = f"s3://{MOCK_BUCKET}/{TEST_FILE_KEY}" TEST_CURRENT_GP_ODS = "Y12345" @@ -156,8 +154,7 @@ def set_env(monkeypatch): monkeypatch.setenv(MOCK_PDM_TABLE_NAME_ENV_NAME, MOCK_PDM_TABLE_NAME) monkeypatch.setenv(MOCK_PDM_BUCKET_ENV_NAME, MOCK_PDM_BUCKET) monkeypatch.setenv( - "DYNAMODB_TABLE_LIST", - json.dumps([MOCK_PDM_TABLE_NAME, MOCK_LG_TABLE_NAME]), + "DYNAMODB_TABLE_LIST", json.dumps([MOCK_PDM_TABLE_NAME, MOCK_LG_TABLE_NAME]) ) monkeypatch.setenv(MOCK_ZIP_OUTPUT_BUCKET_ENV_NAME, MOCK_ZIP_OUTPUT_BUCKET) monkeypatch.setenv(MOCK_ZIP_TRACE_TABLE_ENV_NAME, MOCK_ZIP_TRACE_TABLE) @@ -179,43 +176,34 @@ def set_env(monkeypatch): monkeypatch.setenv(MOCK_OIDC_CLIENT_SECRET_ENV_NAME, OIDC_CLIENT_SECRET) monkeypatch.setenv(MOCK_JWT_PUBLIC_KEY_NAME, JWT_PUBLIC_KEY) monkeypatch.setenv( - SSM_PARAM_JWT_TOKEN_PUBLIC_KEY_ENV_NAME, - SSM_PARAM_JWT_TOKEN_PUBLIC_KEY, + SSM_PARAM_JWT_TOKEN_PUBLIC_KEY_ENV_NAME, SSM_PARAM_JWT_TOKEN_PUBLIC_KEY ) monkeypatch.setenv(MOCK_AUTH_DYNAMODB_NAME, "test_dynamo") monkeypatch.setenv(MOCK_FEEDBACK_SENDER_EMAIL_ENV_NAME, MOCK_FEEDBACK_SENDER_EMAIL) monkeypatch.setenv( - MOCK_FEEDBACK_EMAIL_SUBJECT_ENV_NAME, - MOCK_FEEDBACK_EMAIL_SUBJECT, + MOCK_FEEDBACK_EMAIL_SUBJECT_ENV_NAME, MOCK_FEEDBACK_EMAIL_SUBJECT ) monkeypatch.setenv( - MOCK_EMAIL_RECIPIENT_SSM_PARAM_KEY_ENV_NAME, - MOCK_EMAIL_RECIPIENT_SSM_PARAM_KEY, + MOCK_EMAIL_RECIPIENT_SSM_PARAM_KEY_ENV_NAME, MOCK_EMAIL_RECIPIENT_SSM_PARAM_KEY ) monkeypatch.setenv( - MOCK_APPCONFIG_APPLICATION_ENV_NAME, - MOCK_APPCONFIG_APPLICATION_ID, + MOCK_APPCONFIG_APPLICATION_ENV_NAME, MOCK_APPCONFIG_APPLICATION_ID ) monkeypatch.setenv( - MOCK_APPCONFIG_ENVIRONMENT_ENV_NAME, - MOCK_APPCONFIG_ENVIRONMENT_ID, + MOCK_APPCONFIG_ENVIRONMENT_ENV_NAME, MOCK_APPCONFIG_ENVIRONMENT_ID ) monkeypatch.setenv( - MOCK_APPCONFIG_CONFIGURATION_ENV_NAME, - MOCK_APPCONFIG_CONFIGURATION_ID, + MOCK_APPCONFIG_CONFIGURATION_ENV_NAME, MOCK_APPCONFIG_CONFIGURATION_ID ) monkeypatch.setenv( - MOCK_PRESIGNED_URL_ROLE_ARN_KEY, - MOCK_PRESIGNED_URL_ROLE_ARN_VALUE, + MOCK_PRESIGNED_URL_ROLE_ARN_KEY, MOCK_PRESIGNED_URL_ROLE_ARN_VALUE ) monkeypatch.setenv(MOCK_STATISTICS_TABLE_NAME, MOCK_STATISTICS_TABLE) monkeypatch.setenv( - MOCK_STATISTICAL_REPORTS_BUCKET_ENV_NAME, - MOCK_STATISTICS_REPORT_BUCKET_NAME, + MOCK_STATISTICAL_REPORTS_BUCKET_ENV_NAME, MOCK_STATISTICS_REPORT_BUCKET_NAME ) monkeypatch.setenv( - "STITCH_METADATA_DYNAMODB_NAME", - STITCH_METADATA_DYNAMODB_NAME_VALUE, + "STITCH_METADATA_DYNAMODB_NAME", STITCH_METADATA_DYNAMODB_NAME_VALUE ) monkeypatch.setenv("NRL_API_ENDPOINT", FAKE_URL) monkeypatch.setenv("ACCESS_AUDIT_TABLE_NAME", AUTH_STATE_TABLE_NAME) @@ -226,12 +214,10 @@ def set_env(monkeypatch): monkeypatch.setenv("APIM_API_URL", APIM_API_URL) monkeypatch.setenv("CLOUDFRONT_URL", "mock-cloudfront-url.com") monkeypatch.setenv( - "UNSTITCHED_LLOYD_GEORGE_DYNAMODB_NAME", - MOCK_UNSTITCHED_LG_TABLE_NAME, + "UNSTITCHED_LLOYD_GEORGE_DYNAMODB_NAME", MOCK_UNSTITCHED_LG_TABLE_NAME ) monkeypatch.setenv( - "DOCUMENT_RETRIEVE_ENDPOINT_APIM", - f"{APIM_API_URL}/DocumentReference", + "DOCUMENT_RETRIEVE_ENDPOINT_APIM", f"{APIM_API_URL}/DocumentReference" ) monkeypatch.setenv("VIRUS_SCAN_STUB", "True") monkeypatch.setenv("ITOC_TESTING_SLACK_BOT_TOKEN", MOCK_SLACK_BOT_TOKEN) @@ -363,8 +349,7 @@ class MockError(Enum): MOCK_CLIENT_ERROR = ClientError( - {"Error": {"Code": 500, "Message": "Test error message"}}, - "TEST", + {"Error": {"Code": 500, "Message": "Test error message"}}, "TEST" ) diff --git a/lambdas/tests/unit/handlers/test_document_reference_search_handler.py b/lambdas/tests/unit/handlers/test_document_reference_search_handler.py index a4d4768e09..4b6523dad2 100755 --- a/lambdas/tests/unit/handlers/test_document_reference_search_handler.py +++ b/lambdas/tests/unit/handlers/test_document_reference_search_handler.py @@ -1,15 +1,9 @@ import json -from copy import deepcopy from enum import Enum import pytest from enums.feature_flags import FeatureFlags -from enums.snomed_codes import SnomedCodes -from handlers.document_reference_search_handler import ( - extract_querystring_params, - lambda_handler, -) -from tests.unit.conftest import TEST_NHS_NUMBER +from handlers.document_reference_search_handler import lambda_handler from tests.unit.helpers.data.dynamo.dynamo_responses import EXPECTED_RESPONSE from utils.lambda_exceptions import DocumentRefSearchException from utils.lambda_response import ApiGatewayResponse @@ -26,35 +20,36 @@ class MockError(Enum): @pytest.fixture def mocked_service(set_env, mocker): mocked_class = mocker.patch( - "handlers.document_reference_search_handler.DocumentReferenceSearchService", + "handlers.document_reference_search_handler.DocumentReferenceSearchService" + ) + mocker.patch( + "handlers.document_reference_search_handler.FeatureFlagService.get_feature_flags_by_flag" ) mocked_service = mocked_class.return_value yield mocked_service -@pytest.fixture -def mocked_feature_flags(mocker): - feature_flag_service = mocker.patch( - "handlers.document_reference_search_handler.FeatureFlagService", - ) - yield feature_flag_service.return_value +def test_lambda_handler_returns_200( + mocked_service, valid_id_event_without_auth_header, context +): + mocked_service.get_document_references.return_value = EXPECTED_RESPONSE * 2 + expected = ApiGatewayResponse( + 200, json.dumps(EXPECTED_RESPONSE * 2), "GET" + ).create_api_gateway_response() -def test_lambda_handler_returns_200( - mocked_service, - valid_id_event_without_auth_header, - context, - mocked_feature_flags, + actual = lambda_handler(valid_id_event_without_auth_header, context) + + assert expected == actual + + +def test_lambda_handler_returns_204( + mocked_service, valid_id_event_without_auth_header, context ): - mocked_service.get_paginated_references_by_nhs_number.return_value = { - "references": EXPECTED_RESPONSE * 2, - "next_page_token": None, - } + mocked_service.get_document_references.return_value = [] expected = ApiGatewayResponse( - 200, - json.dumps({"references": EXPECTED_RESPONSE * 2, "nextPageToken": None}), - "GET", + 204, json.dumps([]), "GET" ).create_api_gateway_response() actual = lambda_handler(valid_id_event_without_auth_header, context) @@ -63,13 +58,10 @@ def test_lambda_handler_returns_200( def test_lambda_handler_raises_exception_returns_500( - mocked_service, - valid_id_event_without_auth_header, - context, - mocked_feature_flags, + mocked_service, valid_id_event_without_auth_header, context ): - mocked_service.get_paginated_references_by_nhs_number.side_effect = ( - DocumentRefSearchException(500, MockError.Error) + mocked_service.get_document_references.side_effect = DocumentRefSearchException( + 500, MockError.Error ) expected = ApiGatewayResponse( 500, @@ -81,60 +73,48 @@ def test_lambda_handler_raises_exception_returns_500( def test_lambda_handler_when_id_not_valid_returns_400( - set_env, - invalid_id_event, - context, - mocked_feature_flags, + set_env, invalid_id_event, context ): expected_body = json.dumps( { "message": "Invalid patient number 900000000900", "err_code": "PN_4001", "interaction_id": "88888888-4444-4444-4444-121212121212", - }, + } ) expected = ApiGatewayResponse( - 400, - expected_body, - "GET", + 400, expected_body, "GET" ).create_api_gateway_response() actual = lambda_handler(invalid_id_event, context) assert expected == actual def test_lambda_handler_when_id_not_supplied_returns_400( - set_env, - missing_id_event, - context, - mocked_feature_flags, + set_env, missing_id_event, context ): expected_body = json.dumps( { "message": "An error occurred due to missing key", "err_code": "PN_4002", "interaction_id": "88888888-4444-4444-4444-121212121212", - }, + } ) expected = ApiGatewayResponse( - 400, - expected_body, - "GET", + 400, expected_body, "GET" ).create_api_gateway_response() actual = lambda_handler(missing_id_event, context) assert expected == actual -def test_lambda_handler_when_dynamo_tables_env_variable_not_supplied_then_return_500_response( - valid_id_event_without_auth_header, - context, - mocked_feature_flags, +def test_lambda_handler_when_dynamo_tables_env_variable_not_supplied_then_return_400_response( + valid_id_event_without_auth_header, context ): expected_body = json.dumps( { - "message": "An error occurred due to missing environment variable: 'LLOYD_GEORGE_DYNAMODB_NAME'", + "message": "An error occurred due to missing environment variable: 'DYNAMODB_TABLE_LIST'", "err_code": "ENV_5001", "interaction_id": "88888888-4444-4444-4444-121212121212", - }, + } ) expected = ApiGatewayResponse( 500, @@ -146,205 +126,133 @@ def test_lambda_handler_when_dynamo_tables_env_variable_not_supplied_then_return def test_lambda_handler_with_feature_flag_enabled_applies_doc_status_filter( - set_env, - valid_id_event_without_auth_header, - context, - mocked_service, - mocked_feature_flags, + set_env, mocker, valid_id_event_without_auth_header, context ): - mocked_service.get_paginated_references_by_nhs_number.return_value = { - "references": EXPECTED_RESPONSE, - "next_page_token": None, - } + mocked_service_class = mocker.patch( + "handlers.document_reference_search_handler.DocumentReferenceSearchService" + ) + mocked_service = mocked_service_class.return_value + mocked_service.get_document_references.return_value = EXPECTED_RESPONSE - mocked_feature_flags.get_feature_flags_by_flag.return_value = { - FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED: True, + mocked_feature_flag_service = mocker.patch( + "handlers.document_reference_search_handler.FeatureFlagService" + ) + mocked_feature_flag_instance = mocked_feature_flag_service.return_value + mocked_feature_flag_instance.get_feature_flags_by_flag.return_value = { + FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED: True } expected = ApiGatewayResponse( - 200, - json.dumps( - { - "references": EXPECTED_RESPONSE, - "nextPageToken": None, - }, - ), - "GET", + 200, json.dumps(EXPECTED_RESPONSE), "GET" ).create_api_gateway_response() actual = lambda_handler(valid_id_event_without_auth_header, context) assert expected == actual - mocked_feature_flags.get_feature_flags_by_flag.assert_called_once_with( - FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED, + mocked_feature_flag_instance.get_feature_flags_by_flag.assert_called_once_with( + FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED ) - mocked_service.get_paginated_references_by_nhs_number.assert_called_once_with( - nhs_number=TEST_NHS_NUMBER, - limit=None, - next_page_token=None, - filter={"doc_status": "final"}, + mocked_service.get_document_references.assert_called_once_with( + "9000000009", + check_upload_completed=True, + additional_filters={"doc_status": "final"}, ) def test_lambda_handler_with_feature_flag_disabled_no_doc_status_filter( - set_env, - valid_id_event_without_auth_header, - context, - mocked_service, - mocked_feature_flags, + set_env, mocker, valid_id_event_without_auth_header, context ): + mocked_service_class = mocker.patch( + "handlers.document_reference_search_handler.DocumentReferenceSearchService" + ) + mocked_service = mocked_service_class.return_value + mocked_service.get_document_references.return_value = EXPECTED_RESPONSE - mocked_service.get_paginated_references_by_nhs_number.return_value = { - "references": EXPECTED_RESPONSE, - "next_page_token": None, - } - - mocked_feature_flags.get_feature_flags_by_flag.return_value = { - FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED: False, + mocked_feature_flag_service = mocker.patch( + "handlers.document_reference_search_handler.FeatureFlagService" + ) + mocked_feature_flag_instance = mocked_feature_flag_service.return_value + mocked_feature_flag_instance.get_feature_flags_by_flag.return_value = { + FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED: False } expected = ApiGatewayResponse( - 200, - json.dumps( - { - "references": EXPECTED_RESPONSE, - "nextPageToken": None, - }, - ), - "GET", + 200, json.dumps(EXPECTED_RESPONSE), "GET" ).create_api_gateway_response() actual = lambda_handler(valid_id_event_without_auth_header, context) assert expected == actual - mocked_feature_flags.get_feature_flags_by_flag.assert_called_once_with( - FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED, + mocked_feature_flag_instance.get_feature_flags_by_flag.assert_called_once_with( + FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED ) - mocked_service.get_paginated_references_by_nhs_number.assert_called_once_with( - nhs_number=TEST_NHS_NUMBER, - limit=None, - next_page_token=None, - filter={}, + mocked_service.get_document_references.assert_called_once_with( + "9000000009", + check_upload_completed=True, + additional_filters={}, ) - def test_lambda_handler_with_doc_type_applies_doc_type_filter( - set_env, - valid_id_event_without_auth_header, - context, - mocked_service, - mocked_feature_flags, + set_env, mocker, valid_id_event_without_auth_header, context ): - mocked_service.get_paginated_references_by_nhs_number.return_value = { - "references": EXPECTED_RESPONSE, - "next_page_token": None, - } + mocked_service_class = mocker.patch( + "handlers.document_reference_search_handler.DocumentReferenceSearchService" + ) + mocked_service = mocked_service_class.return_value + mocked_service.get_document_references.return_value = EXPECTED_RESPONSE - mocked_feature_flags.get_feature_flags_by_flag.return_value = { - FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED: False, + mocked_feature_flag_service = mocker.patch( + "handlers.document_reference_search_handler.FeatureFlagService" + ) + mocked_feature_flag_instance = mocked_feature_flag_service.return_value + mocked_feature_flag_instance.get_feature_flags_by_flag.return_value = { + FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED: False } expected = ApiGatewayResponse( - 200, - json.dumps({"references": EXPECTED_RESPONSE, "nextPageToken": None}), - "GET", + 200, json.dumps(EXPECTED_RESPONSE), "GET" ).create_api_gateway_response() - doc_type = SnomedCodes.LLOYD_GEORGE.value.code + doc_type = "16521000000101" valid_id_event_without_auth_header["queryStringParameters"]["docType"] = doc_type actual = lambda_handler(valid_id_event_without_auth_header, context) assert expected == actual - mocked_feature_flags.get_feature_flags_by_flag.assert_called_once_with( - FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED, + mocked_feature_flag_instance.get_feature_flags_by_flag.assert_called_once_with( + FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED ) - mocked_service.get_paginated_references_by_nhs_number.assert_called_once_with( - nhs_number=TEST_NHS_NUMBER, - limit=None, - next_page_token=None, - # check_upload_completed=True, - filter={"document_snomed_code": doc_type}, + mocked_service.get_document_references.assert_called_once_with( + "9000000009", + check_upload_completed=True, + additional_filters={"document_snomed_code": doc_type}, ) -def test_extract_querystring_params_next_page_token_present( - valid_id_event_without_auth_header, -): - event = deepcopy(valid_id_event_without_auth_header) - event["queryStringParameters"].update({"nextPageToken": "abc"}) - - expected = (TEST_NHS_NUMBER, "abc", None) - - actual = extract_querystring_params(event) - - assert expected == actual - - -def test_extract_querystring_params_no_next_page_token( - valid_id_event_without_auth_header, -): - expected = (TEST_NHS_NUMBER, None, None) - actual = extract_querystring_params(valid_id_event_without_auth_header) - assert expected == actual - - -def test_extract_querystring_params_limit_passed(valid_id_event_without_auth_header): - event = deepcopy(valid_id_event_without_auth_header) - event["queryStringParameters"].update({"limit": "10"}) - - expected = (TEST_NHS_NUMBER, None, "10") - actual = extract_querystring_params(event) - - assert expected == actual - - -def test_handler_uses_pagination_expected_params_passed( - valid_id_event_without_auth_header, - mocked_service, - context, - mocked_feature_flags, -): - - limit_event = deepcopy(valid_id_event_without_auth_header) - limit_event["queryStringParameters"].update({"limit": "10"}) - - token_event = deepcopy(valid_id_event_without_auth_header) - token_event["queryStringParameters"].update({"nextPageToken": "abc"}) - - events = [limit_event, token_event] - - for event in events: - lambda_handler(event, context) - mocked_service.get_paginated_references_by_nhs_number.assert_called() - - def test_lambda_handler_with_invalid_doc_type_returns_400( - set_env, - valid_id_event_without_auth_header, - context, - mocked_service, - mocked_feature_flags, + set_env, mocker, valid_id_event_without_auth_header, context ): + mocker.patch( + "handlers.document_reference_search_handler.DocumentReferenceSearchService" + ) + mocker.patch( + "handlers.document_reference_search_handler.FeatureFlagService" + ) invalid_doc_type = "invalid_doc_type" - valid_id_event_without_auth_header["queryStringParameters"][ - "docType" - ] = invalid_doc_type + valid_id_event_without_auth_header["queryStringParameters"]["docType"] = invalid_doc_type expected_body = json.dumps( { "message": "Invalid document type requested", "err_code": "VDT_4002", "interaction_id": "88888888-4444-4444-4444-121212121212", - }, + } ) expected = ApiGatewayResponse( - 400, - expected_body, - "GET", + 400, expected_body, "GET" ).create_api_gateway_response() actual = lambda_handler(valid_id_event_without_auth_header, context) - assert expected == actual + assert expected == actual \ No newline at end of file diff --git a/lambdas/tests/unit/helpers/data/dynamo/dynamo_responses.py b/lambdas/tests/unit/helpers/data/dynamo/dynamo_responses.py index 3c2b503323..b957c819f4 100755 --- a/lambdas/tests/unit/helpers/data/dynamo/dynamo_responses.py +++ b/lambdas/tests/unit/helpers/data/dynamo/dynamo_responses.py @@ -1,5 +1,3 @@ -from tests.unit.conftest import TEST_FILE_SIZE, TEST_NHS_NUMBER - MOCK_SEARCH_RESPONSE = { "Items": [ { @@ -9,8 +7,7 @@ "DocStatus": "final", "FileLocation": "s3://test-s3-bucket/9000000009/test-key-123", "FileName": "document.csv", - "FileSize": TEST_FILE_SIZE, - "NhsNumber": TEST_NHS_NUMBER, + "NhsNumber": "9000000009", "VirusScannerResult": "Clean", "CurrentGpOds": "Y12345", "Uploaded": "True", @@ -25,8 +22,7 @@ "DocStatus": "final", "FileLocation": "s3://test-s3-bucket/9000000009/test-key-223", "FileName": "results.pdf", - "FileSize": TEST_FILE_SIZE, - "NhsNumber": TEST_NHS_NUMBER, + "NhsNumber": "9000000009", "VirusScannerResult": "Clean", "CurrentGpOds": "Y12345", "Uploaded": "True", @@ -41,8 +37,7 @@ "DocStatus": "final", "FileLocation": "s3://test-s3-bucket/9000000009/test-key-323", "FileName": "output.csv", - "FileSize": TEST_FILE_SIZE, - "NhsNumber": TEST_NHS_NUMBER, + "NhsNumber": "9000000009", "VirusScannerResult": "Clean", "CurrentGpOds": "Y12345", "Uploaded": "True", diff --git a/lambdas/tests/unit/helpers/data/test_documents.py b/lambdas/tests/unit/helpers/data/test_documents.py index dae5903ce0..6035c1e474 100644 --- a/lambdas/tests/unit/helpers/data/test_documents.py +++ b/lambdas/tests/unit/helpers/data/test_documents.py @@ -9,7 +9,6 @@ MOCK_ARF_BUCKET, MOCK_LG_BUCKET, MOCK_LG_STAGING_STORE_BUCKET_ENV_NAME, - TEST_FILE_SIZE, TEST_NHS_NUMBER, TEST_UUID, ) @@ -56,22 +55,19 @@ def create_test_lloyd_george_doc_store_refs( refs[0].file_name = filename_1 refs[0].s3_file_key = f"{TEST_NHS_NUMBER}/test-key-1" refs[0].file_location = f"s3://{MOCK_LG_BUCKET}/{TEST_NHS_NUMBER}/test-key-1" - refs[0].file_size = TEST_FILE_SIZE refs[0].s3_bucket_name = MOCK_LG_BUCKET refs[0].document_snomed_code_type = SnomedCodes.LLOYD_GEORGE.value.code refs[1].file_name = filename_2 refs[1].s3_file_key = f"{TEST_NHS_NUMBER}/test-key-2" refs[1].file_location = f"s3://{MOCK_LG_BUCKET}/{TEST_NHS_NUMBER}/test-key-2" - refs[1].file_size = TEST_FILE_SIZE refs[1].s3_bucket_name = MOCK_LG_BUCKET refs[1].document_snomed_code_type = SnomedCodes.LLOYD_GEORGE.value.code refs[2].file_name = filename_3 refs[2].s3_file_key = f"{TEST_NHS_NUMBER}/test-key-3" refs[2].file_location = f"s3://{MOCK_LG_BUCKET}/{TEST_NHS_NUMBER}/test-key-3" - refs[2].file_size = TEST_FILE_SIZE refs[2].s3_bucket_name = MOCK_LG_BUCKET refs[2].document_snomed_code_type = SnomedCodes.LLOYD_GEORGE.value.code - + if override: refs = [doc_ref.model_copy(update=override) for doc_ref in refs] return refs @@ -94,8 +90,7 @@ def create_test_arf_doc_store_refs( def create_test_doc_refs( - override: Optional[Dict] = None, - file_names: Optional[List[str]] = None, + override: Optional[Dict] = None, file_names: Optional[List[str]] = None ) -> List[DocumentReference]: if not file_names: file_names = [ @@ -123,8 +118,7 @@ def create_test_doc_refs( def create_test_doc_refs_as_dict( - override: Optional[Dict] = None, - file_names: Optional[List[str]] = None, + override: Optional[Dict] = None, file_names: Optional[List[str]] = None ) -> List[Dict]: test_doc_refs = create_test_doc_refs(override, file_names) return [ @@ -143,7 +137,7 @@ def create_valid_fhir_doc_json(nhs_number: str = "9000000009"): "identifier": { "system": "https://fhir.nhs.uk/Id/nhs-number", "value": nhs_number, - }, + } }, "type": { "coding": [ @@ -151,22 +145,22 @@ def create_valid_fhir_doc_json(nhs_number: str = "9000000009"): "system": "http://snomed.info/sct", "code": SnomedCodes.LLOYD_GEORGE.value.code, "display": SnomedCodes.LLOYD_GEORGE.value.display_name, - }, - ], + } + ] }, "custodian": { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "A12345", - }, + } }, "author": [ { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "A12345", - }, - }, + } + } ], "content": [ { @@ -175,9 +169,9 @@ def create_valid_fhir_doc_json(nhs_number: str = "9000000009"): "language": "en-GB", "title": "test-file.pdf", "creation": "2023-01-01T12:00:00Z", - }, - }, + } + } ], "meta": {"versionId": "1"}, - }, + } ) diff --git a/lambdas/tests/unit/repositories/bulk_upload/test_bulk_upload_sqs_repository.py b/lambdas/tests/unit/repositories/bulk_upload/test_bulk_upload_sqs_repository.py index 5d0a3dbf33..fa76981406 100644 --- a/lambdas/tests/unit/repositories/bulk_upload/test_bulk_upload_sqs_repository.py +++ b/lambdas/tests/unit/repositories/bulk_upload/test_bulk_upload_sqs_repository.py @@ -32,13 +32,13 @@ def sample_staging_metadata(): files=[ BulkUploadQueueMetadata( file_path="staging/9000000009/test1.pdf", - stored_file_name="lg_test1.pdf", + stored_file_name="test1.pdf", gp_practice_code="Y12345", scan_date="2024-01-01", ), BulkUploadQueueMetadata( file_path="staging/9000000009/test2.pdf", - stored_file_name="lg_test2.pdf", + stored_file_name="test2.pdf", gp_practice_code="Y12345", scan_date="2024-01-01", ), @@ -48,9 +48,7 @@ def sample_staging_metadata(): def test_put_staging_metadata_back_to_queue_and_increases_retries( - set_env, - mock_uuid, - repo_under_test, + set_env, mock_uuid, repo_under_test ): TEST_STAGING_METADATA.retries = 2 metadata_copy = copy.deepcopy(TEST_STAGING_METADATA) @@ -90,9 +88,7 @@ def test_send_message_to_pdf_stitching_queue(set_env, repo_under_test): def test_sends_message_to_review_queue_with_correct_structure_and_fields( - set_env, - repo_under_test, - mock_uuid, + set_env, repo_under_test, mock_uuid ): repo_under_test.send_message_to_review_queue( staging_metadata=TEST_STAGING_METADATA, diff --git a/lambdas/tests/unit/services/test_document_reference_search_service.py b/lambdas/tests/unit/services/test_document_reference_search_service.py index b935c4018b..65396a4490 100644 --- a/lambdas/tests/unit/services/test_document_reference_search_service.py +++ b/lambdas/tests/unit/services/test_document_reference_search_service.py @@ -1,4 +1,5 @@ import json +from json import JSONDecodeError from unittest.mock import MagicMock, call import pytest @@ -12,44 +13,38 @@ from models.document_reference import DocumentReference from pydantic import ValidationError from services.document_reference_search_service import DocumentReferenceSearchService -from tests.unit.conftest import ( - APIM_API_URL, - MOCK_LG_TABLE_NAME, - TEST_FILE_SIZE, - TEST_NHS_NUMBER, -) +from tests.unit.conftest import APIM_API_URL from tests.unit.helpers.data.dynamo.dynamo_responses import MOCK_SEARCH_RESPONSE from utils.common_query_filters import NotDeleted, UploadCompleted from utils.exceptions import DynamoServiceException from utils.lambda_exceptions import DocumentRefSearchException MOCK_DOCUMENT_REFERENCE = [ - DocumentReference.model_validate(MOCK_SEARCH_RESPONSE["Items"][0]), + DocumentReference.model_validate(MOCK_SEARCH_RESPONSE["Items"][0]) ] +MOCK_FILE_SIZE = 24000 + EXPECTED_RESPONSE = { "created": "2024-01-01T12:00:00.000Z", "fileName": "document.csv", "virusScannerResult": "Clean", "id": "3d8683b9-1665-40d2-8499-6e8302d507ff", - "fileSize": TEST_FILE_SIZE, + "fileSize": MOCK_FILE_SIZE, "version": "1", "contentType": "application/pdf", "documentSnomedCodeType": SnomedCodes.LLOYD_GEORGE.value.code, } -MOCK_NEXT_PAGE_TOKEN = "thisisaencodedtoken" - @pytest.fixture def mock_document_service(mocker, set_env): service = DocumentReferenceSearchService() mock_s3_service = mocker.patch.object(service, "s3_service") - mocker.patch.object(mock_s3_service, "get_file_size", return_value=TEST_FILE_SIZE) + mocker.patch.object(mock_s3_service, "get_file_size", return_value=MOCK_FILE_SIZE) mocker.patch.object(service, "dynamo_service") mocker.patch.object(service, "fetch_documents_from_table_with_nhs_number") mocker.patch.object(service, "is_upload_in_process", return_value=False) - mocker.patch.object(service, "query_table_with_paginator") return service @@ -63,18 +58,23 @@ def mock_filter_builder(mocker): return mock_filter +def test_get_document_references_raise_json_error_when_no_table_list( + mock_document_service, monkeypatch +): + monkeypatch.setenv("DYNAMODB_TABLE_LIST", "") + with pytest.raises(JSONDecodeError): + mock_document_service._get_table_names(None) + + def test_search_tables_for_documents_raise_validation_error( - mock_document_service, - validation_error, + mock_document_service, validation_error ): mock_document_service.fetch_documents_from_table_with_nhs_number.side_effect = ( validation_error ) with pytest.raises(ValidationError): mock_document_service._search_tables_for_documents( - "1234567890", - "table1", - return_fhir=True, + "1234567890", ["table1", "table2"], return_fhir=True ) @@ -85,16 +85,14 @@ def test_get_document_references_raise_client_error(mock_document_service): "Error": { "Code": "test", "Message": "test", - }, + } }, "test", ) ) with pytest.raises(ClientError): mock_document_service._search_tables_for_documents( - "1234567890", - "table1", - return_fhir=True, + "1234567890", ["table1", "table2"], return_fhir=True ) @@ -105,7 +103,7 @@ def test_get_document_references_raise_dynamodb_error(mock_document_service): with pytest.raises(DynamoServiceException): mock_document_service._search_tables_for_documents( "1234567890", - "table1", + ["table1", "table2"], return_fhir=True, check_upload_completed=False, ) @@ -117,9 +115,7 @@ def test_get_document_references_dynamo_return_empty_response_with_fhir( mock_document_service.fetch_documents_from_table_with_nhs_number.return_value = [] actual = mock_document_service._search_tables_for_documents( - "1234567890", - "table1", - return_fhir=True, + "1234567890", ["table1", "table2"], return_fhir=True ) assert actual["resourceType"] == "Bundle" assert actual["entry"] == [] @@ -130,16 +126,13 @@ def test_get_document_references_dynamo_return_empty_response(mock_document_serv mock_document_service.fetch_documents_from_table_with_nhs_number.return_value = [] actual = mock_document_service._search_tables_for_documents( - "1234567890", - "table1", - return_fhir=False, + "1234567890", ["table1", "table2"], return_fhir=False ) assert actual is None def test_get_document_references_dynamo_return_successful_response_single_table( - mock_document_service, - monkeypatch, + mock_document_service, monkeypatch ): monkeypatch.setenv("DYNAMODB_TABLE_LIST", json.dumps(["test_table"])) @@ -148,9 +141,7 @@ def test_get_document_references_dynamo_return_successful_response_single_table( ) expected_results = MOCK_DOCUMENT_REFERENCE actual = mock_document_service.fetch_documents_from_table_with_nhs_number( - "111111111", - "test_table", - NotDeleted, + "111111111", "test_table", NotDeleted ) assert actual == expected_results @@ -163,6 +154,26 @@ def test_build_document_model_response(mock_document_service, monkeypatch): assert actual == expected_results +def test_get_document_references_dynamo_return_successful_response_multiple_tables( + mock_document_service, mocker +): + mock_fetch_documents = mocker.MagicMock(return_value=MOCK_DOCUMENT_REFERENCE) + mock_document_service.fetch_documents_from_table_with_nhs_number = ( + mock_fetch_documents + ) + mock_document_service._validate_upload_status = mocker.MagicMock() + mock_document_service._process_documents = mocker.MagicMock( + return_value=[EXPECTED_RESPONSE] + ) + expected_results = [EXPECTED_RESPONSE, EXPECTED_RESPONSE] + + actual = mock_document_service._search_tables_for_documents( + "1111111111", ["table1", "table2"], False + ) + + assert actual == expected_results + + def test_get_document_references_raise_error_when_upload_is_in_process( mock_document_service, ): @@ -173,30 +184,25 @@ def test_get_document_references_raise_error_when_upload_is_in_process( def test_get_document_references_success(mock_document_service, mocker): - mock_get_table_names = mocker.MagicMock(return_value="table1") - mock_document_service._get_table_name = mock_get_table_names + mock_get_table_names = mocker.MagicMock(return_value=["table1", "table2"]) + mock_document_service._get_table_names = mock_get_table_names mock_search_document = mocker.MagicMock(return_value=[{"id": "123"}]) mock_document_service._search_tables_for_documents = mock_search_document result = mock_document_service.get_document_references( - "1234567890", - return_fhir=False, + "1234567890", return_fhir=False ) assert result == [{"id": "123"}] mock_get_table_names.assert_called_once() mock_search_document.assert_called_once_with( - "1234567890", - "table1", - False, - None, - True, + "1234567890", ["table1", "table2"], False, None, True ) def test_get_document_references_exception(mock_document_service, mocker): - mock_document_service._get_table_name = mocker.MagicMock( - side_effect=DynamoServiceException, + mock_document_service._get_table_names = mocker.MagicMock( + side_effect=DynamoServiceException ) with pytest.raises(DocumentRefSearchException) as exc_info: @@ -218,24 +224,26 @@ def test_search_tables_for_documents_non_fhir(mock_document_service, mocker): mock_document_service._process_documents = mock_process_document_non_fhir result_non_fhir = mock_document_service._search_tables_for_documents( "1234567890", - "table1", + ["table1", "table2"], return_fhir=False, check_upload_completed=True, ) - assert result_non_fhir == [mock_document_id] + assert result_non_fhir == [mock_document_id, mock_document_id] mock_process_document_non_fhir.assert_has_calls( [ call(MOCK_DOCUMENT_REFERENCE, return_fhir=False), - ], + call(MOCK_DOCUMENT_REFERENCE, return_fhir=False), + ] ) - assert mock_fetch_document_method.call_count == 1 + assert mock_fetch_document_method.call_count == 2 mock_fetch_document_method.assert_has_calls( [ call("1234567890", "table1", query_filter=UploadCompleted), - ], + call("1234567890", "table2", query_filter=UploadCompleted), + ] ) @@ -251,26 +259,29 @@ def test_search_tables_for_documents_fhir(mock_document_service, mocker): mock_document_service._process_documents = mock_process_document_fhir result_fhir = mock_document_service._search_tables_for_documents( "1234567890", - "table1", + ["table1", "table2"], return_fhir=True, check_upload_completed=True, ) assert result_fhir["resourceType"] == "Bundle" assert result_fhir["type"] == "searchset" - assert result_fhir["total"] == 1 - assert len(result_fhir["entry"]) == 1 + assert result_fhir["total"] == 2 + assert len(result_fhir["entry"]) == 2 assert result_fhir["entry"][0]["resource"] == mock_fhir_doc + assert result_fhir["entry"][1]["resource"] == mock_fhir_doc mock_fetch_document_method.assert_has_calls( [ call("1234567890", "table1", query_filter=UploadCompleted), - ], + call("1234567890", "table2", query_filter=UploadCompleted), + ] ) mock_process_document_fhir.assert_has_calls( [ call(MOCK_DOCUMENT_REFERENCE, return_fhir=True), - ], + call(MOCK_DOCUMENT_REFERENCE, return_fhir=True), + ] ) @@ -286,12 +297,11 @@ def test_validate_upload_status_raises_exception(mock_document_service): def test_process_documents_return_fhir(mock_document_service): mock_document_service.create_document_reference_fhir_response = MagicMock( - return_value={"fhir": "response"}, + return_value={"fhir": "response"} ) result = mock_document_service._process_documents( - MOCK_DOCUMENT_REFERENCE, - return_fhir=True, + MOCK_DOCUMENT_REFERENCE, return_fhir=True ) assert result == [{"fhir": "response"}] @@ -309,13 +319,13 @@ def test_create_document_reference_fhir_response(mock_document_service, mocker): mock_document_reference.document_snomed_code_type = "16521000000101" mock_attachment = mocker.patch( - "services.document_reference_search_service.Attachment", + "services.document_reference_search_service.Attachment" ) mock_attachment_instance = mocker.MagicMock() mock_attachment.return_value = mock_attachment_instance mock_doc_ref_info = mocker.patch( - "services.document_reference_search_service.DocumentReferenceInfo", + "services.document_reference_search_service.DocumentReferenceInfo" ) mock_doc_ref_info_instance = mocker.MagicMock() mock_doc_ref_info.return_value = mock_doc_ref_info_instance @@ -334,7 +344,7 @@ def test_create_document_reference_fhir_response(mock_document_service, mocker): "identifier": { "system": "https://fhir.nhs.uk/Id/nhs-number", "value": "9000000009", - }, + } }, "content": [ { @@ -344,28 +354,28 @@ def test_create_document_reference_fhir_response(mock_document_service, mocker): "title": "test_document.pdf", "creation": "2023-05-01", "url": f"{APIM_API_URL}/DocumentReference/123", - }, - }, + } + } ], "author": [ { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "Y05868", - }, - }, + } + } ], "custodian": { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "Y05868", - }, + } }, } mock_fhir_doc_ref.model_dump.return_value = expected_fhir_response result = mock_document_service.create_document_reference_fhir_response( - mock_document_reference, + mock_document_reference ) mock_attachment.assert_called_once_with( @@ -389,8 +399,7 @@ def test_create_document_reference_fhir_response(mock_document_service, mocker): @freeze_time("2023-05-01T12:00:00Z") def test_create_document_reference_fhir_response_integration( - mock_document_service, - mocker, + mock_document_service, mocker ): mock_document_reference = mocker.MagicMock() mock_document_reference.nhs_number = "9000000009" @@ -414,7 +423,7 @@ def test_create_document_reference_fhir_response_integration( "identifier": { "system": "https://fhir.nhs.uk/Id/nhs-number", "value": "9000000009", - }, + } }, "date": "2023-05-01T12:00:00", "content": [ @@ -425,22 +434,22 @@ def test_create_document_reference_fhir_response_integration( "title": "test_document.pdf", "creation": "2023-05-01", "url": f"{APIM_API_URL}/DocumentReference/16521000000101~Y05868-1634567890", - }, - }, + } + } ], "author": [ { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "Y12345", - }, - }, + } + } ], "custodian": { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "Y12345", - }, + } }, "type": { "coding": [ @@ -448,14 +457,14 @@ def test_create_document_reference_fhir_response_integration( "system": "http://snomed.info/sct", "code": "16521000000101", "display": "Lloyd George record folder", - }, - ], + } + ] }, "meta": {"versionId": "1"}, } result = mock_document_service.create_document_reference_fhir_response( - mock_document_reference, + mock_document_reference ) assert isinstance(result, dict) @@ -474,8 +483,7 @@ def test_build_filter_expression_custodian(mock_document_service): def test_build_filter_expression_custodian_mocked( - mock_document_service, - mock_filter_builder, + mock_document_service, mock_filter_builder ): filter_values = {"custodian": "12345"} @@ -496,116 +504,6 @@ def test_build_filter_expression_defaults(mock_document_service): assert actual_filter == expected_filter - -def test_get_paginated_references_by_nhs_number_returns_references_and_token( - mock_document_service, -): - mock_document_service.query_table_with_paginator.return_value = ( - MOCK_DOCUMENT_REFERENCE, - MOCK_NEXT_PAGE_TOKEN, - ) - expected = { - "references": [EXPECTED_RESPONSE], - "next_page_token": MOCK_NEXT_PAGE_TOKEN, - } - - actual = mock_document_service.get_paginated_references_by_nhs_number( - nhs_number=TEST_NHS_NUMBER, - ) - - mock_document_service.query_table_with_paginator.assert_called_with( - table_name=MOCK_LG_TABLE_NAME, - index_name="NhsNumberIndex", - search_key="NhsNumber", - search_condition=TEST_NHS_NUMBER, - limit=None, - start_key=None, - filter_expression="#Deleted_attr = :Deleted_condition_val OR attribute_not_exists(#Deleted_attr)", - expression_attribute_names={"#Deleted_attr": "Deleted"}, - expression_attribute_values={":Deleted_condition_val": ""}, - ) - - assert actual == expected - - -def test_get_paginated_references_by_nhs_number_handles_filters(mock_document_service): - mock_document_service.query_table_with_paginator.return_value = ( - MOCK_DOCUMENT_REFERENCE, - MOCK_NEXT_PAGE_TOKEN, - ) - - mock_document_service.get_paginated_references_by_nhs_number( - nhs_number=TEST_NHS_NUMBER, - filter={"doc_status": "final"}, - ) - - mock_document_service.query_table_with_paginator.assert_called_with( - table_name=MOCK_LG_TABLE_NAME, - index_name="NhsNumberIndex", - search_key="NhsNumber", - search_condition=TEST_NHS_NUMBER, - limit=None, - start_key=None, - filter_expression=( - "(#Deleted_attr = :Deleted_condition_val OR attribute_not_exists(#Deleted_attr)) " - "AND #DocStatus_attr = :DocStatus_condition_val" - ), - expression_attribute_names={ - "#Deleted_attr": "Deleted", - "#DocStatus_attr": "DocStatus", - }, - expression_attribute_values={ - ":Deleted_condition_val": "", - ":DocStatus_condition_val": "final", - }, - ) - - -def test_build_pagination_filter_no_addition_filter_passed_returns_not_deleted_filter( - mock_document_service, -): - expected_filter_expression = ( - "#Deleted_attr = :Deleted_condition_val OR attribute_not_exists(#Deleted_attr)" - ) - expected_condition_attribute_names = {"#Deleted_attr": "Deleted"} - expected_condition_attribute_values = {":Deleted_condition_val": ""} - - ( - actual_filter_expression, - actual_condition_attribute_names, - actual_condition_attribute_values, - ) = mock_document_service._build_pagination_filter(None) - - assert expected_filter_expression == actual_filter_expression - assert expected_condition_attribute_names == actual_condition_attribute_names - assert expected_condition_attribute_values == actual_condition_attribute_values - - -def test_build_pagination_filter_handles_additional_filters(mock_document_service): - expected_filter_expression = ( - "(#Deleted_attr = :Deleted_condition_val OR attribute_not_exists(#Deleted_attr)) " - "AND #DocStatus_attr = :DocStatus_condition_val" - ) - expected_condition_attribute_names = { - "#Deleted_attr": "Deleted", - "#DocStatus_attr": "DocStatus", - } - expected_condition_attribute_values = { - ":Deleted_condition_val": "", - ":DocStatus_condition_val": "final", - } - - ( - actual_filter_expression, - actual_condition_attribute_names, - actual_condition_attribute_values, - ) = mock_document_service._build_pagination_filter({"doc_status": "final"}) - - assert actual_filter_expression == expected_filter_expression - assert actual_condition_attribute_names == expected_condition_attribute_names - assert actual_condition_attribute_values == expected_condition_attribute_values - - def test_build_filter_expression_document_snomed_code(mock_document_service): filter_values = {"document_snomed_code": "16521000000101"} expected_filter = Attr("DocumentSnomedCodeType").eq("16521000000101") & ( diff --git a/lambdas/tests/unit/services/test_document_review_processor_service.py b/lambdas/tests/unit/services/test_document_review_processor_service.py index c0e3a46262..70d746ab14 100644 --- a/lambdas/tests/unit/services/test_document_review_processor_service.py +++ b/lambdas/tests/unit/services/test_document_review_processor_service.py @@ -9,7 +9,6 @@ from models.pds_models import PatientDetails from models.sqs.review_message_body import ReviewMessageBody, ReviewMessageFile from services.document_review_processor_service import ReviewProcessorService -from tests.unit.conftest import MOCK_DOCUMENT_REVIEW_BUCKET, S3_PREFIX, TEST_NHS_NUMBER from utils.exceptions import ( InvalidResourceIdException, PatientNotFoundException, @@ -20,17 +19,13 @@ @pytest.fixture def mock_document_upload_review_service(mocker): return mocker.patch( - "services.document_review_processor_service.DocumentUploadReviewService", + "services.document_review_processor_service.DocumentUploadReviewService" ) @pytest.fixture def mock_s3_service(mocker): - mock_s3 = mocker.patch( - "services.document_review_processor_service.S3Service", - ).return_value - mock_s3.S3_PREFIX = S3_PREFIX - yield mock_s3 + return mocker.patch("services.document_review_processor_service.S3Service") @pytest.fixture @@ -47,7 +42,7 @@ def sample_review_message(): ReviewMessageFile( file_name="test_document.pdf", file_path="staging/9000000009/test_document.pdf", - ), + ) ], nhs_number="9000000009", failure_reason=DocumentReviewReason.UNSUCCESSFUL_UPLOAD, @@ -72,10 +67,20 @@ def mock_pds_service(mocker): return mock_pds +def test_service_initializes_with_correct_environment_variables( + set_env, mock_document_upload_review_service, mock_s3_service +): + service = ReviewProcessorService() + + assert service.review_table_name == "test_document_review" + assert service.staging_bucket_name == "test_staging_bulk_store" + assert service.review_bucket_name == "test_document_review_bucket" + mock_document_upload_review_service.assert_called_once() + mock_s3_service.assert_called_once() + + def test_process_review_message_success( - service_under_test, - sample_review_message, - mocker, + service_under_test, sample_review_message, mocker ): mock_move = mocker.patch.object(service_under_test, "_move_files_to_review_bucket") mock_delete = mocker.patch.object(service_under_test, "_delete_files_from_staging") @@ -84,7 +89,7 @@ def test_process_review_message_success( DocumentReviewFileDetails( file_name="test_document.pdf", file_location="9000000009/test-upload-id-123/test_document.pdf", - ), + ) ] service_under_test.process_review_message(sample_review_message) @@ -134,9 +139,7 @@ def test_process_review_message_multiple_files(service_under_test, mocker): def test_process_review_message_s3_copy_error( - service_under_test, - sample_review_message, - mocker, + service_under_test, sample_review_message, mocker ): mocker.patch.object( service_under_test, @@ -152,9 +155,7 @@ def test_process_review_message_s3_copy_error( def test_process_review_message_dynamo_error_not_precondition( - service_under_test, - sample_review_message, - mocker, + service_under_test, sample_review_message, mocker ): mocker.patch.object( service_under_test, @@ -163,7 +164,7 @@ def test_process_review_message_dynamo_error_not_precondition( DocumentReviewFileDetails( file_name="document_1.pdf", file_location="9000000009/test-upload-id-456/document_1.pdf", - ), + ) ], ) service_under_test.document_review_service.create_dynamo_entry.side_effect = ( @@ -178,9 +179,7 @@ def test_process_review_message_dynamo_error_not_precondition( def test_process_review_message_continues_dynamo_conditional_check_failure( - service_under_test, - sample_review_message, - mocker, + service_under_test, sample_review_message, mocker ): mocker.patch.object( service_under_test, @@ -189,7 +188,7 @@ def test_process_review_message_continues_dynamo_conditional_check_failure( DocumentReviewFileDetails( file_name="document_1.pdf", file_location="9000000009/test-upload-id-456/document_1.pdf", - ), + ) ], ) mocker.patch.object(service_under_test, "_delete_files_from_staging") @@ -199,7 +198,7 @@ def test_process_review_message_continues_dynamo_conditional_check_failure( "Error": { "Code": "ConditionalCheckFailedException", "Message": "DynamoDB error", - }, + } }, "PutItem", ) @@ -215,14 +214,11 @@ def test_build_review_record_success(service_under_test, sample_review_message): DocumentReviewFileDetails( file_name="test_document.pdf", file_location="9000000009/test-review-id/test_document.pdf", - ), + ) ] result = service_under_test._build_review_record( - sample_review_message, - "test-review-id", - files, - "Y12345", + sample_review_message, "test-review-id", files, "Y12345" ) assert isinstance(result, DocumentUploadReviewReference) @@ -269,10 +265,7 @@ def test_build_review_record_with_multiple_files(service_under_test): ] result = service_under_test._build_review_record( - message, - "test-review-id", - files, - "Y12345", + message, "test-review-id", files, "Y12345" ) assert len(result.files) == 2 @@ -284,22 +277,18 @@ def test_move_files_success(service_under_test, sample_review_message, mocker): mocker.patch("uuid.uuid4", return_value="123412342") files = service_under_test._move_files_to_review_bucket( - sample_review_message, - "test-review-id-123", + sample_review_message, "test-review-id-123" ) expected_key = "test-review-id-123/123412342" assert len(files) == 1 assert files[0].file_name == "test_document.pdf" - assert ( - files[0].file_location - == f"{S3_PREFIX}{MOCK_DOCUMENT_REVIEW_BUCKET}/{expected_key}" - ) + assert files[0].file_location == expected_key service_under_test.s3_service.copy_across_bucket.assert_called_once_with( source_bucket="test_staging_bulk_store", - source_file_key=f"staging/{TEST_NHS_NUMBER}/test_document.pdf", + source_file_key="staging/9000000009/test_document.pdf", dest_bucket="test_document_review_bucket", dest_file_key=expected_key, if_none_match=True, @@ -312,14 +301,14 @@ def test_move_multiple_files_success(service_under_test, mocker): files=[ ReviewMessageFile( file_name="document_1.pdf", - file_path=f"staging/{TEST_NHS_NUMBER}/document_1.pdf", + file_path="staging/9000000009/document_1.pdf", ), ReviewMessageFile( file_name="document_2.pdf", - file_path=f"staging/{TEST_NHS_NUMBER}/document_2.pdf", + file_path="staging/9000000009/document_2.pdf", ), ], - nhs_number=TEST_NHS_NUMBER, + nhs_number="9000000009", failure_reason=DocumentReviewReason.UNSUCCESSFUL_UPLOAD, uploader_ods="Y12345", ) @@ -329,15 +318,9 @@ def test_move_multiple_files_success(service_under_test, mocker): assert len(files) == 2 assert files[0].file_name == "document_1.pdf" - assert ( - files[0].file_location - == f"{S3_PREFIX}{MOCK_DOCUMENT_REVIEW_BUCKET}/test-review-id/123412342" - ) + assert files[0].file_location == "test-review-id/123412342" assert files[1].file_name == "document_2.pdf" - assert ( - files[1].file_location - == f"{S3_PREFIX}{MOCK_DOCUMENT_REVIEW_BUCKET}/test-review-id/56785678" - ) + assert files[1].file_location == "test-review-id/56785678" assert service_under_test.s3_service.copy_across_bucket.call_count == 2 @@ -350,21 +333,19 @@ def test_move_files_copy_error(service_under_test, sample_review_message): with pytest.raises(ClientError): service_under_test._move_files_to_review_bucket( - sample_review_message, - "test-review-id", + sample_review_message, "test-review-id" ) def test_move_files_to_review_bucket_continues_file_already_exists_in_review_bucket( - service_under_test, - sample_review_message, + service_under_test, sample_review_message ): service_under_test.s3_service.copy_across_bucket.side_effect = ClientError( { "Error": { "Code": "PreconditionFailed", "Message": "At least one of the pre-conditions you specified did not hold", - }, + } }, "CopyObject", ) @@ -418,7 +399,7 @@ def test_workflow_handles_multiple_different_patients(service_under_test): ReviewMessageFile( file_name=f"doc_{i}.pdf", file_path=f"staging/900000000{i}/doc_{i}.pdf", - ), + ) ], nhs_number=f"900000000{i}", failure_reason=DocumentReviewReason.UNSUCCESSFUL_UPLOAD, @@ -437,9 +418,7 @@ def test_workflow_handles_multiple_different_patients(service_under_test): def test_get_patient_custodian_returns_gp_ods_from_pds( - service_under_test, - sample_review_message, - mock_pds_service, + service_under_test, sample_review_message, mock_pds_service ): result = service_under_test._get_patient_custodian(sample_review_message) @@ -448,13 +427,12 @@ def test_get_patient_custodian_returns_gp_ods_from_pds( def test_get_patient_custodian_returns_uploader_ods_when_nhs_number_is_none( - service_under_test, - mock_pds_service, + service_under_test, mock_pds_service ): message = ReviewMessageBody( upload_id="test-upload-id", files=[ - ReviewMessageFile(file_name="test.pdf", file_path="staging/test/test.pdf"), + ReviewMessageFile(file_name="test.pdf", file_path="staging/test/test.pdf") ], nhs_number="", failure_reason=DocumentReviewReason.UNSUCCESSFUL_UPLOAD, @@ -468,13 +446,12 @@ def test_get_patient_custodian_returns_uploader_ods_when_nhs_number_is_none( def test_get_patient_custodian_returns_uploader_ods_when_nhs_number_is_placeholder( - service_under_test, - mock_pds_service, + service_under_test, mock_pds_service ): message = ReviewMessageBody( upload_id="test-upload-id", files=[ - ReviewMessageFile(file_name="test.pdf", file_path="staging/test/test.pdf"), + ReviewMessageFile(file_name="test.pdf", file_path="staging/test/test.pdf") ], nhs_number="0000000000", failure_reason=DocumentReviewReason.UNSUCCESSFUL_UPLOAD, @@ -488,9 +465,7 @@ def test_get_patient_custodian_returns_uploader_ods_when_nhs_number_is_placehold def test_get_patient_custodian_returns_uploader_ods_on_pds_error( - service_under_test, - sample_review_message, - mock_pds_service, + service_under_test, sample_review_message, mock_pds_service ): mock_pds_service.fetch_patient_details.side_effect = PdsErrorException("PDS error") @@ -502,13 +477,11 @@ def test_get_patient_custodian_returns_uploader_ods_on_pds_error( def test_get_patient_custodian_returns_uploader_ods_on_invalid_resource_id( - service_under_test, - sample_review_message, - mock_pds_service, + service_under_test, sample_review_message, mock_pds_service ): mock_pds_service.fetch_patient_details.side_effect = InvalidResourceIdException( - "Invalid NHS number", + "Invalid NHS number" ) result = service_under_test._get_patient_custodian(sample_review_message) @@ -518,12 +491,10 @@ def test_get_patient_custodian_returns_uploader_ods_on_invalid_resource_id( def test_get_patient_custodian_handles_patient_not_found_sets_placeholder( - service_under_test, - sample_review_message, - mock_pds_service, + service_under_test, sample_review_message, mock_pds_service ): mock_pds_service.fetch_patient_details.side_effect = PatientNotFoundException( - "Patient not found", + "Patient not found" ) result = service_under_test._get_patient_custodian(sample_review_message) diff --git a/lambdas/tests/unit/services/test_get_document_upload_status.py b/lambdas/tests/unit/services/test_get_document_upload_status.py index 3000e11a6c..b646a327f0 100644 --- a/lambdas/tests/unit/services/test_get_document_upload_status.py +++ b/lambdas/tests/unit/services/test_get_document_upload_status.py @@ -15,12 +15,9 @@ def mock_document_service(): @pytest.fixture -def get_document_upload_status_service(mock_document_service, mocker): - mocker.patch( - "services.get_document_upload_status.DocumentService", - return_value=mock_document_service, - ) +def get_document_upload_status_service(mock_document_service): service = GetDocumentUploadStatusService() + service.document_service = mock_document_service return service @@ -83,13 +80,11 @@ def test_get_document_references_by_id_found_documents( ) result = get_document_upload_status_service.get_document_references_by_id( - nhs_number, - document_ids, + nhs_number, document_ids ) mock_document_service.get_batch_document_references_by_id.assert_called_once_with( - document_ids, - SupportedDocumentTypes.LG, + document_ids, SupportedDocumentTypes.LG ) assert len(result) == 2 assert result["doc-id-1"]["status"] == "final" @@ -106,12 +101,11 @@ def test_get_document_references_by_id_not_found_documents( nhs_number = "1234567890" document_ids = ["doc-id-1", "non-existent-id"] mock_document_service.get_batch_document_references_by_id.return_value = [ - sample_document_references[0], + sample_document_references[0] ] result = get_document_upload_status_service.get_document_references_by_id( - nhs_number, - document_ids, + nhs_number, document_ids ) assert len(result) == 2 @@ -129,12 +123,11 @@ def test_get_document_references_by_id_access_denied( nhs_number = "1234567890" document_ids = ["doc-id-3"] mock_document_service.get_batch_document_references_by_id.return_value = [ - sample_document_references[2], + sample_document_references[2] ] result = get_document_upload_status_service.get_document_references_by_id( - nhs_number, - document_ids, + nhs_number, document_ids ) assert len(result) == 1 @@ -150,12 +143,11 @@ def test_get_document_references_by_id_infected_document( nhs_number = "1234567890" document_ids = ["doc-id-4"] mock_document_service.get_batch_document_references_by_id.return_value = [ - sample_document_references[3], + sample_document_references[3] ] result = get_document_upload_status_service.get_document_references_by_id( - nhs_number, - document_ids, + nhs_number, document_ids ) assert len(result) == 1 @@ -163,38 +155,8 @@ def test_get_document_references_by_id_infected_document( assert result["doc-id-4"]["error_code"] == DocumentStatus.INFECTED.code -def test_get_document_references_by_id_invalid_document( - get_document_upload_status_service, - mock_document_service, -): - nhs_number = "1234567890" - document_ids = ["doc-id-invalid"] - - cancelled_doc = DocumentReference( - id="doc-id-invalid", - nhs_number="1234567890", - file_name="invalid_file.pdf", - doc_status=DocumentStatus.CANCELLED.display, - virus_scanner_result=VirusScanResult.INVALID, - ) - - mock_document_service.get_batch_document_references_by_id.return_value = [ - cancelled_doc, - ] - - result = get_document_upload_status_service.get_document_references_by_id( - nhs_number, - document_ids, - ) - - assert len(result) == 1 - assert result["doc-id-invalid"]["status"] == DocumentStatus.INVALID.display - assert result["doc-id-invalid"]["error_code"] == DocumentStatus.INVALID.code - - def test_get_document_references_by_id_cancelled_document( - get_document_upload_status_service, - mock_document_service, + get_document_upload_status_service, mock_document_service ): nhs_number = "1234567890" document_ids = ["doc-id-cancelled"] @@ -209,12 +171,11 @@ def test_get_document_references_by_id_cancelled_document( ) mock_document_service.get_batch_document_references_by_id.return_value = [ - cancelled_doc, + cancelled_doc ] result = get_document_upload_status_service.get_document_references_by_id( - nhs_number, - document_ids, + nhs_number, document_ids ) assert len(result) == 1 @@ -230,12 +191,11 @@ def test_get_document_references_by_id_deleted_document( nhs_number = "1234567890" document_ids = ["doc-id-5"] mock_document_service.get_batch_document_references_by_id.return_value = [ - sample_document_references[4], + sample_document_references[4] ] result = get_document_upload_status_service.get_document_references_by_id( - nhs_number, - document_ids, + nhs_number, document_ids ) assert len(result) == 0 @@ -256,8 +216,7 @@ def test_get_document_references_by_id_multiple_mixed_statuses( ] result = get_document_upload_status_service.get_document_references_by_id( - nhs_number, - document_ids, + nhs_number, document_ids ) assert len(result) == 4 @@ -277,21 +236,18 @@ def test_get_document_references_by_id_multiple_mixed_statuses( def test_get_document_references_by_id_no_results( - get_document_upload_status_service, - mock_document_service, + get_document_upload_status_service, mock_document_service ): nhs_number = "1234567890" document_ids = ["doc-id-6"] mock_document_service.get_batch_document_references_by_id.return_value = [] result = get_document_upload_status_service.get_document_references_by_id( - nhs_number, - document_ids, + nhs_number, document_ids ) mock_document_service.get_batch_document_references_by_id.assert_called_once_with( - document_ids, - SupportedDocumentTypes.LG, + document_ids, SupportedDocumentTypes.LG ) assert result["doc-id-6"]["status"] == DocumentStatus.NOT_FOUND.display assert result["doc-id-6"]["error_code"] == DocumentStatus.NOT_FOUND.code diff --git a/lambdas/tests/unit/services/test_get_fhir_document_reference_service.py b/lambdas/tests/unit/services/test_get_fhir_document_reference_service.py index a018e56dea..47ed6dcd96 100644 --- a/lambdas/tests/unit/services/test_get_fhir_document_reference_service.py +++ b/lambdas/tests/unit/services/test_get_fhir_document_reference_service.py @@ -33,8 +33,7 @@ def test_get_document_reference_service(patched_service): patched_service.document_service.fetch_documents_from_table.return_value = documents actual = patched_service.get_document_references( - "3d8683b9-1665-40d2-8499-6e8302d507ff", - MOCK_LG_TABLE_NAME, + "3d8683b9-1665-40d2-8499-6e8302d507ff", MOCK_LG_TABLE_NAME ) assert actual == documents[0] @@ -45,14 +44,11 @@ def test_handle_get_document_reference_request(patched_service, mocker, set_env) expected = documents[0] mock_document_ref = documents[0] mocker.patch.object( - patched_service, - "get_document_references", - return_value=mock_document_ref, + patched_service, "get_document_references", return_value=mock_document_ref ) actual = patched_service.handle_get_document_reference_request( - SnomedCodes.LLOYD_GEORGE.value.code, - "test-id", + SnomedCodes.LLOYD_GEORGE.value.code, "test-id" ) assert expected == actual @@ -86,8 +82,7 @@ def test_get_presigned_url(patched_service, mocker): ) result = patched_service.get_presigned_url( - "test-s3-bucket", - "9000000009/test-key-123", + "test-s3-bucket", "9000000009/test-key-123" ) assert result == "https://example.com/path/to/resource" @@ -111,7 +106,7 @@ def test_get_document_references_empty_result(patched_service): def test_get_presigned_url_failure(patched_service, mocker): # Test when S3 service raises an exception patched_service.s3_service.create_download_presigned_url.side_effect = Exception( - "S3 error", + "S3 error" ) with pytest.raises(Exception) as exc_info: @@ -122,8 +117,7 @@ def test_get_presigned_url_failure(patched_service, mocker): def test_create_document_reference_fhir_response_with_presign_url_document_data( - patched_service, - mocker, + patched_service, mocker ): # Test creating FHIR response with different document data test_doc = create_test_doc_store_refs()[0] @@ -131,12 +125,12 @@ def test_create_document_reference_fhir_response_with_presign_url_document_data( # Modify the document reference to test different values modified_doc = copy.deepcopy(test_doc) modified_doc.file_name = "different_file.pdf" - modified_doc.file_size = 8000000 modified_doc.created = "2023-05-15T10:30:00.000Z" modified_doc.document_scan_creation = "2023-05-15" + patched_service.s3_service.get_file_size.return_value = 8000000 patched_service.get_presigned_url = mocker.MagicMock( - return_value="https://new-test-url.com", + return_value="https://new-test-url.com" ) result = patched_service.create_document_reference_fhir_response(modified_doc) @@ -171,8 +165,7 @@ def test_create_document_reference_fhir_response_with_binary_document_data( def test_create_document_reference_fhir_response_non_final_status( - patched_service, - mocker, + patched_service, mocker ): """Test FHIR response creation for documents with non-final status.""" test_doc = create_test_doc_store_refs()[0] @@ -194,8 +187,7 @@ def test_create_document_reference_fhir_response_non_final_status( def test_create_document_reference_fhir_response_when_patient_is_deceased( - patched_service, - mocker, + patched_service, mocker ): """Test FHIR response creation for documents with non-final status.""" test_doc = create_test_doc_store_refs()[0] diff --git a/lambdas/tests/unit/services/test_pdf_stitch_service.py b/lambdas/tests/unit/services/test_pdf_stitch_service.py new file mode 100644 index 0000000000..2634e1a1fb --- /dev/null +++ b/lambdas/tests/unit/services/test_pdf_stitch_service.py @@ -0,0 +1,68 @@ +import os +import tempfile +from io import BytesIO + +import pytest +from pypdf import PdfWriter +from pypdf.errors import PyPdfError +from services.pdf_stitch_service import count_page_number, stitch_pdf + + +def test_stitch_pdf(): + test_pdf_folder = "tests/unit/helpers/data/pdf/" + input_test_files = [ + f"{test_pdf_folder}/{filename}" + for filename in ["file1.pdf", "file2.pdf", "file3.pdf"] + ] + + stitched_file = stitch_pdf(input_test_files) + assert count_page_number(stitched_file) == sum( + count_page_number(filepath) for filepath in input_test_files + ) + + os.remove(stitched_file) + + +def test_stitch_pdf_with_given_desc_folder(): + test_pdf_folder = "tests/unit/helpers/data/pdf/" + test_desc_folder = tempfile.mkdtemp() + + input_test_files = [ + f"{test_pdf_folder}/{filename}" + for filename in ["file1.pdf", "file2.pdf", "file3.pdf"] + ] + + stitched_file = stitch_pdf(input_test_files, test_desc_folder) + + assert stitched_file.startswith(test_desc_folder) + + os.remove(stitched_file) + + +def test_stitch_pdf_raise_error_if_fail_to_perform_stitching(): + test_pdf_folder = "tests/unit/helpers/data/pdf/" + input_test_files = [ + f"{test_pdf_folder}/{filename}" for filename in ["invalid_pdf.pdf", "file1.pdf"] + ] + + with pytest.raises(PyPdfError): + stitch_pdf(input_test_files) + + +def test_stitch_pdf_raise_error_when_input_file_not_found(): + test_file = "non-exist-file.pdf" + + with pytest.raises(FileNotFoundError): + stitch_pdf([test_file]) + + +def create_in_memory_pdf(page_count: int = 1) -> BytesIO: + # Creates a PDF in memory with the received number of pages + writer = PdfWriter() + for _ in range(page_count): + writer.add_blank_page(width=72, height=72) + + stream = BytesIO() + writer.write(stream) + stream.seek(0) + return stream diff --git a/lambdas/tests/unit/services/test_pdf_stitching_service.py b/lambdas/tests/unit/services/test_pdf_stitching_service.py index f1b0a73781..4be6959917 100644 --- a/lambdas/tests/unit/services/test_pdf_stitching_service.py +++ b/lambdas/tests/unit/services/test_pdf_stitching_service.py @@ -93,8 +93,7 @@ def mock_upload_stitched_file(mocker, mock_service): @pytest.fixture def mock_update_stitched_reference_with_version_id(mocker, mock_service): return mocker.patch.object( - mock_service, - "update_stitched_reference_with_version_id", + mock_service, "update_stitched_reference_with_version_id" ) @@ -136,10 +135,7 @@ def mock_rollback_reference_migration(mocker, mock_service): @pytest.fixture def mock_download_fileobj(): def _mock_download_fileobj( - s3_object_data: dict[str, BytesIO], - Bucket: str, - Key: str, - Fileobj: BytesIO, + s3_object_data: dict[str, BytesIO], Bucket: str, Key: str, Fileobj: BytesIO ): if Key in s3_object_data: Fileobj.write(s3_object_data[Key].read()) @@ -156,16 +152,14 @@ def _mock_download_fileobj( ], ) def test_retrieve_multipart_references_returns_multipart_references( - mock_service, - doc_type, + mock_service, doc_type ): mock_service.document_service.fetch_available_document_references_by_type.return_value = ( TEST_DOCUMENT_REFERENCES ) actual = mock_service.retrieve_multipart_references( - nhs_number=TEST_NHS_NUMBER, - doc_type=doc_type, + nhs_number=TEST_NHS_NUMBER, doc_type=doc_type ) assert actual == TEST_DOCUMENT_REFERENCES @@ -174,12 +168,11 @@ def test_retrieve_multipart_references_returns_multipart_references( def test_retrieve_multipart_references_returns_empty_list_if_LG_stitched(mock_service): mock_service.document_service.fetch_available_document_references_by_type.return_value = [ - TEST_1_OF_1_DOCUMENT_REFERENCE, + TEST_1_OF_1_DOCUMENT_REFERENCE ] actual = mock_service.retrieve_multipart_references( - nhs_number=TEST_NHS_NUMBER, - doc_type=SupportedDocumentTypes.LG, + nhs_number=TEST_NHS_NUMBER, doc_type=SupportedDocumentTypes.LG ) assert actual == [] @@ -227,7 +220,7 @@ def set_stitched_reference(document_reference, stitch_file_size, *args, **kwargs mock_migrate_multipart_references.assert_called_once() mock_write_stitching_reference.assert_called_once() mock_publish_nrl_message.assert_called_once_with( - snomed_code_doc_type=test_message.snomed_code_doc_type, + snomed_code_doc_type=test_message.snomed_code_doc_type ) @@ -349,10 +342,7 @@ def test_process_stitching(mock_service, mock_download_fileobj): mock_service.s3_service.client.download_fileobj.side_effect = ( lambda Bucket, Key, Fileobj: mock_download_fileobj( - s3_object_data, - Bucket, - Key, - Fileobj, + s3_object_data, Bucket, Key, Fileobj ) ) @@ -376,7 +366,6 @@ def test_migrate_multipart_references(mock_service): "DocumentSnomedCodeType": "16521000000101", "FileLocation": f"{TEST_DOCUMENT_REFERENCES[0].file_location}", "FileName": f"{TEST_DOCUMENT_REFERENCES[0].file_name}", - "FileSize": TEST_DOCUMENT_REFERENCES[0].file_size, "ID": f"{TEST_DOCUMENT_REFERENCES[0].id}", "LastUpdated": 1704110400, "NhsNumber": f"{TEST_DOCUMENT_REFERENCES[0].nhs_number}", @@ -398,7 +387,6 @@ def test_migrate_multipart_references(mock_service): "DocumentSnomedCodeType": "16521000000101", "FileLocation": f"{TEST_DOCUMENT_REFERENCES[1].file_location}", "FileName": f"{TEST_DOCUMENT_REFERENCES[1].file_name}", - "FileSize": TEST_DOCUMENT_REFERENCES[1].file_size, "ID": f"{TEST_DOCUMENT_REFERENCES[1].id}", "LastUpdated": 1704110400, "NhsNumber": f"{TEST_DOCUMENT_REFERENCES[1].nhs_number}", @@ -420,7 +408,6 @@ def test_migrate_multipart_references(mock_service): "DocumentSnomedCodeType": "16521000000101", "FileLocation": f"{TEST_DOCUMENT_REFERENCES[2].file_location}", "FileName": f"{TEST_DOCUMENT_REFERENCES[2].file_name}", - "FileSize": TEST_DOCUMENT_REFERENCES[2].file_size, "ID": f"{TEST_DOCUMENT_REFERENCES[2].id}", "LastUpdated": 1704110400, "NhsNumber": f"{TEST_DOCUMENT_REFERENCES[2].nhs_number}", @@ -446,8 +433,7 @@ def test_migrate_multipart_references(mock_service): def test_migrate_multipart_references_handles_client_error_on_create( - mock_service, - caplog, + mock_service, caplog ): mock_service.multipart_references = TEST_DOCUMENT_REFERENCES mock_service.dynamo_service.create_item.side_effect = MOCK_CLIENT_ERROR @@ -460,8 +446,7 @@ def test_migrate_multipart_references_handles_client_error_on_create( def test_migrate_multipart_references_handles_client_error_on_delete( - mock_service, - caplog, + mock_service, caplog ): mock_service.multipart_references = TEST_DOCUMENT_REFERENCES mock_service.dynamo_service.delete_item.side_effect = MOCK_CLIENT_ERROR @@ -519,7 +504,7 @@ def test_publish_nrl_message(mock_service, mock_uuid): ) mock_service.publish_nrl_message( - snomed_code_doc_type=SnomedCodes.LLOYD_GEORGE.value, + snomed_code_doc_type=SnomedCodes.LLOYD_GEORGE.value ) mock_service.sqs_service.send_message_fifo.assert_called_once_with( @@ -535,7 +520,7 @@ def test_publish_nrl_message_handles_client_error(mock_service): with pytest.raises(PdfStitchingException): mock_service.publish_nrl_message( - snomed_code_doc_type=SnomedCodes.LLOYD_GEORGE.value, + snomed_code_doc_type=SnomedCodes.LLOYD_GEORGE.value ) @@ -563,9 +548,7 @@ def test_sort_multipart_object_keys_raises_exception(mock_service): def test_rollback_stitching_process_successfully_rolls_back( - mock_service, - mock_rollback_stitched_reference, - mock_rollback_reference_migration, + mock_service, mock_rollback_stitched_reference, mock_rollback_reference_migration ): mock_service.stitched_reference = TEST_1_OF_1_DOCUMENT_REFERENCE mock_service.multipart_references = TEST_DOCUMENT_REFERENCES @@ -582,12 +565,10 @@ def test_rollback_stitched_reference(mock_service): mock_service.rollback_stitched_reference() mock_service.dynamo_service.delete_item.assert_called_once_with( - table_name=MOCK_LG_TABLE_NAME, - key={"ID": TEST_1_OF_1_DOCUMENT_REFERENCE.id}, + table_name=MOCK_LG_TABLE_NAME, key={"ID": TEST_1_OF_1_DOCUMENT_REFERENCE.id} ) mock_service.s3_service.delete_object.assert_called_once_with( - s3_bucket_name=MOCK_LG_BUCKET, - file_key=f"{TEST_NHS_NUMBER}/test-key-123", + s3_bucket_name=MOCK_LG_BUCKET, file_key=f"{TEST_NHS_NUMBER}/test-key-123" ) @@ -612,96 +593,8 @@ def test_rollback_reference_migration(mock_service): mock_service.rollback_reference_migration() - mock_service.dynamo_service.create_item.assert_has_calls( - [ - call( - table_name=MOCK_LG_TABLE_NAME, - item={ - "ContentType": "application/pdf", - "Created": TEST_DOCUMENT_REFERENCES[0].created, - "CurrentGpOds": TEST_DOCUMENT_REFERENCES[0].current_gp_ods, - "DocStatus": "final", - "DocumentScanCreation": "2024-01-01", - "DocumentSnomedCodeType": "16521000000101", - "FileLocation": f"{TEST_DOCUMENT_REFERENCES[0].file_location}", - "FileName": f"{TEST_DOCUMENT_REFERENCES[0].file_name}", - "FileSize": TEST_DOCUMENT_REFERENCES[0].file_size, - "ID": f"{TEST_DOCUMENT_REFERENCES[0].id}", - "LastUpdated": 1704110400, - "NhsNumber": f"{TEST_DOCUMENT_REFERENCES[0].nhs_number}", - "S3FileKey": f"{TEST_DOCUMENT_REFERENCES[0].s3_file_key}", - "Status": "current", - "Version": "1", - "Uploaded": True, - "Uploading": False, - "VirusScannerResult": "Clean", - }, - ), - call( - table_name=MOCK_LG_TABLE_NAME, - item={ - "ContentType": "application/pdf", - "Created": TEST_DOCUMENT_REFERENCES[1].created, - "CurrentGpOds": TEST_DOCUMENT_REFERENCES[1].current_gp_ods, - "DocStatus": "final", - "DocumentScanCreation": "2024-01-01", - "DocumentSnomedCodeType": "16521000000101", - "FileLocation": f"{TEST_DOCUMENT_REFERENCES[1].file_location}", - "FileName": f"{TEST_DOCUMENT_REFERENCES[1].file_name}", - "FileSize": TEST_DOCUMENT_REFERENCES[1].file_size, - "ID": f"{TEST_DOCUMENT_REFERENCES[1].id}", - "LastUpdated": 1704110400, - "NhsNumber": f"{TEST_DOCUMENT_REFERENCES[1].nhs_number}", - "S3FileKey": f"{TEST_DOCUMENT_REFERENCES[1].s3_file_key}", - "Status": "current", - "Version": "1", - "Uploaded": True, - "Uploading": False, - "VirusScannerResult": "Clean", - }, - ), - call( - table_name=MOCK_LG_TABLE_NAME, - item={ - "ContentType": "application/pdf", - "Created": TEST_DOCUMENT_REFERENCES[2].created, - "CurrentGpOds": TEST_DOCUMENT_REFERENCES[2].current_gp_ods, - "DocStatus": "final", - "DocumentScanCreation": "2024-01-01", - "DocumentSnomedCodeType": "16521000000101", - "FileLocation": f"{TEST_DOCUMENT_REFERENCES[2].file_location}", - "FileName": f"{TEST_DOCUMENT_REFERENCES[2].file_name}", - "FileSize": TEST_DOCUMENT_REFERENCES[2].file_size, - "ID": f"{TEST_DOCUMENT_REFERENCES[2].id}", - "LastUpdated": 1704110400, - "NhsNumber": f"{TEST_DOCUMENT_REFERENCES[2].nhs_number}", - "S3FileKey": f"{TEST_DOCUMENT_REFERENCES[2].s3_file_key}", - "Status": "current", - "Version": "1", - "Uploaded": True, - "Uploading": False, - "VirusScannerResult": "Clean", - }, - ), - ], - ) - - mock_service.dynamo_service.delete_item.assert_has_calls( - [ - call( - table_name=MOCK_UNSTITCHED_LG_TABLE_NAME, - key={"ID": TEST_DOCUMENT_REFERENCES[0].id}, - ), - call( - table_name=MOCK_UNSTITCHED_LG_TABLE_NAME, - key={"ID": TEST_DOCUMENT_REFERENCES[1].id}, - ), - call( - table_name=MOCK_UNSTITCHED_LG_TABLE_NAME, - key={"ID": TEST_DOCUMENT_REFERENCES[2].id}, - ), - ], - ) + assert mock_service.dynamo_service.create_item.call_count == 3 + assert mock_service.dynamo_service.delete_item.call_count == 3 def test_rollback_reference_migration_handles_exception(mock_service): @@ -725,15 +618,13 @@ def test_update_stitched_reference_with_version_id(mock_service): mock_service.update_stitched_reference_with_version_id() mock_service.s3_service.get_head_object.assert_called_once_with( - MOCK_LG_BUCKET, - TEST_1_OF_1_DOCUMENT_REFERENCE.s3_file_key, + MOCK_LG_BUCKET, TEST_1_OF_1_DOCUMENT_REFERENCE.s3_file_key ) assert mock_service.stitched_reference.s3_version_id == test_version_id def test_process_manual_trigger_calls_process_message_for_each_nhs_number( - mocker, - mock_service, + mocker, mock_service ): test_ods_code = "A12345" test_nhs_numbers = ["1234567890", "9876543210"] @@ -744,7 +635,7 @@ def test_process_manual_trigger_calls_process_message_for_each_nhs_number( return_value=test_nhs_numbers, ) mock_send_message = mocker.patch( - "lambdas.services.pdf_stitching_service.SQSService.send_message_batch_standard", + "lambdas.services.pdf_stitching_service.SQSService.send_message_batch_standard" ) mock_service.process_manual_trigger(ods_code=test_ods_code, queue_url="url") @@ -754,8 +645,7 @@ def test_process_manual_trigger_calls_process_message_for_each_nhs_number( def test_calculate_created_date_returns_now_when_no_created_values( - mock_service, - patch_pdf_stitching_service_datetime, + mock_service, patch_pdf_stitching_service_datetime ): mock_service.multipart_references = copy.deepcopy(TEST_DOCUMENT_REFERENCES) for r in mock_service.multipart_references: @@ -763,13 +653,12 @@ def test_calculate_created_date_returns_now_when_no_created_values( actual = mock_service.calculate_created_date() assert actual == patch_pdf_stitching_service_datetime.strftime( - "%Y-%m-%dT%H:%M:%S.%fZ", + "%Y-%m-%dT%H:%M:%S.%fZ" ) def test_calculate_created_date_returns_now_when_all_created_invalid( - mock_service, - patch_pdf_stitching_service_datetime, + mock_service, patch_pdf_stitching_service_datetime ): mock_service.multipart_references = copy.deepcopy(TEST_DOCUMENT_REFERENCES) mock_service.multipart_references[0].created = "not-a-date" @@ -778,7 +667,7 @@ def test_calculate_created_date_returns_now_when_all_created_invalid( actual = mock_service.calculate_created_date() assert actual == patch_pdf_stitching_service_datetime.strftime( - "%Y-%m-%dT%H:%M:%S.%fZ", + "%Y-%m-%dT%H:%M:%S.%fZ" ) @@ -806,8 +695,7 @@ def test_retrieve_multipart_references_returns_empty_if_any_1of1_present_for_lg( ) actual = mock_service.retrieve_multipart_references( - nhs_number=TEST_NHS_NUMBER, - doc_type=SupportedDocumentTypes.LG, + nhs_number=TEST_NHS_NUMBER, doc_type=SupportedDocumentTypes.LG ) assert actual == [] @@ -868,8 +756,7 @@ def set_stitched_reference(document_reference, stitch_file_size, *args, **kwargs mock_create_stitched_reference.side_effect = set_stitched_reference mock_upload_stitched_file.side_effect = PdfStitchingException( - 400, - LambdaError.StitchError, + 400, LambdaError.StitchError ) with pytest.raises(PdfStitchingException): @@ -885,7 +772,7 @@ def test_process_manual_trigger_returns_early_if_no_nhs_numbers(mock_service, mo return_value=[], ) mock_send_batch = mocker.patch( - "lambdas.services.pdf_stitching_service.SQSService.send_message_batch_standard", + "lambdas.services.pdf_stitching_service.SQSService.send_message_batch_standard" ) mock_service.process_manual_trigger(ods_code="A12345", queue_url="url") @@ -894,9 +781,7 @@ def test_process_manual_trigger_returns_early_if_no_nhs_numbers(mock_service, mo def test_process_manual_trigger_logs_error_when_batch_has_failures( - mock_service, - mocker, - caplog, + mock_service, mocker, caplog ): test_nhs_numbers = ["1234567890"] mocker.patch.object( diff --git a/lambdas/tests/unit/services/test_pdm_get_fhir_document_reference_search_service.py b/lambdas/tests/unit/services/test_pdm_get_fhir_document_reference_search_service.py index c0e275b41e..3ec59484fa 100644 --- a/lambdas/tests/unit/services/test_pdm_get_fhir_document_reference_search_service.py +++ b/lambdas/tests/unit/services/test_pdm_get_fhir_document_reference_search_service.py @@ -4,12 +4,12 @@ from freezegun import freeze_time from models.document_reference import DocumentReference from services.document_reference_search_service import DocumentReferenceSearchService -from tests.unit.conftest import APIM_API_URL, MOCK_LG_TABLE_NAME +from tests.unit.conftest import APIM_API_URL from tests.unit.helpers.data.dynamo.dynamo_responses import MOCK_SEARCH_RESPONSE from utils.lambda_header_utils import validate_common_name_in_mtls MOCK_DOCUMENT_REFERENCE = [ - DocumentReference.model_validate(MOCK_SEARCH_RESPONSE["Items"][0]), + DocumentReference.model_validate(MOCK_SEARCH_RESPONSE["Items"][0]) ] MOCK_FILE_SIZE = 24000 @@ -77,20 +77,16 @@ def mock_mtls_common_names(monkeypatch): }, }, }, - "dev_COREDocumentMetadata", + ["dev_COREDocumentMetadata"], ), - ({}, MOCK_LG_TABLE_NAME), + ({}, ["test_pdm_dynamoDB_table", "test_lg_dynamoDB_table"]), ], ) def test_get_pdm_table( - set_env, - mock_document_service, - common_name, - expected, - mock_mtls_common_names, + set_env, mock_document_service, common_name, expected, mock_mtls_common_names ): cn = validate_common_name_in_mtls(common_name) - tables = mock_document_service._get_table_name(cn) + tables = mock_document_service._get_table_names(cn) assert tables == expected @@ -105,13 +101,13 @@ def test_create_document_reference_fhir_response(mock_document_service, mocker): mock_document_reference.document_snomed_code_type = "717391000000106" mock_attachment = mocker.patch( - "services.document_reference_search_service.Attachment", + "services.document_reference_search_service.Attachment" ) mock_attachment_instance = mocker.MagicMock() mock_attachment.return_value = mock_attachment_instance mock_doc_ref_info = mocker.patch( - "services.document_reference_search_service.DocumentReferenceInfo", + "services.document_reference_search_service.DocumentReferenceInfo" ) mock_doc_ref_info_instance = mocker.MagicMock() mock_doc_ref_info.return_value = mock_doc_ref_info_instance @@ -130,7 +126,7 @@ def test_create_document_reference_fhir_response(mock_document_service, mocker): "identifier": { "system": "https://fhir.nhs.uk/Id/nhs-number", "value": "9000000009", - }, + } }, "content": [ { @@ -140,28 +136,28 @@ def test_create_document_reference_fhir_response(mock_document_service, mocker): "title": "test_document.pdf", "creation": "2023-05-01", "url": f"{APIM_API_URL}/DocumentReference/123", - }, - }, + } + } ], "author": [ { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "Y05868", - }, - }, + } + } ], "custodian": { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "Y05868", - }, + } }, } mock_fhir_doc_ref.model_dump.return_value = expected_fhir_response result = mock_document_service.create_document_reference_fhir_response( - mock_document_reference, + mock_document_reference ) mock_attachment.assert_called_once_with( @@ -185,8 +181,7 @@ def test_create_document_reference_fhir_response(mock_document_service, mocker): @freeze_time("2023-05-01T12:00:00Z") def test_create_document_reference_fhir_response_integration( - mock_document_service, - mocker, + mock_document_service, mocker ): mock_document_reference = mocker.MagicMock() mock_document_reference.nhs_number = "9000000009" @@ -210,7 +205,7 @@ def test_create_document_reference_fhir_response_integration( "identifier": { "system": "https://fhir.nhs.uk/Id/nhs-number", "value": "9000000009", - }, + } }, "date": "2023-05-01T12:00:00", "content": [ @@ -221,22 +216,22 @@ def test_create_document_reference_fhir_response_integration( "title": "test_document.pdf", "creation": "2023-05-01", "url": f"{APIM_API_URL}/DocumentReference/717391000000106~Y05868-1634567890", - }, - }, + } + } ], "author": [ { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "Y12345", - }, - }, + } + } ], "custodian": { "identifier": { "system": "https://fhir.nhs.uk/Id/ods-organization-code", "value": "Y12345", - }, + } }, "type": { "coding": [ @@ -244,14 +239,14 @@ def test_create_document_reference_fhir_response_integration( "system": "http://snomed.info/sct", "code": "717391000000106", "display": "Confidential patient data", - }, - ], + } + ] }, "meta": {"versionId": "1"}, } result = mock_document_service.create_document_reference_fhir_response( - mock_document_reference, + mock_document_reference ) assert isinstance(result, dict) diff --git a/lambdas/tests/unit/services/test_upload_document_reference_service.py b/lambdas/tests/unit/services/test_upload_document_reference_service.py index d8b6a5e865..e030d461fd 100644 --- a/lambdas/tests/unit/services/test_upload_document_reference_service.py +++ b/lambdas/tests/unit/services/test_upload_document_reference_service.py @@ -11,7 +11,7 @@ FinalOrPreliminaryAndNotSuperseded, PreliminaryStatus, ) -from utils.exceptions import DocumentServiceException, FileProcessingException +from utils.exceptions import DocumentServiceException, FileProcessingException, TransactionConflictException from utils.lambda_exceptions import InvalidDocTypeException from lambdas.enums.snomed_codes import SnomedCodes @@ -23,7 +23,6 @@ def mock_document_reference(): doc_ref = DocumentReference.model_construct() doc_ref.id = "test-doc-id" doc_ref.nhs_number = "9000000001" - doc_ref.file_name = "test-file.txt" doc_ref.s3_file_key = "original/test-key" doc_ref.s3_bucket_name = "original-bucket" doc_ref.file_location = "original-location" @@ -32,7 +31,7 @@ def mock_document_reference(): doc_ref.doc_status = "preliminary" doc_ref.version = "1" doc_ref._build_s3_location = Mock( - return_value="s3://test-lg-bucket/9000000001/test-doc-id", + return_value="s3://test-lg-bucket/9000000001/test-doc-id" ) return doc_ref @@ -42,13 +41,13 @@ def mock_virus_scan_service( mocker, ): mock = mocker.patch( - "services.upload_document_reference_service.get_virus_scan_service", + "services.upload_document_reference_service.get_virus_scan_service" ) yield mock @pytest.fixture -def service(set_env, mock_virus_scan_service, mocker): +def service(set_env, mock_virus_scan_service): with patch.multiple( "services.upload_document_reference_service", DocumentService=Mock(), @@ -60,11 +59,6 @@ def service(set_env, mock_virus_scan_service, mocker): service.dynamo_service = Mock() service.virus_scan_service = MockVirusScanService() service.s3_service = Mock() - mocker.patch("io.BytesIO", return_value=None) - mocker.patch( - "services.upload_document_reference_service.check_file_locked_or_corrupt", - return_value=False, - ) return service @@ -77,39 +71,33 @@ def test_handle_upload_document_reference_request_with_empty_object_key(service) def test_handle_upload_document_reference_request_with_none_object_key(service): """Test handling of a None object key""" - service.handle_upload_document_reference_request("", 122) + service.handle_upload_document_reference_request(None, 122) service.document_service.fetch_documents_from_table.assert_not_called() def test_handle_upload_document_reference_request_success( - service, - mock_document_reference, - mocker, + service, mock_document_reference, mocker ): + """Test successful handling of the upload document reference request""" object_key = "staging/test-doc-id" object_size = 1111 mock_document_reference2 = Mock(spec=DocumentReference) - mock_document_reference2.file_name = "filename2.txt" mock_document_reference2.id = "another-doc-id" mock_document_reference2.doc_status = "final" mock_document_reference2.version = "1" service.s3_service.copy_across_bucket.return_value = { - "VersionId": "test-version-id", + "VersionId": "test-version-id" } - mocker.patch("io.BytesIO", return_value=None) - mocker.patch( - "services.upload_document_reference_service.check_file_locked_or_corrupt", - return_value=False, - ) + # First call fetches preliminary doc, second call fetches existing final docs to supersede service.document_service.fetch_documents_from_table.side_effect = [ [mock_document_reference], [mock_document_reference2], ] service.virus_scan_service.scan_file = mocker.MagicMock( - return_value=VirusScanResult.CLEAN, + return_value=VirusScanResult.CLEAN ) service.handle_upload_document_reference_request(object_key, object_size) @@ -126,7 +114,7 @@ def test_handle_upload_document_reference_request_with_exception(service): object_key = "staging/test-doc-id" service.document_service.fetch_documents_from_table.side_effect = Exception( - "Test error", + "Test error" ) service.handle_upload_document_reference_request(object_key) @@ -137,7 +125,7 @@ def test_fetch_preliminary_document_reference_success(service, mock_document_ref document_key = "test-doc-id" service.table_name = "dev_LloydGeorgeReferenceMetadata" service.document_service.fetch_documents_from_table.return_value = [ - mock_document_reference, + mock_document_reference ] result = service._fetch_preliminary_document_reference(document_key) @@ -162,8 +150,7 @@ def test_fetch_preliminary_document_reference_no_documents_found(service): def test_fetch_preliminary_document_reference_multiple_documents_warning( - service, - mock_document_reference, + service, mock_document_reference ): """Test handling when multiple documents are found""" document_key = "test-doc-id" @@ -190,30 +177,23 @@ def test_fetch_preliminary_document_reference_exception(service): def test__process_preliminary_document_reference_clean_virus_scan( - service, - mock_document_reference, - mocker, + service, mock_document_reference, mocker ): """Test processing document reference with a clean virus scan""" object_key = "staging/test-doc-id" mocker.patch.object( - service, - "_perform_virus_scan", - return_value=VirusScanResult.CLEAN, + service, "_perform_virus_scan", return_value=VirusScanResult.CLEAN ) mock_delete = mocker.patch.object(service, "delete_file_from_staging_bucket") mock_process_clean = mocker.patch.object(service, "_process_clean_document") mock_finalize_transaction = mocker.patch.object( - service, - "_finalize_and_supersede_with_transaction", + service, "_finalize_and_supersede_with_transaction" ) service._process_preliminary_document_reference( - mock_document_reference, - object_key, - 1222, + mock_document_reference, object_key, 1222 ) mock_process_clean.assert_called_once() @@ -225,33 +205,26 @@ def test__process_preliminary_document_reference_clean_virus_scan( def test__process_preliminary_document_reference_infected_virus_scan( - service, - mock_document_reference, - mocker, + service, mock_document_reference, mocker ): """Test processing document reference with an infected virus scan""" object_key = "staging/test-doc-id" mocker.patch.object( - service, - "_perform_virus_scan", - return_value=VirusScanResult.INFECTED, + service, "_perform_virus_scan", return_value=VirusScanResult.INFECTED ) mock_delete = mocker.patch.object(service, "delete_file_from_staging_bucket") mock_process_clean = mocker.patch.object(service, "_process_clean_document") mock_update_dynamo = mocker.patch.object(service, "_update_dynamo_table") service._process_preliminary_document_reference( - mock_document_reference, - object_key, - 1222, + mock_document_reference, object_key, 1222 ) mock_process_clean.assert_not_called() mock_update_dynamo.assert_called_once() mock_delete.assert_called_once_with(object_key) - def test_perform_virus_scan_returns_clean_hardcoded(service, mock_document_reference): """Test virus scan returns hardcoded CLEAN result""" object_key = "staging/test-doc-id" @@ -260,9 +233,7 @@ def test_perform_virus_scan_returns_clean_hardcoded(service, mock_document_refer def test_perform_virus_scan_exception_returns_infected( - service, - mock_document_reference, - mocker, + service, mock_document_reference, mocker ): """Test virus scan exception handling returns INFECTED for safety""" mock_virus_service = mocker.patch.object(service, "virus_scan_service") @@ -289,9 +260,7 @@ def test_process_clean_document_success(service, mock_document_reference, mocker def test_process_clean_document_exception_restores_original_values( - service, - mock_document_reference, - mocker, + service, mock_document_reference, mocker ): """Test that original values are restored when processing fails""" object_key = "staging/test-doc-id" @@ -300,9 +269,7 @@ def test_process_clean_document_exception_restores_original_values( original_location = "original-location" mocker.patch.object( - service, - "copy_files_from_staging_bucket", - side_effect=Exception("Copy failed"), + service, "copy_files_from_staging_bucket", side_effect=Exception("Copy failed") ) with pytest.raises(FileProcessingException): service._process_clean_document( @@ -339,7 +306,7 @@ def test_copy_files_from_staging_bucket_client_error(service, mock_document_refe source_file_key = "staging/test-doc-id" client_error = ClientError( error_response={ - "Error": {"Code": "NoSuchBucket", "Message": "Bucket does not exist"}, + "Error": {"Code": "NoSuchBucket", "Message": "Bucket does not exist"} }, operation_name="CopyObject", ) @@ -356,8 +323,7 @@ def test_delete_file_from_staging_bucket_success(service): service.delete_file_from_staging_bucket(source_file_key) service.s3_service.delete_object.assert_called_once_with( - MOCK_STAGING_STORE_BUCKET, - source_file_key, + MOCK_STAGING_STORE_BUCKET, source_file_key ) @@ -370,8 +336,7 @@ def test_delete_pdm_file_from_staging_bucket_success(service): service.delete_file_from_staging_bucket(source_file_key) service.s3_service.delete_object.assert_called_once_with( - MOCK_STAGING_STORE_BUCKET, - source_file_key, + MOCK_STAGING_STORE_BUCKET, source_file_key ) @@ -380,7 +345,7 @@ def test_delete_file_from_staging_bucket_client_error(service): source_file_key = "staging/test-doc-id" client_error = ClientError( error_response={ - "Error": {"Code": "NoSuchKey", "Message": "Key does not exist"}, + "Error": {"Code": "NoSuchKey", "Message": "Key does not exist"} }, operation_name="DeleteObject", ) @@ -424,10 +389,7 @@ def test_update_dynamo_table_client_error(service, mock_document_reference): """Test handling of ClientError during DynamoDB update""" client_error = ClientError( error_response={ - "Error": { - "Code": "ResourceNotFoundException", - "Message": "Table not found", - }, + "Error": {"Code": "ResourceNotFoundException", "Message": "Table not found"} }, operation_name="UpdateItem", ) @@ -456,7 +418,7 @@ def test_document_key_extraction_from_object_key_for_lg( # First call returns preliminary doc, second call returns empty list (no existing finals) service.s3_service.copy_across_bucket.return_value = { - "VersionId": "test-version-id", + "VersionId": "test-version-id" } service.document_service.fetch_documents_from_table.side_effect = [ @@ -484,8 +446,7 @@ def test_document_key_extraction_from_object_key_for_lg( def test_finalize_and_supersede_with_transaction_with_existing_finals( - service, - mock_document_reference, + service, mock_document_reference, mocker ): """Test transaction-based finalisation with existing final documents to supersede""" new_doc = mock_document_reference @@ -502,7 +463,7 @@ def test_finalize_and_supersede_with_transaction_with_existing_finals( service.table_name = "dev_LloydGeorgeReferenceMetadata" service.document_service.fetch_documents_from_table.return_value = [ - existing_final_doc, + existing_final_doc ] mock_build_update = Mock(return_value={"Update": "transaction1"}) @@ -550,8 +511,7 @@ def test_finalize_and_supersede_with_transaction_with_existing_finals( def test_finalize_and_supersede_with_transaction_no_existing_docs( - service, - mock_document_reference, + service, mock_document_reference, mocker ): """Test transaction-based finalization when no existing final documents found""" new_doc = mock_document_reference @@ -575,8 +535,7 @@ def test_finalize_and_supersede_with_transaction_no_existing_docs( def test_finalize_and_supersede_with_transaction_multiple_existing( - service, - mock_document_reference, + service, mock_document_reference, mocker ): """Test transaction-based finalization superseding multiple existing final documents""" new_doc = mock_document_reference @@ -612,8 +571,7 @@ def test_finalize_and_supersede_with_transaction_multiple_existing( def test_finalize_and_supersede_with_transaction_skips_same_id( - service, - mock_document_reference, + service, mock_document_reference, mocker ): """Test that transaction skips documents with the same ID""" new_doc = mock_document_reference @@ -641,8 +599,7 @@ def test_finalize_and_supersede_with_transaction_skips_same_id( def test_finalize_and_supersede_with_transaction_handles_transaction_cancelled( - service, - mock_document_reference, + service, mock_document_reference ): new_doc = mock_document_reference @@ -682,34 +639,25 @@ def test_handle_upload_document_reference_request_no_document_found(service): def test_process_preliminary_document_reference_exception_during_processing( - service, - mock_document_reference, - mocker, + service, mock_document_reference, mocker ): """Test that exceptions during processing are properly raised""" object_key = "staging/test-doc-id" mocker.patch.object( - service, - "_perform_virus_scan", - return_value=VirusScanResult.CLEAN, + service, "_perform_virus_scan", return_value=VirusScanResult.CLEAN ) mocker.patch.object( - service, - "_process_clean_document", - side_effect=Exception("Processing failed"), + service, "_process_clean_document", side_effect=Exception("Processing failed") ) with pytest.raises(Exception) as exc_info: service._process_preliminary_document_reference( - mock_document_reference, - object_key, - 1222, + mock_document_reference, object_key, 1222 ) assert "Processing failed" in str(exc_info.value) - def test_get_infrastructure_for_document_key_non_pdm(service): assert service.table_name == "" infra = service._get_infrastructure_for_document_key(object_parts=["1234", "123"]) @@ -742,32 +690,3 @@ def test_get_infra_invalid_doc_type(monkeypatch, service): # Call function and assert the exception is raised with pytest.raises(InvalidDocTypeException): service._get_infrastructure_for_document_key(["fhir_upload", "999999"]) - - -def test_is_file_invalid_calls_correct_functions(service, mocker): - """Test that is_file_invalid calls the right functions in the correct order""" - object_key = "test-folder/test-file.docx" - file_extension = "docx" - file_content = b"fake docx file content" - - mock_stream = Mock() - mock_stream.read.return_value = file_content - service.s3_service.get_object_stream.return_value = mock_stream - mock_bytesio = mocker.patch("services.upload_document_reference_service.io.BytesIO") - mock_file_stream = Mock() - mock_bytesio.return_value = mock_file_stream - mock_check = mocker.patch( - "services.upload_document_reference_service.check_file_locked_or_corrupt", - return_value=True, - ) - - result = service.is_file_invalid(object_key, file_extension) - - assert result is True - service.s3_service.get_object_stream.assert_called_once_with( - service.staging_s3_bucket_name, - object_key, - ) - mock_stream.read.assert_called_once_with() - mock_bytesio.assert_called_once_with(file_content) - mock_check.assert_called_once_with(mock_file_stream, file_extension) diff --git a/lambdas/tests/unit/utils/test_file_utils.py b/lambdas/tests/unit/utils/test_file_utils.py index a6dd202289..3a225f1841 100644 --- a/lambdas/tests/unit/utils/test_file_utils.py +++ b/lambdas/tests/unit/utils/test_file_utils.py @@ -1,11 +1,4 @@ -from io import BytesIO -from unittest.mock import MagicMock, Mock, patch - -import pytest -from utils.file_utils import ( - check_file_locked_or_corrupt, - convert_csv_dictionary_to_bytes, -) +from utils.file_utils import convert_csv_dictionary_to_bytes def test_convert_csv_dictionary_to_bytes(): @@ -16,144 +9,10 @@ def test_convert_csv_dictionary_to_bytes(): ] result_bytes = convert_csv_dictionary_to_bytes( - headers=headers, - csv_dict_data=metadata_csv_data, - encoding="utf-8", + headers=headers, csv_dict_data=metadata_csv_data, encoding="utf-8" ) result_str = result_bytes.decode("utf-8") expected_output = "id,name,age\r\n1,Alice,30\r\n2,Bob,25\r\n" assert result_str == expected_output - - -@pytest.mark.parametrize( - "file_extension,file_content,expected_result", - [ - ("pdf", b"%PDF-1.4\nsome content", False), - ("zip", b"PK\x03\x04some zip content", False), - ], - ids=["pdf_file", "zip_file"], -) -def test_skipped_file_types(file_extension, file_content, expected_result): - file_stream = BytesIO(file_content) - result = check_file_locked_or_corrupt(file_stream, file_extension) - assert result == expected_result - - -@pytest.mark.parametrize( - "file_extension,is_encrypted,expected_result", - [ - ("docx", False, False), - ("docx", True, True), - ("xlsx", False, False), - ("xlsx", True, True), - ("pptx", False, False), - ("pptx", True, True), - ("doc", False, False), - ("doc", True, True), - ("xls", False, False), - ("xls", True, True), - ("ppt", False, False), - ("ppt", True, True), - ], -) -@patch("utils.file_utils.msoffcrypto.OfficeFile") -def test_office_files(mock_office_file, file_extension, is_encrypted, expected_result): - mock_instance = Mock() - mock_instance.is_encrypted.return_value = is_encrypted - mock_office_file.return_value = mock_instance - - file_stream = BytesIO(b"fake office content") - result = check_file_locked_or_corrupt(file_stream, file_extension) - - assert result == expected_result - mock_office_file.assert_called_once_with(file_stream) - mock_instance.is_encrypted.assert_called_once() - - -@pytest.mark.parametrize( - "file_extension,file_content,expected_result", - [ - ( - "rtf", - b"{\\rtf1\\ansi\\deff0 {\\fonttbl {\\f0 Times New Roman;}}\\f0\\fs60 Hello!}", - False, - ), - ("rtf", b"This is not an RTF file", True), - ("csv", b"name,age,city\nAlice,30,NYC\nBob,25,LA", False), - ("csv", b"\xff\xfe Invalid UTF-8", True), - ("json", b'{"key": "value", "number": 123}', False), - ("txt", b"This is a simple text file.\nWith multiple lines.", False), - ("txt", b"", False), - ("xml", b'data', False), - ], -) -def test_text_based_files(file_extension, file_content, expected_result): - file_stream = BytesIO(file_content) - result = check_file_locked_or_corrupt(file_stream, file_extension) - assert result == expected_result - - -@pytest.mark.parametrize( - "file_extension", - [ - "jpg", - "jpeg", - "png", - "tiff", - "tif", - ], - ids=["jpg", "jpeg", "png", "tiff", "tif"], -) -@patch("utils.file_utils.Image.open") -def test_image_files_valid(mock_image_open, file_extension): - mock_img = MagicMock() - mock_image_open.return_value.__enter__.return_value = mock_img - - file_stream = BytesIO(b"fake image content") - result = check_file_locked_or_corrupt(file_stream, file_extension) - - assert result is False - mock_image_open.assert_called_once_with(file_stream) - mock_img.verify.assert_called_once() - - -@pytest.mark.parametrize( - "file_extension", - ["jpg", "png", "tiff"], -) -@patch("utils.file_utils.Image.open") -def test_image_files_corrupt(mock_image_open, file_extension): - mock_image_open.side_effect = Exception("Corrupt image") - - file_stream = BytesIO(b"corrupt image data") - result = check_file_locked_or_corrupt(file_stream, file_extension) - - assert result is True - - -@pytest.mark.parametrize( - "file_extension", - ["unknown", "mp4", "mp3", "avi", "mov"], - ids=["unknown", "mp4", "mp3", "avi", "mov"], -) -def test_unsupported_file_extensions(file_extension): - file_stream = BytesIO(b"some content") - result = check_file_locked_or_corrupt(file_stream, file_extension) - assert result is False - - -@pytest.mark.parametrize( - "file_extension", - ["docx", "xlsx", "pptx", "doc", "xls"], - ids=["docx", "xlsx", "pptx", "doc", "xls"], -) -@patch("utils.file_utils.msoffcrypto.OfficeFile") -def test_office_file_exception_returns_true(mock_office_file, file_extension): - mock_office_file.side_effect = Exception("Unable to process file") - - file_stream = BytesIO(b"corrupt office content") - result = check_file_locked_or_corrupt(file_stream, file_extension) - - assert result is True diff --git a/lambdas/utils/constants/file_extensions.py b/lambdas/utils/constants/file_extensions.py deleted file mode 100644 index 4e04dfd004..0000000000 --- a/lambdas/utils/constants/file_extensions.py +++ /dev/null @@ -1,3 +0,0 @@ -TEXT_FILE_EXTENSIONS = ["rtf", "csv", "json", "txt", "xml"] -MEDIA_FILE_EXTENSIONS = ["jpg", "jpeg", "png", "tiff", "tif"] -MICROSOFT_OFFICE_FILE_EXTENSIONS = ["docx", "xlsx", "pptx", "doc", "xls", "ppt"] diff --git a/lambdas/utils/file_utils.py b/lambdas/utils/file_utils.py index 90e5d9ed0b..ec24c67bc3 100644 --- a/lambdas/utils/file_utils.py +++ b/lambdas/utils/file_utils.py @@ -1,22 +1,9 @@ import csv from io import BytesIO, TextIOWrapper -import msoffcrypto -from PIL import Image -from utils.audit_logging_setup import LoggingService -from utils.constants.file_extensions import ( - MEDIA_FILE_EXTENSIONS, - MICROSOFT_OFFICE_FILE_EXTENSIONS, - TEXT_FILE_EXTENSIONS, -) - -logger = LoggingService(__name__) - def convert_csv_dictionary_to_bytes( - headers: list[str], - csv_dict_data: list[dict], - encoding: str = "utf-8", + headers: list[str], csv_dict_data: list[dict], encoding: str = "utf-8" ) -> bytes: csv_buffer = BytesIO() csv_text_wrapper = TextIOWrapper(csv_buffer, encoding=encoding, newline="") @@ -33,40 +20,3 @@ def convert_csv_dictionary_to_bytes( csv_buffer.close() return result - - -def check_file_locked_or_corrupt(file_stream, ext): - file_stream.seek(0) - try: - if ext == "pdf" or ext == "zip": - # Skipping PDF check, as this is covered by the antivirus scan - logger.info(f"Skipping check for {ext} files") - return False - - if ext in MICROSOFT_OFFICE_FILE_EXTENSIONS: - office_file = msoffcrypto.OfficeFile(file_stream) - encrypt = office_file.is_encrypted() - return encrypt - - if ext in TEXT_FILE_EXTENSIONS: - sample = file_stream.read(1024) - sample.decode("utf-8") - if ext == "rtf" and not sample.startswith(b"{\\rtf1"): - return True - return False - - if ext in MEDIA_FILE_EXTENSIONS: - with Image.open(file_stream) as img: - img.verify() - return False - - logger.info( - f"File with extension {ext} is not supported for locked/corrupt check, treating as valid.", - ) - return False - - except Exception as e: - logger.error( - f"Error checking file validity for .{ext}: {type(e).__name__} - {str(e)}", - ) - return True diff --git a/poetry.lock b/poetry.lock index 4bf25323d7..c329268964 100644 --- a/poetry.lock +++ b/poetry.lock @@ -205,7 +205,7 @@ version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.9" -groups = ["core-lambda", "files-lambda"] +groups = ["core-lambda"] markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, @@ -517,74 +517,56 @@ toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cryptography" -version = "46.0.5" +version = "44.0.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false -python-versions = "!=3.9.0,!=3.9.1,>=3.8" -groups = ["core-lambda", "files-lambda"] -files = [ - {file = "cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad"}, - {file = "cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b"}, - {file = "cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b"}, - {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263"}, - {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d"}, - {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed"}, - {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2"}, - {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2"}, - {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0"}, - {file = "cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731"}, - {file = "cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82"}, - {file = "cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1"}, - {file = "cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48"}, - {file = "cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4"}, - {file = "cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2"}, - {file = "cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678"}, - {file = "cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87"}, - {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee"}, - {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981"}, - {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9"}, - {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648"}, - {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4"}, - {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0"}, - {file = "cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663"}, - {file = "cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826"}, - {file = "cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d"}, - {file = "cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a"}, - {file = "cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4"}, - {file = "cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31"}, - {file = "cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18"}, - {file = "cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235"}, - {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a"}, - {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76"}, - {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614"}, - {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229"}, - {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1"}, - {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d"}, - {file = "cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c"}, - {file = "cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4"}, - {file = "cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9"}, - {file = "cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72"}, - {file = "cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595"}, - {file = "cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c"}, - {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a"}, - {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356"}, - {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da"}, - {file = "cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257"}, - {file = "cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7"}, - {file = "cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d"}, +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["core-lambda"] +files = [ + {file = "cryptography-44.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf688f615c29bfe9dfc44312ca470989279f0e94bb9f631f85e3459af8efc009"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7c7e2d71d908dc0f8d2027e1604102140d84b155e658c20e8ad1304317691f"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887143b9ff6bad2b7570da75a7fe8bbf5f65276365ac259a5d2d5147a73775f2"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:322eb03ecc62784536bc173f1483e76747aafeb69c8728df48537eb431cd1911"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:21377472ca4ada2906bc313168c9dc7b1d7ca417b63c1c3011d0c74b7de9ae69"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df978682c1504fc93b3209de21aeabf2375cb1571d4e61907b3e7a2540e83026"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:eb3889330f2a4a148abead555399ec9a32b13b7c8ba969b72d8e500eb7ef84cd"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8e6a85a93d0642bd774460a86513c5d9d80b5c002ca9693e63f6e540f1815ed0"}, + {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6f76fdd6fd048576a04c5210d53aa04ca34d2ed63336d4abd306d0cbe298fddf"}, + {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6c8acf6f3d1f47acb2248ec3ea261171a671f3d9428e34ad0357148d492c7864"}, + {file = "cryptography-44.0.1-cp37-abi3-win32.whl", hash = "sha256:24979e9f2040c953a94bf3c6782e67795a4c260734e5264dceea65c8f4bae64a"}, + {file = "cryptography-44.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:fd0ee90072861e276b0ff08bd627abec29e32a53b2be44e41dbcdf87cbee2b00"}, + {file = "cryptography-44.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a2d8a7045e1ab9b9f803f0d9531ead85f90c5f2859e653b61497228b18452008"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8272f257cf1cbd3f2e120f14c68bff2b6bdfcc157fafdee84a1b795efd72862"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e8d181e90a777b63f3f0caa836844a1182f1f265687fac2115fcf245f5fbec3"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:436df4f203482f41aad60ed1813811ac4ab102765ecae7a2bbb1dbb66dcff5a7"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4f422e8c6a28cf8b7f883eb790695d6d45b0c385a2583073f3cec434cc705e1a"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:72198e2b5925155497a5a3e8c216c7fb3e64c16ccee11f0e7da272fa93b35c4c"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a46a89ad3e6176223b632056f321bc7de36b9f9b93b2cc1cccf935a3849dc62"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:53f23339864b617a3dfc2b0ac8d5c432625c80014c25caac9082314e9de56f41"}, + {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:888fcc3fce0c888785a4876ca55f9f43787f4c5c1cc1e2e0da71ad481ff82c5b"}, + {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:00918d859aa4e57db8299607086f793fa7813ae2ff5a4637e318a25ef82730f7"}, + {file = "cryptography-44.0.1-cp39-abi3-win32.whl", hash = "sha256:9b336599e2cb77b1008cb2ac264b290803ec5e8e89d618a5e978ff5eb6f715d9"}, + {file = "cryptography-44.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:e403f7f766ded778ecdb790da786b418a9f2394f36e8cc8b796cc056ab05f44f"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1f9a92144fa0c877117e9748c74501bea842f93d21ee00b0cf922846d9d0b183"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:610a83540765a8d8ce0f351ce42e26e53e1f774a6efb71eb1b41eb01d01c3d12"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5fed5cd6102bb4eb843e3315d2bf25fede494509bddadb81e03a859c1bc17b83"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f4daefc971c2d1f82f03097dc6f216744a6cd2ac0f04c68fb935ea2ba2a0d420"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94f99f2b943b354a5b6307d7e8d19f5c423a794462bde2bf310c770ba052b1c4"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d9c5b9f698a83c8bd71e0f4d3f9f839ef244798e5ffe96febfa9714717db7af7"}, + {file = "cryptography-44.0.1.tar.gz", hash = "sha256:f51f5705ab27898afda1aaa430f34ad90dc117421057782022edf0600bec5f14"}, ] [package.dependencies] -cffi = {version = ">=2.0.0", markers = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""} +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs", "sphinx-rtd-theme (>=3.0.0)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox[uv] (>=2024.4.15)"] -pep8test = ["check-sdist", "click (>=8.0.1)", "mypy (>=1.14)", "ruff (>=0.11.11)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] +pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] sdist = ["build (>=1.0.0)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==46.0.5)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test = ["certifi (>=2024)", "cryptography-vectors (==44.0.1)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] test-randomorder = ["pytest-randomly"] [[package]] @@ -1208,22 +1190,6 @@ files = [ {file = "msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e"}, ] -[[package]] -name = "msoffcrypto-tool" -version = "6.0.0" -description = "Python tool and library for decrypting and encrypting MS Office files using a password or other keys" -optional = false -python-versions = "<4.0,>=3.10" -groups = ["files-lambda"] -files = [ - {file = "msoffcrypto_tool-6.0.0-py3-none-any.whl", hash = "sha256:46c394ed5d9641e802fc79bf3fb0666a53748b23fa8c4aa634ae9d30d46fe397"}, - {file = "msoffcrypto_tool-6.0.0.tar.gz", hash = "sha256:9a5ebc4c0096b42e5d7ebc2350afdc92dc511061e935ca188468094fdd032bbe"}, -] - -[package.dependencies] -cryptography = ">=39.0" -olefile = ">=0.46" - [[package]] name = "mypy-extensions" version = "1.1.0" @@ -1253,21 +1219,6 @@ rsa = ["cryptography (>=3.0.0)"] signals = ["blinker (>=1.4.0)"] signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] -[[package]] -name = "olefile" -version = "0.47" -description = "Python package to parse, read and write Microsoft OLE2 files (Structured Storage or Compound Document, Microsoft Office)" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["files-lambda"] -files = [ - {file = "olefile-0.47-py2.py3-none-any.whl", hash = "sha256:543c7da2a7adadf21214938bb79c83ea12b473a4b6ee4ad4bf854e7715e13d1f"}, - {file = "olefile-0.47.zip", hash = "sha256:599383381a0bf3dfbd932ca0ca6515acd174ed48870cbf7fee123d698c192c1c"}, -] - -[package.extras] -tests = ["pytest", "pytest-cov"] - [[package]] name = "openpyxl" version = "3.1.5" @@ -1713,7 +1664,7 @@ version = "2.23" description = "C parser in Python" optional = false python-versions = ">=3.8" -groups = ["core-lambda", "files-lambda"] +groups = ["core-lambda"] markers = "platform_python_implementation != \"PyPy\" and implementation_name != \"PyPy\"" files = [ {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, @@ -2499,4 +2450,4 @@ requests = "*" [metadata] lock-version = "2.1" python-versions = "^3.11" -content-hash = "9d5fc7af2841c90590cd173e32abcf400d064cd303e49a5b2ac33964170a0e9b" +content-hash = "77d0249d2dd6c9fbb02b0e434ade72ac221f4df82e8d98ec49250fe0b7ff74df" diff --git a/pyproject.toml b/pyproject.toml index fe89cf8388..4abaa1617d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -51,9 +51,6 @@ pikepdf = "8.4.0" [tool.poetry.group.data_lambda.dependencies] polars = "1.31.0" -[tool.poetry.group.files_lambda.dependencies] -msoffcrypto-tool = "6.0.0" - [tool.poetry.group.reports_lambda.dependencies] openpyxl = "^3.1.5" reportlab = "^4.3.1" From c4717897497d80656514c4065ceb1bb8c397c0c6 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 09:59:54 +0000 Subject: [PATCH 34/43] Revert "Revert "[PRMP-939] deploy to sandbox"" This reverts commit 360e32b20e60a59e99ce33203d17bb155784b087. --- .github/workflows/full-deploy-to-sandbox.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/full-deploy-to-sandbox.yml b/.github/workflows/full-deploy-to-sandbox.yml index bf5621cf20..84dc228e93 100644 --- a/.github/workflows/full-deploy-to-sandbox.yml +++ b/.github/workflows/full-deploy-to-sandbox.yml @@ -166,6 +166,17 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + deploy_s3_data_collection: + name: "Deploy S3 Data Collection (ECS task image)" + uses: ./.github/workflows/s3-base-data-collection.yml + needs: [ "deploy_all_lambdas" ] + with: + build_branch: ${{ inputs.build_branch }} + sandbox: ${{ inputs.sandbox }} + environment: ${{ inputs.environment }} + secrets: + AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + bulk_upload: name: "Run Bulk Upload" if: ${{ inputs.bulk_upload }} From c2fe13a49d3af7884698e44a0c463887717b0366 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 09:59:57 +0000 Subject: [PATCH 35/43] Revert "Revert "Revert "[PRMP-939] deploy to sandbox""" This reverts commit 46edc53379190d46f4ef5041bde12709c29994b3. --- .github/workflows/full-deploy-to-sandbox.yml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/.github/workflows/full-deploy-to-sandbox.yml b/.github/workflows/full-deploy-to-sandbox.yml index 84dc228e93..bf5621cf20 100644 --- a/.github/workflows/full-deploy-to-sandbox.yml +++ b/.github/workflows/full-deploy-to-sandbox.yml @@ -166,17 +166,6 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - deploy_s3_data_collection: - name: "Deploy S3 Data Collection (ECS task image)" - uses: ./.github/workflows/s3-base-data-collection.yml - needs: [ "deploy_all_lambdas" ] - with: - build_branch: ${{ inputs.build_branch }} - sandbox: ${{ inputs.sandbox }} - environment: ${{ inputs.environment }} - secrets: - AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - bulk_upload: name: "Run Bulk Upload" if: ${{ inputs.bulk_upload }} From 94fbd16d3e1637b0224812b5a210457f468b94fa Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 10:03:04 +0000 Subject: [PATCH 36/43] Revert "Revert "Revert "Merge remote-tracking branch 'origin/main' into PRMP-939""" This reverts commit 5fdd76c99b046daea5d902534d22d087422789b7. --- p1058-lloyd-george-store_versions.csv | 1029 +++++++++++++++++++++++++ s3_inventory_versions_with_tags.sh | 143 ++++ 2 files changed, 1172 insertions(+) create mode 100644 p1058-lloyd-george-store_versions.csv create mode 100755 s3_inventory_versions_with_tags.sh diff --git a/p1058-lloyd-george-store_versions.csv b/p1058-lloyd-george-store_versions.csv new file mode 100644 index 0000000000..104dfe12b3 --- /dev/null +++ b/p1058-lloyd-george-store_versions.csv @@ -0,0 +1,1029 @@ +bucket,key,entry_type,version_id,is_latest,last_modified,size,etag,storage_class,owner_id,tags +"p1058-lloyd-george-store","9449303304/02ae7821-1707-443f-8c5b-0fda3ae4f4ff","VERSION","7tN4NBIiSWkBjc3eIaVEMKT3QDozDhNv","true","2026-02-09T11:05:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449303304/2bf97e4a-e1d7-42f7-ab96-e4a22fe9f292","VERSION","L4bnWJmYgyKJw.9JMs53lvDNPih7F0le","true","2026-02-09T11:05:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9449303304/39375a3c-fd92-4faf-8d49-da71c9e03a29","VERSION","WQZ_DDNezYvyHbl.Ur_peg1ZeKLVMFQW","true","2026-02-09T11:05:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449303304/f27bc118-7095-46c5-b150-cb115c47e3d6","VERSION","lCxsKOk17BHZbXLk61AO.MlRDIgfblqI","true","2026-02-09T11:05:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449303371/03e0f437-27e0-4baa-b689-b00eee16e584","VERSION","obVxk5DAVa9MzOM44mGIfAd7Pv9b5Ta.","true","2026-02-09T11:05:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449303371/3dc5d32a-1bb1-400a-bb73-00b1078397c2","VERSION",".XM6I99xvAUN8RRSGMF9W5QtXMfKYgJB","true","2026-02-09T11:05:42+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9449303371/88202a9c-3197-414d-88e4-d8e797dd5a5d","VERSION","Re2fcv8SWhUrB.Hy_K2hIGxDkteKe2l2","true","2026-02-09T11:05:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449303371/a94ba724-d4de-420f-ab5e-489ae2a29a42","VERSION","VUXIIzBT9ipkZvoGT6LzB.OyVZ6ERAZj","true","2026-02-09T11:05:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449310033/8be31fa8-d907-46d3-8936-9eb5b4ee89a9","VERSION","yNJvcEDWG7ZscfPKyESUMkwHtQI6bnb5","true","2026-02-09T11:05:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449310033/bc6e56e9-1275-4437-b24a-34618d99ae1f","VERSION","0uDRxVgYqWqRg.8TiBkzaTpV63TjTb96","true","2026-02-09T11:05:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449310033/cf32d5dd-e96d-4b36-a69d-db4a0146bff9","VERSION","nZh.sMH.bXRFKoqTBzoLhqTFyZ3h2dr4","true","2026-02-09T11:05:45+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9449310033/f4d40487-d171-427c-a0f3-3e393593256d","VERSION","NEabeByFA1QT5Mvol4RbAhCFPzSoWkVB","true","2026-02-09T11:05:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449310610/0987b3bb-c74d-4ce1-8b4d-e63bd363df82","VERSION","ESRIa_gHQYniIjHYkKcbE.HmWYGdnHZs","true","2026-02-09T11:05:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449310610/6dc9d52c-9f4a-4c95-a350-859f6fc520f6","VERSION","oX_KGX9_pJ.trZm.xVPn_oWi.myjYKK_","true","2026-02-09T11:05:46+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9449310610/94ac97b2-fdab-4926-b67a-176178f5a6cb","VERSION","vU5M.mEK1TF4gEUMZegNdG.gpY2gF2wf","true","2026-02-09T11:05:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449310610/9edac6c9-d637-4994-a19f-b92d58ec8124","VERSION","xbwQFIPBTYsXXcVN_6RjBcLxj2.X9xyU","true","2026-02-09T11:05:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449310688/35c80345-428a-4def-a444-a7ad17e18ea7","VERSION","0DUw.vTnU1fsloQ3jBqk5t7J.PRfiFFh","true","2026-02-09T11:05:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449310688/3a3bba00-853d-43fc-90b4-64c0b72a6a14","VERSION","VWo5bxSIji6ouRxsZnIEpWzbOyGEojss","true","2026-02-09T11:05:44+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9449310688/ccc89d47-56fe-48a7-b5ac-f39b9ff72f2d","VERSION","5Yh82z7PfPbJ19sEc6jyHo2Oswb568sp","true","2026-02-09T11:05:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9449310688/e7772bd7-3520-4722-8351-7c33248996ee","VERSION","h9TPwA6U.uqx__vVS0VBmz2ohVvvlvWL","true","2026-02-09T11:05:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9729782814/0d29d55b-213f-4f9f-9e5d-2b0081488beb","VERSION","DkkiLwufOQjotn7mr7m16C2JZqlW8hDA","true","2026-02-09T11:05:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9729782814/55ec1b01-7f75-4e4d-8dcb-61f7848a49ea","VERSION","CZQ0MDELRGIqBJgsUU9L9YttcamR6hyY","true","2026-02-09T11:05:43+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9729782814/bf177406-5e05-49cb-823e-88d7e245ebb5","VERSION","Ky02RTCYDb6QqIo.7MW.QzlWBvm7Z0Fy","true","2026-02-09T11:05:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9729782814/f709819f-7c1e-4890-8c66-3679c0d6aca3","VERSION","7vL4ZEKC4iUXWuIQ6r.6rOVB66AJWCs5","true","2026-02-09T11:05:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9729782822/91742d43-6850-4175-bad4-f886c74267fb","VERSION","RxH5MhG1oClDhM8GbBRa3okPrpp8U7tH","true","2026-02-09T11:05:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9729782822/a0f5289f-cba5-415b-97e2-dedb8e21aad8","VERSION","0bgcixOxt2F8eOsG1s6dSVCfQY3wtQ0V","true","2026-02-09T11:05:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9729782822/de53a27c-26e9-471e-ae9d-027031b0aade","VERSION","tj7stde4OWbozY2jD6LcW4NzoK0iWGdL","true","2026-02-09T11:05:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9729782822/f8d5d271-00ab-44b9-8a1c-e134e5d44a05","VERSION","QeqCVUzo3gmG6usxogwHhyPimbPd2OqU","true","2026-02-09T11:05:43+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153817/1ba96aea-b30e-4c9d-bfb4-243ec86c487f","VERSION","myArFwLgChaWGJ07HSOactFExt5.ck9X","true","2026-02-09T11:05:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153817/3986594d-9b39-49fa-a2f0-21d1b90ede5c","VERSION","geo3itVAsm7_Ze1RHTP6VHBdtfu8XkY_","true","2026-02-09T11:05:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153817/4947ed67-07f8-485e-a248-b8f17b2524cc","VERSION","KegwnHvevukPMm1bSCsSkoGgOzk0WV2A","true","2026-02-09T11:05:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153817/85211e32-94ab-4279-8a66-c54b09bf54d6","VERSION","MdhPMgtIKhX19U_O_oTLN3e4CfAfGzto","true","2026-02-09T11:05:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153833/17f31080-c110-4562-b123-e166e6047e9a","VERSION","8m345u0s3v1SkmzT7BSBdl1bI8SrNZdz","true","2026-02-09T11:05:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153833/66545732-038e-478e-93cb-0cad3c50bdcb","VERSION","EJfkbmqw.s0AMt5ODIxEN50T7DuFNc1G","true","2026-02-09T11:05:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153833/8d5de18d-1c44-44f4-b88a-1b2e2f9d3a65","VERSION","QIv8HsiCXjOkJfctZ2mL0WrtjTMUPLA_","true","2026-02-09T11:05:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153833/a9128055-1305-47fa-9a5c-64f95d12b4c1","VERSION","SA_rBb7P5AYQuA1Iu5HM4_.0_lDo560D","true","2026-02-09T11:05:49+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153841/29676a4b-f718-4c4d-8ab3-1e252b947a86","VERSION","UdL1kwR.twtqzyMxbvtQV9kKXZXSmZwQ","true","2026-02-09T11:05:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153841/32f2bc30-7f37-4577-b056-677a47f35bc5","VERSION","AIMCZYzLQuWCsuvCOu2x3iUODtlo.p7i","true","2026-02-09T11:05:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153841/618fdd60-5682-4e5f-9472-3151b374bc3f","VERSION","yJuTlEEwtp5hmKZNjk20g8_ZDVjhDcZt","true","2026-02-09T11:05:50+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153841/dc44012d-1560-47dd-82ee-2f5e78c84669","VERSION","FruMJ12O_hYtUoaEDD5r8UldoIs3VSL7","true","2026-02-09T11:05:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153876/14c7a9cb-ff4c-4bf4-bf4b-e9cbd83161ba","VERSION","xG1FGQVf1P3XJXEFPK2QBPadp_X1dvf4","true","2026-02-09T11:05:51+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153876/1c9a821b-d551-4bfe-8d51-f0acbb0e09eb","VERSION","UFYs62luto0vjzweM0rzBg9S9JoTm_CM","true","2026-02-09T11:05:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153876/23156b5e-258a-4120-a7ec-e95c71ff4866","VERSION","h7YAORF7jIgXO1fyb0ikduiHhoZ_AUUB","true","2026-02-09T11:05:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153876/bcf98884-47f0-4832-a2e2-c54135f2ea05","VERSION","BC5k19jjstxhUMPOh8zwejTDV27hZlkn","true","2026-02-09T11:05:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153884/0426dcc7-d776-44da-ba61-d2485735ca68","VERSION","TBK06LVwtj6Z4b5s7dXQxCJtX1nMw6zg","true","2026-02-09T11:05:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153884/3087bcda-dcfb-4431-8d47-5935b5638e9c","VERSION","yfBMYHU3efxyS.h9PcsnDZfX7Jzu9uUm","true","2026-02-09T11:05:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153884/4ee3f0d3-b190-4391-8983-35d4adf7a3c9","VERSION","oJqF.QfRHNrGLgRpAHEiIV3LK5YnK1zg","true","2026-02-09T11:05:52+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153884/d084fc00-5665-4176-a5f5-6bd479aa8855","VERSION","fuacAQhyNF7YfHePQGsp27KiaZY.SyFw","true","2026-02-09T11:05:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153892/03c0c358-1c27-4b06-bd49-d17ae0686f48","VERSION","WVAM8JrGWXx7EGguov63YAjHPYgv3agp","true","2026-02-09T11:05:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153892/cf9f72fa-5119-4fef-b525-f23fec2bc51b","VERSION","Q_wH9F4mtlNjg.tWaFnD9fFTTv.Cadq.","true","2026-02-09T11:05:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153892/e6134582-a42c-4c50-8117-80cba8b881b2","VERSION","cdl9mbvfabfW_sXgdH_zUPxo3AXcwCZz","true","2026-02-09T11:05:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153892/f760a958-d095-4e3b-a370-ac9c03b32549","VERSION","Bu4nxzPHcyR6ZiUwGg8UHxlDViUgoqTD","true","2026-02-09T11:05:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153906/2ff8a3fa-08ae-4fac-9c58-b899aab3cc1b","VERSION","C6tqzUrw4VuSgHTR0wYXbEIc8GBrhzKt","true","2026-02-09T11:05:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153906/3956df72-5e19-45b3-8d20-ee008d7fbf2d","VERSION","NNrx83kaMe6BOX6vTX6iLK4IZIZG1cz1","true","2026-02-09T11:05:54+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153906/65d6c7da-df96-4683-9108-0c727a1beaaf","VERSION","CGV30uVsrxM5yhxeuknGihJiBhMHdpWi","true","2026-02-09T11:05:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153906/ccbb615b-2dca-418d-af15-8a010567e6f9","VERSION","gFcjQ9m1mf7L51n_y_w.vQn1IP8KuP1P","true","2026-02-09T11:05:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153914/4da98303-c8f3-439b-85a7-e87aaf6079de","VERSION","xYQQscfndmFGRzhrm9vhesDqfCK2D.HX","true","2026-02-09T11:05:55+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153914/74db7049-f9df-4d22-891e-07ec4fa7eb26","VERSION","xPhNxV0fjtXhzwhNnOBBsCfeChvL6YWi","true","2026-02-09T11:05:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153914/a0db5e96-8b35-48b4-b0cd-0db94574d140","VERSION","51UTi1tyDMCK_lsTw5y9yc5S9AZRYnGV","true","2026-02-09T11:05:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153914/bce71761-f6de-4ecc-9258-b970fd59630f","VERSION","TCFoqyGKxEzsdve4se_syxGSva8sOHRN","true","2026-02-09T11:05:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153922/1cb68b6c-ec21-443f-871a-c1bccc95f7ef","VERSION","0ap8drLjS53zjj7O6C6psYerKTiE7eNK","true","2026-02-09T11:05:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153922/a98a7376-a6d9-4ab6-8c5b-654b8b1e097b","VERSION","wR.v5jNWYz9t_1T5AzxgsEogproz.KfO","true","2026-02-09T11:05:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153922/be67f903-5765-4630-9ab2-8515836b6c0a","VERSION","VMAowV8.qc6ee_9pY3YCG2bMqh5eFLEE","true","2026-02-09T11:05:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153922/ec24ba32-4cc2-4c3c-b8cd-7fbac5d6f64d","VERSION","hpLXEKYSflxBEcaAHVzJfr66AZUwNTMO","true","2026-02-09T11:05:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153930/1a3a44ae-bfe0-4d76-b775-39686354a662","VERSION",".kfa6zIRT7dF52XHdM9vZX5GYut0rWKT","true","2026-02-09T11:05:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153930/6ca3e4b9-16aa-4839-a8be-cddbca6bd3ed","VERSION","_RuqLaJ9cV5SUOGGNu8yIdGEX56VcGpc","true","2026-02-09T11:05:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153930/a39a34e9-c091-4a9e-977c-5a1507a9e391","VERSION","S81zzL5dhKBQuoS4qK0T8V8Fa6HP3guA","true","2026-02-09T11:05:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153930/d5ba3ed5-78bb-49b7-abb0-4dd81d484b8c","VERSION","bvM7JWfPNUanpY28W0.xA6p6nwIBeQd3","true","2026-02-09T11:05:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153949/42d814c1-e868-47eb-880c-02338075fb04","VERSION","rp672GgH7Q7Vwz.68AOIORD.m09_GXXX","true","2026-02-09T11:05:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153949/4bd12a3a-64f2-4ea5-99d8-3acae1d9bae7","VERSION","bjmsyewPOOGIzqU27P7SyxTRjAA44_yB","true","2026-02-09T11:05:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153949/519b2a41-42c9-4ec6-94cb-9f72d857f80a","VERSION","6y0pIF3DOBNnwM_8T88sc6AoPuz_0FLg","true","2026-02-09T11:05:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153949/713aae74-263c-40d0-b09c-74125b222f4a","VERSION","jCDrKIDU3ysQdJrTMTONq_7nSe0OGoIV","true","2026-02-09T11:05:57+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153957/5edcb9b3-fffb-4486-80ba-f30022ff5369","VERSION","RoI95ndS6dgGOPHuva5bAXK5yvZpBANR","true","2026-02-09T11:05:58+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153957/c0d44bf3-48f9-41e6-af12-785ea587153f","VERSION","Yr6GaNULkNkSvKpLATI5SVih3p1rQYzK","true","2026-02-09T11:05:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153957/c26677f2-5fdc-4942-9f8d-147bc616b722","VERSION","grMYj.6LmhE0LBtwnhSrX3sC2iFrC6bi","true","2026-02-09T11:05:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153957/cdfb4dee-f955-48e2-b1ef-21ce55cda4c3","VERSION","m9pmgejIPxSahiFmxRrnuACow8rXfFMM","true","2026-02-09T11:05:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153965/1a08fb4b-ad1e-44c2-a158-e016d3f43a4e","VERSION","cK1252fQuCDsgjClOtwbWBrmwhT99QGK","true","2026-02-09T11:05:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153965/6c9f39c3-2c42-4fc3-be27-0d7d5674d9b6","VERSION",".DS51VLdLtP33wTYpbU1XZdIREQstVEL","true","2026-02-09T11:05:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153965/c872bd6c-5608-4643-8469-ed7019eef3a1","VERSION",".NfbeFkhPXBJRWShZgN66UWc.B1lRDE3","true","2026-02-09T11:05:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153965/d262df4c-0891-4409-aa33-0ec1560faf67","VERSION","jxLPapQvV3f7CwSi.4CmYYFtfGCAyHQH","true","2026-02-09T11:05:59+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153973/1c190c49-4041-4d60-bf20-35242b66dcd8","VERSION","6Y5x9amQ7sfkMvskYh19Pakgp7AMsuSw","true","2026-02-09T11:06:00+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153973/a3409c14-17d6-40d5-93f5-e28edcd444bb","VERSION","Wp2PcDvnnw7NaqePNOi_86zgD4xiN4Cp","true","2026-02-09T11:05:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153973/b3a69d5c-ade4-4aed-8f52-bc9e0ef86e51","VERSION",".u7usG1hpDeMEW47lOLVmnEWNxL6plus","true","2026-02-09T11:05:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153973/e7cba7a5-ef7d-48b7-bf16-ed3f78aefe48","VERSION","t.Y4QQ5ewkXSqce.w8TZVPNgMjyzndc6","true","2026-02-09T11:05:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153981/1d4bc4f3-8220-40c7-9378-1557a382be56","VERSION","ijPunLOe2DPJbIUW54_.0Q4vF7ofe5xu","true","2026-02-09T11:06:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153981/74ccef47-9d84-4fc9-9bb4-af1c0f247319","VERSION","C_y4W2mkVc11bHzEFNIAq8todFhu9yRw","true","2026-02-09T11:06:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730153981/8df4d979-835a-4f01-9b72-80637df66d08","VERSION","5ss6D5OgNau4qd1txar11N6uiiOQXIDi","true","2026-02-09T11:06:00+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730153981/b47b391e-4bc8-4cd1-a856-2118a4a7c618","VERSION","8vH29J0jsISlvQ5K1RAU1cQ4YSCRaWEH","true","2026-02-09T11:06:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154007/455498a6-27a5-4731-9c7b-d81fd445c121","VERSION","qSjtOsJvsUZoXdnpfM8QSrRQ0UakIcwz","true","2026-02-09T11:06:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154007/49816002-6b67-4b78-9ad9-8e8bcc8fa01d","VERSION","EsM5IxpNvv05Czo8dp6MZu6FhJcvgCoe","true","2026-02-09T11:06:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154007/6cd04170-b881-4a77-9a56-62f43471cd7d","VERSION","5JplSbQ99xojsXvqEZXt9zFlOu4Qbhm_","true","2026-02-09T11:06:01+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154007/90341bf0-a3a1-4492-99be-ae216b323608","VERSION","0H6FZFB73ineJbmR1VGbAJKtu8yBQCtq","true","2026-02-09T11:06:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154015/6804d93f-d46b-4168-b84b-aea316599c08","VERSION","cpXeVrZ7rmTRvCboFQqhAZEPYL5jaQCU","true","2026-02-09T11:06:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154015/771442c3-76bc-46ac-a414-ed3550dae00e","VERSION","eE2pmz.EiphrPI4FR1p0A_N7ty_.4Epi","true","2026-02-09T11:06:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154015/9b053792-bc8a-4033-8f5b-9195f4619df3","VERSION","6VXbsQjCMLh2cHp_jZ0ZM2OLipJquOXN","true","2026-02-09T11:06:02+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154015/f9b902d9-1063-434b-bd09-bacb1baff749","VERSION","IkUYW7zy2AKp3O4bX3vLWUbqaYRYJlAk","true","2026-02-09T11:06:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154023/4020d627-3dbe-4cb9-b039-8b6fcced0eef","VERSION","E_ufqqgnhe4ntFSTVB10PSUVyMSNvwdH","true","2026-02-09T11:06:03+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154023/a14cac19-c8a6-4cbd-9bd0-1b1197fa6edb","VERSION","nMlzVdj9v.Ari3W7tF35BcKX_CfdCu4V","true","2026-02-09T11:06:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154023/c13b62f8-0f8a-4064-897e-32796cc5eb38","VERSION","JNiDFTj.rTvOxQDwLpQWSbTA_eYrw0Kf","true","2026-02-09T11:06:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154023/ec4aa20c-6a69-4b2d-a545-2e0b60783dde","VERSION","aA7qy_0gVgU9faMkUQzJE0DsoCUidcCD","true","2026-02-09T11:06:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154031/6d3834e5-e921-4f21-b6b7-53a23420c675","VERSION","ZDu_4fmljpqmUHbysYUiciUgAef7WgzK","true","2026-02-09T11:06:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154031/85f69471-5bb6-4cf4-94cb-6753c2bf03b0","VERSION","cF1BjqGjVtKns1gBl2N2DQ4KLZoZPOo_","true","2026-02-09T11:06:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154031/af61a317-27da-487d-8ffe-50e97a90fc20","VERSION","TZkonU8mVOI1X_.rFvGkEEsHxl4XY5ZW","true","2026-02-09T11:06:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154031/cd090b2f-daaa-424b-8403-6444f313ebd8","VERSION","m0wzYmgz.PrFCHcOJhN8NlhIbKsf1R8C","true","2026-02-09T11:06:04+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154058/036e81e3-e06e-468d-91fb-f774e0e3eae4","VERSION","9AMyN.cF_hLjQ2RwrmTNr.fRhkYmd9jW","true","2026-02-09T11:06:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154058/0d94f449-b89d-4ecd-9bcd-17e49296329f","VERSION","LmY4lfwH3MQiHUdqOECSTrSk1TdENTLM","true","2026-02-09T11:06:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154058/10ee23e5-267e-42f8-b2d7-7fb60b7e002e","VERSION","tYAO1JxWqmAKTaE82.fnsJcu_uJIchvs","true","2026-02-09T11:06:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154058/798fea6c-4fe2-4e3b-8280-7c362312c5e3","VERSION",".girGgXgRTLzTQhoBF41iOl33jyLq6Nl","true","2026-02-09T11:06:05+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154066/05f2d610-6a79-4e8b-bba9-10cac45c512c","VERSION","rs7RBN.HKaAqkYAUozCYX7R2MuTnddN8","true","2026-02-09T11:06:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154066/5df922e2-bf7c-4a05-8228-a2f39e9a2446","VERSION","f_mhAiR8We4AKq_smNIb.wkbH8F7wO4M","true","2026-02-09T11:06:06+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154066/a4236ff1-934e-4b40-a754-d0a109b8cbc2","VERSION","KaTNn805Ew9.4m_jcxRfDiX0zsIT7yU6","true","2026-02-09T11:06:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154066/cc35af47-b374-4989-95f2-0be80ba7a93d","VERSION","WCflmUqC8yBgt83zZ.axcS1oYy41tS2c","true","2026-02-09T11:06:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154074/853a1061-7d2d-4084-9016-ce4d66478574","VERSION","RswvTwTniChamQgTFpVvH4VTlnlbF5qT","true","2026-02-09T11:06:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154074/ac1c366c-d67f-4d35-8375-c9870b9781b7","VERSION","V.RYF_dnA1ShK6Qj4bUc3oInMi84fw0E","true","2026-02-09T11:06:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154074/ea0125ac-4a72-4213-87bd-d6fd8296ec32","VERSION","jBWDmX447O.2YS1cMTJue6P68FvXxcl6","true","2026-02-09T11:06:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154074/fb1559bd-25a0-4642-aa24-941820b2f8a8","VERSION","bd7DeJAvRIR.X96xuXTqv9QTUBWko0fE","true","2026-02-09T11:06:06+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154082/247bba9a-b79c-4ca7-b88a-8925e961bef0","VERSION","iG8KPVVwX5QTIm8bmzWju7iNgPesKPv9","true","2026-02-09T11:06:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154082/314f12a2-792a-4fef-bd43-fe988dc5a16f","VERSION",".0NQ3gjikDJHQ9c1JePmS0yypeQTtJ6z","true","2026-02-09T11:06:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154082/454e04ac-6c70-43aa-a1cd-a94bf1ed7eb9","VERSION","rlOq3gMMIdlsgxIMyJ6dFXDMjqCcYTk6","true","2026-02-09T11:06:07+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154082/68fa1e17-ddd9-4245-b0a9-f5a6abc39fb5","VERSION","SK.q.oVW4lx52KClg1HnxRVqBQaaMNgB","true","2026-02-09T11:06:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154090/0404de14-489d-4dc7-bca9-d53c196ddb28","VERSION","ssDYDZgtEKnJXHnD1ZVGlpHGbvzxGJEY","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154090/0dfc874d-04dd-4e67-8bb3-e31f1f848820","VERSION","OJvaxYway6q1A1u1v6GIaRhzN6T5vDhe","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154090/adcc0a24-db61-4091-8e4e-108e1255131d","VERSION","b7Pp8JT4Gv3ISdM19C9AoMF8Q2nHnH5e","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154090/d946ad86-5cac-4215-b39b-0942e767a5dd","VERSION","TtI3YyBATLIPPFkcegRW0hw0lLK0uUWt","true","2026-02-09T11:06:08+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154104/06a4e441-c7b5-406c-b7ca-7522ffac6913","VERSION","sPnUvCSXHYa4j8Txf2PPDo.Nik__PqWp","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154104/39f3138d-8a8e-485f-8c34-36d45bb23b59","VERSION","zmIHnd3VOZtHoQ02qg04gv4ijM4NEOmo","true","2026-02-09T11:06:09+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154104/e7b5e8cf-5beb-4357-a3eb-466227f0a146","VERSION","1NIUN7kZaJqJ_6EyD_MR4Dm.VuhOPd21","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154104/f946b6c4-3863-4acb-9d01-945d05fbaebe","VERSION","rqhDvPhZns3NPmfm8_Qh_VahDg.MjeTv","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154112/1e445a5b-8a0b-4704-86d5-c4d5516d4b76","VERSION","_d6iqksoKdQECxpChJwLc1.zjcwcNWAw","true","2026-02-09T11:06:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154112/aa95426d-7f72-49f2-97cb-c00079558b25","VERSION","b6oszblOFnp4pSlItkAx4sxm10QdBUJX","true","2026-02-09T11:06:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154112/c6c23756-f555-4eed-aaa4-bc41a1cd4720","VERSION","NM4K3.lGWK.4x3hdnv9lawnWIN_8akbh","true","2026-02-09T11:06:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154112/c8025c93-c119-42a4-ac31-3d7ca2b1445b","VERSION","S0_Lbx_wXMNUZ2JtDoAgLH0zOogF7QiU","true","2026-02-09T11:06:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154120/212abdbb-51e3-4e40-be50-68d9fcee919c","VERSION","1Lt9fZlEB_FgcpkzO7x4LYC.Xk9e4kZ.","true","2026-02-09T11:06:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154120/338778b2-093f-465c-a701-aed3175e74a4","VERSION","ckwukvyxbDWQeFjk.OESAiXc6GoCLT5K","true","2026-02-09T11:06:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154120/6225d2d5-3e41-408d-aefb-bdf4583656ae","VERSION","n3HFDIX36jQw9OH0kKNSA4SCFp7E2bn5","true","2026-02-09T11:06:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154120/e6750f49-5517-43df-a165-c364f6351ceb","VERSION","aXlTptMR2CRDKLlK9hTtkDAHNlQA5d4M","true","2026-02-09T11:06:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154139/07d9f91e-53cc-46f6-a7bb-7798437612fa","VERSION","LxQ2objqiqMIze.GvOiPgfKroWruWacO","true","2026-02-09T11:06:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154139/290a2d05-7bd5-4503-b364-b15809da29c0","VERSION","lnLAkydY1upon5buAACAYFje6ZQ6MMaS","true","2026-02-09T11:06:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154139/5d57c0cd-f991-42ce-85cd-5aa3beef59ae","VERSION","OyOF.y57aWfg4uo_GrmaBJDSGAW.hm.Y","true","2026-02-09T11:06:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154139/c27ecb06-33d0-4f98-96a2-3055cbe27b5d","VERSION","ppQObAcTy3L_kya2FZ7YE43p4eOcLNCO","true","2026-02-09T11:06:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154147/6aa382ad-20c9-42a5-ab01-d0a821037711","VERSION","UHLNQuxJiUcIAQZffC.vYNhOKERfnrkg","true","2026-02-09T11:06:12+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154147/94252450-9cad-4dfb-99ba-abaa1733ef0b","VERSION","iTarLkSCOQ4IUOrwLPxkOdyEfz7UdfML","true","2026-02-09T11:06:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154147/946b3ba8-1d0c-425f-947c-68e314ddc803","VERSION","Jfpr3iUOgRQEjrc.Of8ZnBHIE8luOvLR","true","2026-02-09T11:06:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154147/f4890dc7-24d4-4c19-af4b-0ac93945b537","VERSION","2okH9TFnntoLJfAiR9smaPlJ5RW_ItqN","true","2026-02-09T11:06:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154155/4a425555-868a-4a0d-b41e-9419904e8d7d","VERSION","mA1lHSjcsXzr1C6HQhJQbZz1k0gl98mG","true","2026-02-09T11:06:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154155/5f6efa5f-8478-448e-8fcc-79a544fa1624","VERSION","CIduPztwpi5cxaQk037fVi7BgG.A2lxo","true","2026-02-09T11:06:13+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154155/ad62954d-1c08-4cff-9c87-64f6fe5ec86e","VERSION","gSg8iXkfg8r38YgLtpXZ.I9GqxiejjL9","true","2026-02-09T11:06:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154155/e6558b1c-9134-47ed-893c-033d806e4de9","VERSION","1VXMt7KD7Xc1KHLZrcnPdwkICp2hNGBT","true","2026-02-09T11:06:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154163/0d5948b7-25e7-44a5-b373-2853087cb5ad","VERSION","Kl3n6XFkJix3UADOITjKyGsEuOyMrv9O","true","2026-02-09T11:06:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154163/3374365d-c299-4c0b-83e9-d6cc49cf0af8","VERSION","UHFrynlq6REWUtyTW.gBtAxlunHnMdW8","true","2026-02-09T11:06:14+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154163/5185dfb8-cc4b-49d5-85b2-2ccd9ddc5541","VERSION","C8xhlYNk8wxf8Jd4VKBhkwFnKGGzrPTb","true","2026-02-09T11:06:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154163/c6e472b7-eb7b-46ca-8ffa-6fb3c1561f20","VERSION","HazwY5MtuMOoN_BrDpS.WQ36YBGRUn63","true","2026-02-09T11:06:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154171/02ac2c92-8c11-479c-b69d-f6f2267b20ab","VERSION","X6NXtf09qfNUVq3.XbtWAd8YI1iGLnFa","true","2026-02-09T11:06:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154171/8cba5672-ca36-4c7e-afb8-7b372dd91655","VERSION","oCDKPbB7TMjVTBIVFKdPrioggNC.RC53","true","2026-02-09T11:06:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154171/c4fb4195-6d1c-4800-8546-d7bdb1148287","VERSION","qGQpbpm0YOU0bi5347W3mTSYMua1yAlr","true","2026-02-09T11:06:14+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154171/dbc54d8d-db32-4035-adf3-2cc5c5ea543c","VERSION","AXF8o29ROJi50vBtFknku6bMUGS2GG_D","true","2026-02-09T11:06:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154198/470d0e4f-4c7a-4188-ae6e-3ce7aa54a7ed","VERSION","e5O06NpmxpEglRghwBthXha9Gs0WFVOb","true","2026-02-09T11:06:15+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154198/804beae7-42e6-41b1-b42e-5a835a184220","VERSION","Nw_Q6R7BgKicoEe9E5dPNaUXSHwKfdZd","true","2026-02-09T11:06:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154198/88ebd6ff-5c05-4e70-9a2f-8a6018af948e","VERSION","C05v_Lfsj8_marXuZMX1TronuxI4EPva","true","2026-02-09T11:06:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154198/899d799a-34c3-4da9-a970-4ddc2677aedf","VERSION","vdipuWl_njCeuVnZEU8fEAqWKFNY8gyQ","true","2026-02-09T11:06:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154201/1a1ce178-284e-4abe-8378-d3198a7e2581","VERSION","Se2jMspe6v.pTAyK4loR3UmSGS1N0cNo","true","2026-02-09T11:06:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154201/3265b56a-f7f5-4d16-9aee-23c80fe3b35c","VERSION","On_AUF7R8jMn_OmNNFo1vdEn2rIBU5yx","true","2026-02-09T11:06:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154201/652383c1-8e8e-4b83-9775-7e580ab8901b","VERSION",".CBWeG0lvs42C14yJruWCuUflP5JMWvi","true","2026-02-09T11:06:16+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154201/a63b7c5a-3b02-4e36-a724-dd0c458f6b26","VERSION","LOEcb_e3Lr_I.fezyGoCkKOA6kbSNvDB","true","2026-02-09T11:06:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154228/650389aa-97b0-483e-bb99-e70e65313a6d","VERSION","Y3xx6aWGxYLF30Bx3ZfQWGk4UzAd6TQK","true","2026-02-09T11:06:17+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154228/a84478e3-8f54-4b38-8b7e-c0a161c72620","VERSION","fGA6MRc.v76QS6D58hlncvkFHrniR_4B","true","2026-02-09T11:06:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154228/cba6440a-ba12-4b01-af39-1a29d306c0b5","VERSION","QVKMVh.yq6XpQGD6Ayt80Y7ZErBr8_uV","true","2026-02-09T11:06:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154228/f2dc5551-0eb2-4a51-8bf1-df9b6ab2dd90","VERSION","RjCSbaRBgATGJvftC.LO_KX5O7yIsC1A","true","2026-02-09T11:06:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154236/0b8b53ee-daf3-47bc-b804-13162b8c8636","VERSION","zKzjv.3qNW09hyKgkP2WTgDDPpQl8Gap","true","2026-02-09T11:06:18+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154236/173d0ef5-fa38-419d-9f1b-4fe1934e9e5f","VERSION","xhKV5Z7STxJ8yJQb97gH13k8S_Dridhs","true","2026-02-09T11:06:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154236/476b64af-71b7-43d4-b8c0-f6039ccdeed4","VERSION","Ll4E4AOlwixYg4OyQwQkkLBtfcYGeb3u","true","2026-02-09T11:06:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154236/ed39c774-2da7-4c70-bba8-46be5e6c0592","VERSION","icJGfgniPp7f.CHAUWG.xnhoXsR3yS8z","true","2026-02-09T11:06:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154244/092e31f2-40d0-41c1-b4e4-c1f2fd9ce217","VERSION","717whw88jS7eux2M4BHonGMFfxEBrkMO","true","2026-02-09T11:06:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154244/9601c2d0-28cb-4577-a47a-28556e4962b7","VERSION","mDMWHIy1uTtMOvtcGFl40QRyyQvW8vI1","true","2026-02-09T11:06:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154244/bfc91b3c-9457-4258-8fee-799eedffbc69","VERSION","W0Z3FDwZEbqMUYOMGECyzE8lB8tWvcGa","true","2026-02-09T11:06:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154244/fa006771-4075-413a-87e7-715035fb5f51","VERSION","is4vjzMoi9IxjHg0ulalJ.eBpUekFDCe","true","2026-02-09T11:06:19+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154252/8b01670c-4ff9-4b58-9e60-1ae19ad8f522","VERSION","G6kggQJh3hMCkibgCIl.cTTmxgGBuKZ0","true","2026-02-09T11:06:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154252/b46ae31c-e8ad-4ead-bc58-6646b21f37db","VERSION","5f.e9N89QyJCXeyrswbk2M5FnAZEdnJO","true","2026-02-09T11:06:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154252/c648092e-04cf-4a47-8ec5-94a1c2a8a43b","VERSION","AP.sO1o1Dz4tFGhWHumzp90eCAp7hE1W","true","2026-02-09T11:06:19+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154252/f1937957-459d-4234-8dc0-8d4f52db3ae8","VERSION","3EW2fnONmBeBi1wWzSInmCra_3aN.UQk","true","2026-02-09T11:06:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154260/2fad9989-24fc-4be4-bf98-678e61a3e808","VERSION","iOzhtMlMl7bnT7R.b7QH.85em6syMCit","true","2026-02-09T11:06:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154260/d6e689a4-7002-4849-9088-c881649b39c0","VERSION","eAKWhQrbO8l9Qyv_8DnfQYSdGtsnWgLZ","true","2026-02-09T11:06:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154260/e06735a6-c92f-4e9e-9ae7-94e091b80188","VERSION","EjQbGVZJurdYAjyAm5FeFGhDjg552UKl","true","2026-02-09T11:06:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154260/f32c7c8f-84be-4e00-80c0-c26a1e93ad48","VERSION","RSX4QmXH7Dy8IZ3FrpsNTYcjXcmjkHim","true","2026-02-09T11:06:20+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154279/7f93920a-2882-460b-a355-767145031c11","VERSION","xnJx_k0yM1dQYc4DabJ.wqEym8DJB0Uo","true","2026-02-09T11:06:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154279/b43fbe46-f308-4806-9e45-f57328f1409f","VERSION","nj8aj0HmOyKS7X681oNolDNjTXDraeOX","true","2026-02-09T11:06:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154279/f3edf8aa-6de6-4e85-a24b-eb8eea461eb9","VERSION","m_7a0w8WUokhcFWkYH31zUDuY99TEKyw","true","2026-02-09T11:06:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154279/f720c87d-8ba7-4fbb-bc99-70a00f3245c3","VERSION","6SAHS45oUrIGmxNrw4h4VJLfsv5lgQu4","true","2026-02-09T11:06:21+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154287/11e31b44-3902-4984-b0e2-16ca23a86dcc","VERSION",".RnUwsicXziGWiO3PR7tulAeDhKyVvEM","true","2026-02-09T11:06:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154287/4ce5edd0-1fe2-469a-900a-94606024869e","VERSION","2hiwdVRPdvd2wByd19X68YXJInauNoBA","true","2026-02-09T11:06:22+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154287/621eaa5e-3e68-416c-8548-374a318f81ae","VERSION","AMNEinWTAXfYFVLxkvo5x1fCnFDTBwp3","true","2026-02-09T11:06:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154287/bdffb62a-f7d8-4a4c-9e8d-eee4bdd98931","VERSION","rfGVAAqLlqfmstIZn0g84scYrX9cHTPP","true","2026-02-09T11:06:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154295/250d1553-344d-44e6-a17d-8ae56d1a3263","VERSION","nMvdx6Gi_6ADXP5h08DgHfJXvMM9B9ZP","true","2026-02-09T11:06:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154295/474f5515-c814-4885-b741-f9a63549ded0","VERSION","Y9t6esRw2CAL2QDL8QbWVGYggJ1M7cpy","true","2026-02-09T11:06:22+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154295/a36f2a3a-5de9-4ce8-8625-eb6a981bd68a","VERSION","AMHWEdjPAdHwHixL5iVwyG5p44kvXD8M","true","2026-02-09T11:06:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154295/efce60e8-a23b-46e5-81b3-88f1b8634882","VERSION","_UBvPhmRoKiyPkw5tP8AVaLtS9hCYf5F","true","2026-02-09T11:06:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154309/081d179c-54a0-4401-bbe5-7d63eaca49da","VERSION","k8TK2dDg8Rz2A8ETRYLXatAWexv6R7UR","true","2026-02-09T11:06:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154309/7e9d1150-0324-4d6c-a539-72ffae1ff807","VERSION","iYGFTnzR_4ptKxNZlzDNj6jQT_x4_v51","true","2026-02-09T11:06:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154309/90a7645c-418d-43c8-becd-84adbd6861ed","VERSION","q6o.Y5jFgdlliHM8xWaWcwagt8GA_SFs","true","2026-02-09T11:06:23+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154309/d82c0378-abd9-402b-9835-c4da74feadb4","VERSION","RhpNiGluMc8bNFkUWeGHs.F3RqdGmvpF","true","2026-02-09T11:06:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154317/441350fa-9c4d-4e1b-ade5-a05e88767f31","VERSION","53dNG6MBMX6yBnFFr3XLeE.1yx_22MoW","true","2026-02-09T11:06:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154317/4ef76b07-f548-4081-8df9-e1904219dbe1","VERSION","5Zyxvn_Fq7SUNzfHRpHT7RXeqjGiAqxw","true","2026-02-09T11:06:24+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154317/be465f2e-5872-4333-b7df-71770fc86e3d","VERSION","MtdVe68pkasnYx1Hi8N4LhbmyIaJ6syN","true","2026-02-09T11:06:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154317/da8977c1-e38c-4091-9361-b969cd563842","VERSION","q0SgdB3vg15zRZpnIjR2QB97pSN6yFZ4","true","2026-02-09T11:06:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154325/3ab9bbaf-9af2-4a29-862d-fb1b77fb4e76","VERSION","M8s2iPox_upvBKrUrzoFcmim_rVjpg26","true","2026-02-09T11:06:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154325/3af3bc92-2b04-41ae-a3bb-b5873b23a2e5","VERSION","1jB4pmI.RJBBffXrePd5_1.RpajrALjo","true","2026-02-09T11:06:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154325/597d6bc3-0a72-4863-af3f-c7f52d744bc3","VERSION","NDKWIlqCVF8ygXu0ec8C6ejkyt9LN6qC","true","2026-02-09T11:06:25+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154325/7da307d5-8e6c-4e65-b6c5-767aa0bd8e6a","VERSION","44XLIvh.1jV2wun3Vcex8MQ4GckrFo59","true","2026-02-09T11:06:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154333/4ef12109-526d-4da9-9a69-22df3ae5b780","VERSION","rpheQDJhEcMlsxC2f1iRIjwIIWYTsiue","true","2026-02-09T11:06:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154333/8f1058e9-7811-4130-80a0-fa33984d8bda","VERSION","1pOP7nNMZGPLSXCEimqICGix8eYqE3Jq","true","2026-02-09T11:06:26+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154333/a898478b-2c7b-46e2-9a74-65992089cb84","VERSION","0dCKlA.uKVXq9TBPt2Ory.ZYhQ1miKlA","true","2026-02-09T11:06:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154333/c489540a-ce45-4d1e-a39b-d4d540418cd2","VERSION","F2bd5sVMpgKA5jsJMWouiPdIoGNWzO8z","true","2026-02-09T11:06:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154341/220169e3-4084-4cb6-a13b-8aadd1f58fb4","VERSION","RjNhhL7cXcdP.gqPqIM1Dr6jZoC4yFWt","true","2026-02-09T11:06:26+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154341/59b37756-d90a-461a-bbc9-3baa223b352d","VERSION","MNnY2f4jzGLbDCzoFpFoZmg4lFWeMOrE","true","2026-02-09T11:06:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154341/a6533cf9-b7a7-414c-8708-3ea8eaffd7b7","VERSION","9jNZ8jDfIjeQhJkZfsvBEXOtdkSKL7jL","true","2026-02-09T11:06:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154341/aabc4544-dce4-4426-8b05-4fe976e77685","VERSION","ivRPckKHCzfS7hQNKOfTwlAsJbE9DB7z","true","2026-02-09T11:06:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154368/4c175ab2-63a5-4061-91d9-8180786a433e","VERSION","_V0XUf0JqNBUqD0A7ueS8Y02ZKRY5wJz","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154368/8352eed2-2604-4a4a-b08f-5a7a661253ce","VERSION","YV0R2tj0ImVb_s8LV5ORPw0mNRC8xto0","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154368/8574209f-3b26-4711-aa74-27da90e44183","VERSION","NoPNnJnye99Nn84k.8S885sLiSZWRQxB","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154368/ade9b11b-16f9-4412-b930-e65e8c83585d","VERSION","IbDm2C5FUNzahXLpYdsjpXqMUQAraB6q","true","2026-02-09T11:06:27+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154376/19afbcd1-790b-4304-9066-147cd85d8748","VERSION","Dg7SveGQzn6e2vq8WGkdH7kTbRAfVc1h","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154376/4ce7998f-ba87-4b23-b3b1-00472c11280e","VERSION","ui8NnoYuVwn_w_3d3ZYgQfutS_I1VaA4","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154376/76e08ea9-c598-4010-807b-3a14dfa93abc","VERSION","lL5d8wslWU0uMZwy5sd7oaFOqtczKFM.","true","2026-02-09T11:06:28+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154376/982a1081-3db9-4e0d-b9d0-136cd0b535b0","VERSION","yUn9u13Tc0ujnuFfs.gXVvOH0Ir4ur0H","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154384/476913ae-5e52-4bc2-84e6-6d52969136f8","VERSION","7bAqcQKkeSzrO7W6z0IcBaq8dUfGL6tV","true","2026-02-09T11:06:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154384/512d1452-9869-42f0-8127-9580d75b108c","VERSION","NbrBMeE0Gd6VshFVBNpno.lOuuJgmbgK","true","2026-02-09T11:06:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154384/8f767830-f5c8-4023-90ce-e991a622c6ff","VERSION","zZc047giuJlj6u8bfOoaRqpP2XcWunUB","true","2026-02-09T11:06:29+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154384/904743cd-0c69-4083-892b-9761fc3bb6fa","VERSION","PuiEJfZFBpguIuz4OrqRxSB5yNkqF1mz","true","2026-02-09T11:06:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154392/5249bcb6-3eb9-4b58-84a9-e3f413d8e974","VERSION","qXdP7FdqYXxDVAoWCV5to9RIThYiruY8","true","2026-02-09T11:06:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154392/99039b65-a5b4-4402-947e-34d644592e0c","VERSION","Q195U366xzAYxUcSZk2uvpejm_qy76Mc","true","2026-02-09T11:06:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154392/a9d922a4-a48c-4f1b-832c-21988dab40ec","VERSION","3BbO4.5CVyHZGcAV45c.4NDSxfThTgu6","true","2026-02-09T11:06:29+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154392/d9fcc647-e87c-4187-b145-8a9534b0c852","VERSION","xSv_rnHxIXfGr0gYaXeuh1gYy1G87qpq","true","2026-02-09T11:06:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154406/0900be52-4f84-40b8-9fcb-d9280e8d2352","VERSION","EKdK5nWjYjo8_wJlHN3_qxOKDX2d2vnE","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154406/28a236ce-4d45-4961-8b8f-93451ddaaceb","VERSION","AihRR5c6Pkt2wiTFAGsjif1RlQ3uZp1q","true","2026-02-09T11:06:30+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154406/ee69c710-5073-46e7-984a-9944e1a79d83","VERSION","uU2QP4sbqooQOfmLhZZadakWbGpcE_j6","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154406/ffb665c4-93a0-4898-a2f6-888af657dd86","VERSION","XU6HYxJL5KY7WSUpm7OxSQwcDN9xMhaE","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154414/3da9a9bc-d803-4f4d-a65a-79b7aa2b2f30","VERSION","lzn4ew08lF9Hp7Dbi0thXqv0Mhh9AzdH","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154414/3f99f7c9-d204-445e-b448-eb48ca36d735","VERSION","MpEcRZMCuNJYACYYX8NxCVW40AUaNKXL","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154414/839799d4-aaef-40d7-a768-888a0458f8ab","VERSION","r3Cf9BAWiiE1agiddaT68j05tTGGCfkc","true","2026-02-09T11:06:31+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154414/a7ec1f97-cb35-4dbd-81e0-cf66bb415571","VERSION","x2dOCmTqsYLORAyHbJEF.qIvg_oORFXE","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154422/7cab5ea0-c33b-4e47-b05d-8c75d37405ca","VERSION","_XN9AHj1vAMFbDSavgjxB.uCz4HsJhcT","true","2026-02-09T11:06:32+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154422/80c2333e-8b98-42bf-8ac9-b9194d9aa927","VERSION","w49ga3e6rZU.RPwileme2XrPMOxEBVzt","true","2026-02-09T11:06:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154422/e90207cb-755e-4a11-af46-c97e5f51df9c","VERSION","MiGTmb3Tqef.tTbGB8m87C2SrUkdXl_P","true","2026-02-09T11:06:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154422/f2830960-87cc-4ef3-9d13-149e4c190453","VERSION","nJUOLmjRrcBu_VySCoBHLd4z7qK2svCY","true","2026-02-09T11:06:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154430/6d2ed8e4-2ce5-4c58-a5a1-5f9f461941dc","VERSION","cljuGqdODGOwlvj03_96o.rlOhPO6rm7","true","2026-02-09T11:06:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154430/837b5c8b-ac16-4d41-b5f7-f3cd6768e3b1","VERSION","DRxXF7.mSGgeF71xaUjv62QtdSUCY57O","true","2026-02-09T11:06:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154430/973d41b9-da58-4cbe-a16d-42ab0e7fd6f6","VERSION","qBPriOevvXvDP2NtDNTU5KEVb2x.GrIy","true","2026-02-09T11:06:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154430/c5f8b790-08aa-44f5-970e-f3d6d4af202e","VERSION","m4HnbgC4b2kXpWBlUTdATqA64B7E5pD_","true","2026-02-09T11:06:32+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154449/89a32373-0470-4359-9ad4-2c273437ac04","VERSION","1AvfG1MWPacT75Ba0Z4.k95kCA3N5qyh","true","2026-02-09T11:06:33+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154449/8df0076e-83f4-40c4-8f0a-c30cead60dac","VERSION","eFaXftU.rzWEug7as5j0eoDSdAUvI5Ef","true","2026-02-09T11:06:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154449/add8353e-7161-43db-89d0-425ba28f63f6","VERSION","IxWzhS5Qy8RIZv_kR_VZOZz1hOe87931","true","2026-02-09T11:06:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154449/ccbf441f-77b4-49d5-a046-dcaea9b40d91","VERSION","GI.eKiQMC9RpG2Sikhh1qbjBECpIWOJd","true","2026-02-09T11:06:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154457/51b1792d-b29b-4909-a259-d29977fc8517","VERSION","ZFtvN3VXYuxllX3cTMa2TR5gv2gs1ykN","true","2026-02-09T11:06:34+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154457/b8752794-5e7c-4161-aead-9a742b9e1cd5","VERSION","xrMk0.6XtfrxDSEZRWfB8y67Sz3iW11V","true","2026-02-09T11:06:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154457/d2327428-7c65-4914-9aa0-18678399eb21","VERSION","OMf4s5oL8CPcmKHAD7IzAC.bfu_XQxRI","true","2026-02-09T11:06:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154457/d78d886c-58ec-4fb1-bd09-70ef718cc918","VERSION","HFx6zbt3S6rBqpTRVy8cwADWLaZUDfK0","true","2026-02-09T11:06:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154465/2f94b006-a433-4a16-9cb4-55bf14db3250","VERSION","R_CNrSVhLuo.flhmqOJhtKRIZqw980UL","true","2026-02-09T11:06:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154465/582f97a8-3de9-4b94-8615-efef6827f002","VERSION","pzF2UpwRrAnsGpQysH.Er8c12YMh7DT9","true","2026-02-09T11:06:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154465/7a292fec-722d-4a26-8449-9f4c9cd437a4","VERSION","eHcKjNJV8.6zFUgWar_GtZrvW2qtF0bY","true","2026-02-09T11:06:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154465/9d2c0df0-ef6d-420a-a56d-e25c49ce1a52","VERSION","30CMH1.nMRXLsTIg5zNKjpXc8hBgF7rS","true","2026-02-09T11:06:35+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154473/01ca039d-8b1e-452e-aede-fbcc31742181","VERSION","53hjM97ufR6BI7Vja.XkA4lCAZS6XyEC","true","2026-02-09T11:06:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154473/053a48fa-4e63-4ca1-b1d3-6c9ff051e9ee","VERSION","sdRnrKhSSBmYeW2qr2cMGDStlfUXPgSL","true","2026-02-09T11:06:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154473/0d801605-cfb8-489e-89bb-70a39c2a225f","VERSION","OiHZWBAVOgyN8TwMFHu01RJmSIZJ4GhB","true","2026-02-09T11:06:36+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154473/6bec7537-9a96-4479-96dc-401726d1e3a4","VERSION","RL45tFIWpVv..6Sp2OOqitXPBHmBVx8F","true","2026-02-09T11:06:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154481/5b7d6dfd-5c96-4d99-811b-9d13e21a9fde","VERSION","vVj2pyGGtl5zs9tQTXbPIARcOU1Y...X","true","2026-02-09T11:06:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154481/76fb88a9-34f1-48bc-b58f-fd01ba605d02","VERSION","J5mtAUwF_w1.uB4Rhh7B3BV2chXgNOoI","true","2026-02-09T11:06:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154481/b514471c-6bd9-4c6c-979b-18a2a85763be","VERSION","7I.1FxtsY8rOZK_0py1VYLf2enp7hV.4","true","2026-02-09T11:06:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154481/c662ec9b-4c06-436c-b41d-925e1a5f2f34","VERSION","noXBYWat47i.j.vE.CI8N9t6MnH0CrdZ","true","2026-02-09T11:06:36+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154503/3f685b3a-01ab-4cee-9d9e-5e7d23919127","VERSION","h0fEbUngAMOH5Vi7uoW_GGIXXjL_0Lym","true","2026-02-09T11:06:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154503/7ba0d082-829b-4609-89ad-42420cb33824","VERSION","gB302DnD0pTyeaWmMHil4QRPLuKHDHIP","true","2026-02-09T11:06:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154503/a7beee65-a492-45a9-a133-762153873445","VERSION","QaSmYBCLelbSsuMIOI9VZWxBopROnT43","true","2026-02-09T11:06:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154503/ca444d74-c652-417e-9657-09144abe3cad","VERSION","MJeKFVJKhUMbnwzv3eNnZ.lKHT905_gI","true","2026-02-09T11:06:37+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154511/4f2c8036-ff74-4553-b758-29ede47a453e","VERSION","bDui1d4kTvNFn.zaPKyO4xl_o7R1rYgX","true","2026-02-09T11:06:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154511/624b9c91-7b00-4cd3-8a56-920aa0691c04","VERSION","mzlSRuYBmnkodtvZu0MuoJWlhcwnXkcX","true","2026-02-09T11:06:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154511/72d18239-3f71-4a36-bce3-f94f75b3e5bb","VERSION","LHNXUIuI20lrNCXk7voHy64GAtzenZjF","true","2026-02-09T11:06:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154511/ff88ea88-cf9e-425e-b484-48cbf00299fa","VERSION","K3oJ_M9lAbF6NSkmkRqR3PoydkXZ3Lrg","true","2026-02-09T11:06:38+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154538/0a3610e6-3c52-46a0-8256-89a1037c7d75","VERSION","QYK29tGlT8FDFdmpgUSBm3okFWnE1.QP","true","2026-02-09T11:06:39+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154538/958313bd-ce78-492f-88a5-c6b9c03e585b","VERSION","40eP1KTKxOLCscWTzAjv9jKkPXt2EsFH","true","2026-02-09T11:06:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154538/a7793089-1f9c-4368-ae43-bcb7368d3959","VERSION","5VCrQl4nEqE1cYKp2wJvjXhA0JD1MQHs","true","2026-02-09T11:06:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154538/ff1852e0-6a85-4249-9797-8953fde9cebf","VERSION","O5ZQKcfQiajG7A2QD4sqJy7ejpZVlxBw","true","2026-02-09T11:06:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154546/0084f9a7-fc45-4174-9445-98c661758fbd","VERSION","blNkt4bpkgZY9H8lAH5.TD3el0N.0ctQ","true","2026-02-09T11:06:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154546/61934b29-e37c-4eef-967e-4b902976acc1","VERSION","4f9tg9zn1oPbKkskO7u4bmiPvmR28TRN","true","2026-02-09T11:06:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154546/df22ef69-7b30-4207-8f21-5fe7b94cfc54","VERSION","oXzsb_KVxuinACPif5AQzkwbk_PUw0FK","true","2026-02-09T11:06:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154546/e3d41e9f-0b08-4bac-a738-5afd5df51b6e","VERSION","gI1ju0VaR1gfTyDuDNOaLx85fgAQTxFS","true","2026-02-09T11:06:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154554/25526a89-5ee7-42ad-a29d-765bbacda3a8","VERSION","UzLQW4FrLWleqkURWs104Sdcd2_7PQH6","true","2026-02-09T11:06:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154554/66362d0f-7de1-465a-995a-f4f2c51336ed","VERSION","GYXp._3V1ClSRuUR5LYHg1Wb57UBSwbN","true","2026-02-09T11:06:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154554/d5fca96a-0e44-4ccf-a4ae-004fb5a624c1","VERSION","vNjvfgQZng0sIkITIXrdmiKTjyq06VdA","true","2026-02-09T11:06:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154554/e9544651-a184-4e08-acb7-6dd102ca1b9c","VERSION","5tLo4cC7XNqbi5VjbRSEdkdiNc1NguDL","true","2026-02-09T11:06:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154562/590ca5fd-b2a1-4daa-82a5-829c15cc22ac","VERSION","PEnwmhFgr5lHdtc0FEJVw1xqHXAvOJXy","true","2026-02-09T11:06:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154562/5a25e6c9-f69a-4163-b139-6b0b7ebe934a","VERSION","XYKB7MEiZQMVdtbqNeUQ3KX9sCR9kZnb","true","2026-02-09T11:06:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154562/5dc18dec-0900-43fb-a6f5-35bb74ca2cab","VERSION","cSPWXFFsBYTEWD4KE053QgfRAiBjC4zs","true","2026-02-09T11:06:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154562/e1758e70-3f91-46f1-917c-d52c789564e7","VERSION","FMSKC3h4tuANPaYo1.AIsQ2z7ZTMO90o","true","2026-02-09T11:06:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154570/1f067eef-357b-4ccd-9196-5cb04506ea27","VERSION","ng_dMHRU19CiPkJrp7T6uzm9mx38UZ50","true","2026-02-09T11:06:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154570/37ace2da-3a76-4580-98ef-935d66198fb5","VERSION","cbET5f5gs6XSjRrkVcrxDtbOfAPFpwnY","true","2026-02-09T11:06:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154570/72941e98-5ab1-4d89-8edb-e913e7aa3304","VERSION","dknURchxkkYO45hGE8JniHJNz7vkKSGV","true","2026-02-09T11:06:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154570/7823511a-43ec-4867-8c11-1e4f14642db6","VERSION","ADvFl135q1MYxpFvTPzpWyswXF7QX6va","true","2026-02-09T11:06:42+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154589/579c5b1a-eae0-40d4-b95e-993e6b964541","VERSION","pu8HFbT0M66Vg1aH8sNKUiMpxoB9UupS","true","2026-02-09T11:06:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154589/b971677f-651a-4197-8c27-b4b9d298eaa7","VERSION","ELOhEnrfa9XLuFt7NgPYrfd5s2u87WMo","true","2026-02-09T11:06:43+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154589/c560d12b-d58b-4c5e-9a9f-8fb34f4078c9","VERSION","oshEiHfGOpOEX9NS0xuIKaRAmHzqRs1G","true","2026-02-09T11:06:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154589/d6e65514-7c2f-4666-a714-fe24c7566adc","VERSION","OyI_ecgC789gpo5glkgnFkzJQrFuNJWS","true","2026-02-09T11:06:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154597/0b3b124c-aa82-4dda-8613-e233681faaaa","VERSION","WgWWMOq1V0XN42A63tCcbb5FFVrSF0l8","true","2026-02-09T11:06:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154597/58d91cf5-95bb-4916-9e48-34ba1de120c9","VERSION","mpcOUtgTQQIwErks6tj5EaPXmeFdHyQE","true","2026-02-09T11:06:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154597/7c1691ed-38a2-4346-9fb1-de62a79537df","VERSION","XGM0k9RegbYCKXjy_YUxzC9NHQ6oyfpR","true","2026-02-09T11:06:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154597/dd1f8a5d-71ff-43c4-a856-0e6b0ab7e282","VERSION","6NqFe4WjHQ0wLmEHbYW9JjCVFlqD2oFH","true","2026-02-09T11:06:44+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154600/78f83851-f63a-4ace-8558-9e362915a001","VERSION","4QcnoYUQU_O2q2ZGRoDKb_V.vJ_Lj7DT","true","2026-02-09T11:06:45+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154600/80398ea6-7623-45b7-bd16-7fe5620c4778","VERSION","foYCBaBh616thrB2fmV5pi2bXTSha1ag","true","2026-02-09T11:06:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154600/a0c0dec4-27f0-4f75-9572-dd54e813a156","VERSION","7x2bYJ.qrWi6DYCNPE99OWplJmfldUdQ","true","2026-02-09T11:06:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154600/e15f2d58-a67c-487c-bde0-4a671fbe075c","VERSION","4tYgACVfq6x_E.qH8ASFxbLTxKkLVsrk","true","2026-02-09T11:06:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154619/72fbff68-bd9d-4d6c-9092-82f2336a6b5f","VERSION","e44SyNrI0lHVri4b1hzBwbCppEGKa.40","true","2026-02-09T11:06:46+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154619/b5fdccb3-c0b2-4390-b3f8-c5a6a21f2398","VERSION","6Zj6ykYpdnG3kXU.AQqG0jLNHcD4B.fV","true","2026-02-09T11:06:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154619/d19ae02f-c026-4cd8-98c1-b7ae2a3ec5d2","VERSION","JEQx.XAFflbNo25wDsf.u7OHnEOTE7wn","true","2026-02-09T11:06:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154619/d733b3c8-0856-4893-920b-7d2d5dca4adf","VERSION","S9ZKapASXr0aSe0CmEk8mhvZUTItE8s9","true","2026-02-09T11:06:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154627/77c01847-25b8-4204-bba1-15b5e83e92db","VERSION","vgb6Pel_UC4sNFmlvC0NFWkhdzuJ4phI","true","2026-02-09T11:06:47+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154627/a4de30ba-7077-4c7e-8ae9-02ca43dca517","VERSION","SqyIpn4iFgqGMOaZ77XJKJ26br_r_8Ij","true","2026-02-09T11:06:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154627/ac20a2c0-fb1a-47c2-bbeb-105707e1a699","VERSION","I__cPuZ7IemxROob.d28n4DVDlPUW7uo","true","2026-02-09T11:06:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154627/f55b328d-afae-4d9e-9476-a850446897bc","VERSION","7A2SuZnafv.edOUnN7h2JbznQPEjuBPD","true","2026-02-09T11:06:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154635/00b4b446-182e-4549-b7b5-525563ce84da","VERSION","33uSRdEw8x0l155AxP9SWrEoU4qg.rDY","true","2026-02-09T11:06:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154635/b5c16e61-3030-47b6-8f50-684f1c408752","VERSION",".Coq997BCEdGgjDqyh.NKZLdwlJk6lGT","true","2026-02-09T11:06:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154635/f09fb279-4e20-4842-ad55-1125145f4783","VERSION","bSZtO0W.gmZdNd9Z6EZGnaOAzjiHHFh0","true","2026-02-09T11:06:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154635/f4a65d64-2d39-4141-8b06-49b888756566","VERSION","16.iJIP.fkeSd3zn78ETiKF8EDjfGF3l","true","2026-02-09T11:06:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154643/150fafc9-0b1c-418e-b5ae-87c96260ce56","VERSION","869FQwUQWAa_QjoUn3OgQeIdEy7miAYK","true","2026-02-09T11:06:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154643/3d77d20b-13ad-4254-89a0-cff63a7bd826","VERSION","zzi_muzLrnDFUGQcCIwtWdA76e_jjM8R","true","2026-02-09T11:06:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154643/8b4ac801-e0c8-482e-b825-241bfa0f2386","VERSION","R.EQT5zZMfow_mnL3NkFj5MkfpYa7Ej5","true","2026-02-09T11:06:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154643/f441b417-6ec3-4898-8a45-2c3732a2b934","VERSION","fO6KioBNIpM_0ivK0u7cikc_UEZ5Uzd9","true","2026-02-09T11:06:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154651/848f3f5a-9be0-4cdf-8dc3-e9b64349726a","VERSION","kC5iIxtpvf6B7Dt0LpvLcoZAr_3B8EVX","true","2026-02-09T11:06:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154651/a2daa4ad-e6ff-4b0e-ab9a-33a00d515365","VERSION","J7EpxH1ogUAjOMlUheBcWvlPAukkY2ru","true","2026-02-09T11:06:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154651/a3b86392-ef2b-4454-a55a-a5297fd026bf","VERSION","E_iyNi.3sNcn7Kgylo2G6IZDeID2Lada","true","2026-02-09T11:06:49+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154651/b49aa794-09c2-437f-b9b4-6b2ebc8f543b","VERSION","3iR7Qqd_L5kL7ClfPAYVanPdirvfMoUl","true","2026-02-09T11:06:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154678/298f617e-3994-4c98-af5f-5d7492fdefda","VERSION","R_4I3HtTufqCl_YsWsPRe1EUZS3c4E34","true","2026-02-09T11:06:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154678/4d3f8810-dd44-4236-94c9-723b3d76bc19","VERSION","678xekmLXKMQo0fAmf2JjyUPn0AeQFK2","true","2026-02-09T11:06:50+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154678/6a6d56fb-4814-42ef-ba47-fa28aa140809","VERSION","ChnAc0A9pK8O3RCIlur.6TBpBeXgE0LF","true","2026-02-09T11:06:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154678/e823ae35-61de-4a7c-abf1-17e10d8c8b4b","VERSION","0sqvJMSS70IalIAh4N2oW6FTiyqyTgeH","true","2026-02-09T11:06:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154686/56c9015f-0be9-4b29-8c19-95a2a80685a0","VERSION","e8iiLBTvzgBXHRkfhy8CqoM3zFWs4Tku","true","2026-02-09T11:06:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154686/6bb2bcda-7ca3-49b3-8796-38b4c3f599c2","VERSION","bqZ4DWJF4pqILUqaHzzrFp6Sxi9gy_RT","true","2026-02-09T11:06:51+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154686/b0b99a4b-6514-4210-9212-2040313117c7","VERSION","laSkVSjHm37SUwrNrss5n0yl2JGjQMlO","true","2026-02-09T11:06:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154686/b8135afb-1f9a-48c0-865e-9ebb45fd4cd3","VERSION","7aCtobR2P3MKiw8rpwlzUP.iHBafWh_W","true","2026-02-09T11:06:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154694/26613888-6a02-4f87-ae7e-642a499bee80","VERSION","qjsElY7tleEOR96lAxWJUHHL8lChmMXc","true","2026-02-09T11:06:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154694/3d93b89c-8366-49c9-89fa-e996c42ffd37","VERSION","ByjFRncTDDtzXFdaZp46C7yASuJZlhx2","true","2026-02-09T11:06:52+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154694/808b6ff2-5dcc-4324-bd06-669eb78adef3","VERSION","2JB5tndPGqusxpTw.8eyEoeOxzy70tua","true","2026-02-09T11:06:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154694/ef93d604-bbd1-4bb8-88ff-3d2617820d39","VERSION","jTOpmW7Uk8no3VWVd06fUM9ZgmE18xVL","true","2026-02-09T11:06:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154708/37a504ed-f7fc-465b-8059-20288a3ed785","VERSION","F_j0TNc_T5o9cNw5QLnNE7u46FpcNDbC","true","2026-02-09T11:06:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154708/7563464f-e3a4-4ebf-b844-e24d42f0a817","VERSION","0dWsSG4_3RWGKUh_8U8EA7Dbt2jNnCKG","true","2026-02-09T11:06:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154708/83ab468a-7f24-4571-9f63-f46db3e197ff","VERSION","m8oZ4miAn3c2bBAj9X69DGTRSVDfYdke","true","2026-02-09T11:06:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154708/ecf3b7eb-e1eb-4208-b182-c6e42b00a09d","VERSION","kZo1RoMN12.JX69EfctTqP54vqOcsTMU","true","2026-02-09T11:06:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154716/22aaaf6b-05e5-490b-9559-5f6f5dd4265f","VERSION","sRnqGHlfqUd0lbyo55gFeQIj8to9TUms","true","2026-02-09T11:06:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154716/345c7bfb-6bb7-48ac-8ee2-de705b585c2e","VERSION","I.03wYN4udPvi4htng89EPGfo3Vr0plS","true","2026-02-09T11:06:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154716/3d5fa9e9-7145-48cc-901f-d6be626174e4","VERSION","7w_ohP7s5BRUxJf6MdVMlUkrbNFU1Gyb","true","2026-02-09T11:06:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154716/941e9586-7ebb-4d57-81ae-a36d72223424","VERSION","DVq9ablsVWhLwS36scqwfPVtl8hlE94K","true","2026-02-09T11:06:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154724/2b188e3c-f64b-4940-93f2-6d3d46ec4b73","VERSION","VplIrTPr1ESClejo4brklVk2u75LE9mn","true","2026-02-09T11:06:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154724/3925be73-2177-4cff-b58e-63a4167458d1","VERSION","6dNuC1dXHpy6px4wPx_pvN1IGL0eooOe","true","2026-02-09T11:06:54+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154724/d561831f-e555-489a-a3f3-698b56b23868","VERSION",".R_8bsPmbq1E6V5oRqh79V686k9UNd0W","true","2026-02-09T11:06:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154724/e17e2a5f-26dd-4a18-a30e-567096e3ef2a","VERSION","Wp.1oYUrc9.B2yYRKPB5DOjQSK2AbQtc","true","2026-02-09T11:06:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154732/6fc463eb-f033-4dd4-986e-ea7ef4c44817","VERSION","jn7BhBwj.05DvyOEHidRxMQPXsT2QUaf","true","2026-02-09T11:06:55+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154732/7e2f93ab-2056-4cdb-b642-c041ffbde745","VERSION","HP3UDwfVzV63HeOAxkAT33oeZCFT2PCn","true","2026-02-09T11:06:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154732/b3740aa5-8030-4cdb-9f5d-d6115ffc40c8","VERSION","yL3gaW_lWo_vbee4v2OGLPf_e43kd4UJ","true","2026-02-09T11:06:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154732/de18b62d-4bf5-4009-821b-f4180ff909a9","VERSION","NnPyFD1JekL91QE_YvT4m.jZC_RqL.p.","true","2026-02-09T11:06:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154740/184629e0-5e0b-4af0-9b14-a5829824c314","VERSION","L.AUtt7UJCGpcnILODCK0ISV_Wm2iXQL","true","2026-02-09T11:06:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154740/6d3857fc-fee5-4ff1-9c09-e8dcaee34c08","VERSION","iIug2z4NKa3a5gxsFfHFQTYmkYSmLcgA","true","2026-02-09T11:06:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154740/8f83cad6-6f6f-4364-8d84-44f2d0874e92","VERSION","JIR9cxeU3yQtfwzF9SI8KpS.Up6bChdc","true","2026-02-09T11:06:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154740/d027d23b-0340-4584-8788-c6287cd6d1e2","VERSION","WbH0Aaspxk8G2Pt.0C_lV4LACN4JMskC","true","2026-02-09T11:06:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154759/35352c08-5142-4e14-bc0f-055ac78ce1a5","VERSION","wBeCEIQXc2b3Ib3Fb78IMT4MhHN9s9VC","true","2026-02-09T11:06:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154759/79a1e127-cc2d-4362-9b5f-96171a5430f9","VERSION","Yz8UkG5pxW5izDLsiR0DXuaM_t72Nx5q","true","2026-02-09T11:06:57+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154759/8f019c99-d9a9-42d1-98ea-1b28158bd969","VERSION","V2t164bkDIUEAg7ztEst1Thlt9weE6J7","true","2026-02-09T11:06:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154759/fb5d9c40-8e30-4233-a72a-961142a3686b","VERSION","20e2Ct3.PZ0ZbmJTrOH8cGnpXXkAsG1W","true","2026-02-09T11:06:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154767/b1c440bc-c153-4708-954d-6c35d8422b50","VERSION","CXGvyfRzgJIAI7413sGULis034z4oqLI","true","2026-02-09T11:06:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154767/da9ea236-cb0e-4388-91c6-7c82a1d52d1d","VERSION","pbQiEFH3BuBrQOXRyK2Iek5l764XPpId","true","2026-02-09T11:06:57+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154767/dd962cd5-10a5-4e9e-84e3-b82d28f82137","VERSION","kABeHHVlVUm7BA37sh.sqei3ZPSPJ6zn","true","2026-02-09T11:06:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154767/ec57d6d8-832b-491c-928d-95d6a49e1c6a","VERSION","FUVgwxHiphdcmMOEKcevLroc1WgneM4.","true","2026-02-09T11:06:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154775/7eed4ee8-d6a8-4bf2-97f3-0868648352eb","VERSION","GLgPd9VvhhC6RAfilf.1K1NEz8Jb3ySL","true","2026-02-09T11:06:58+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154775/9a1df035-2806-4221-8065-41ee78173116","VERSION","2RzJZmMDKSjB6UxZ38RvzsSUuTt5d7xK","true","2026-02-09T11:06:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154775/bb570e87-ea61-47d7-90ea-9015979bb3d9","VERSION","YzVce472n6.S6IaD1wxmQcjb3zOMNhJ_","true","2026-02-09T11:06:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154775/e2986c49-ad2b-408b-a777-8db955bea6c5","VERSION","9tcFNAISwzXEmKZm1UP1tQdtrnprweh9","true","2026-02-09T11:06:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154783/332180fe-2e70-492d-970d-8d1526bb540d","VERSION","nxOWGUPYXR3LHr9OjVB7vXB1REl5yhOP","true","2026-02-09T11:06:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154783/9525deb1-9205-4a45-a95d-c5d2336014a7","VERSION","KWFEXisma3fK9GKn2IuBjtw4FGbhFGaW","true","2026-02-09T11:06:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154783/b329e2e3-f9ee-4f2c-a0c1-e85329f0a17f","VERSION","i308PnnIRcCuFGRD2Otry7.ygMWRMZRJ","true","2026-02-09T11:06:59+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154783/e6838e12-4888-4ddd-b87e-6c74da4f255b","VERSION","1xQYGLtTs8hUnyOFx4O1q4ObF6232hv3","true","2026-02-09T11:06:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154791/2c37b97d-684a-41b4-8f98-0e5b692905c3","VERSION","9XILduvBf7UOXqEJbbcM0HD3t7rNnRj_","true","2026-02-09T11:06:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154791/311b71e5-9ec9-4cf4-8ce8-837a3aa4cd4c","VERSION","eMkOs7ohNyqvvtLo5i0yc5L08RNBSpjB","true","2026-02-09T11:07:00+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154791/93d4b9fd-d7d5-46d1-afac-acb16fe307a3","VERSION","VUzcqd.aip3v7KFrEjToPuH3o_Eb3IlC","true","2026-02-09T11:06:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154791/a8ee45e3-263a-4606-8f8b-283dc4dcccbf","VERSION","jofeAjJcA6ueJ1s3a6nRb913.7RcXKCk","true","2026-02-09T11:06:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154805/442a9291-269a-43c9-834b-e6f64eb5bfef","VERSION","EbolOJVrzJxd.ij0B31YufuKqMeW3a.D","true","2026-02-09T11:07:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154805/5e61e419-1b72-4055-bbb5-79e094c15047","VERSION","BJuxC8NEUghRbpB.qHqZseN_fEIuSc2k","true","2026-02-09T11:07:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154805/7d8c8b14-e97e-455b-b446-1f7e88a9a110","VERSION","tGlWztT0cW0tjpP.375h2GEQUL971WHj","true","2026-02-09T11:07:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154805/c62af10f-2da7-4233-87a3-38cbba520613","VERSION","iVRjeZqg..kXneuPczy6K1WFFSfT5D1K","true","2026-02-09T11:07:00+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154813/0add6727-e8e4-4625-80c5-6063c92a3c1e","VERSION","zDa0P9xyofhH_zqTmC4J74OyO2zCc9aa","true","2026-02-09T11:07:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154813/266e0b05-a8fa-4302-a288-15f985a6145c","VERSION","mcHTqoIWH82GvKbgZnaKXmpm4vHY2hxq","true","2026-02-09T11:07:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154813/6d70b48d-4ffe-404f-ac42-03ef253ecc76","VERSION","U_RO3udDa26aagxEQuhnu1GL1Fv3D.Mr","true","2026-02-09T11:07:01+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154813/9c677c2b-2deb-4607-bbab-49896f2bb9aa","VERSION","OGVPz_0OW0bIG2Ud6979B3xp60h258xu","true","2026-02-09T11:07:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154821/1f6de683-6ccc-4142-8bd7-b73dccb30866","VERSION","m6wnI7NVMEwaCVOrw8TkaZOXd5G83Oyw","true","2026-02-09T11:07:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154821/67d9f1c9-e4e5-477c-bb42-706286eb231a","VERSION","Aa4rI.hbot.A0FpsUTX.rkgJbrwNkoBO","true","2026-02-09T11:07:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154821/778dbfa9-afb0-4dab-bf42-e437bcdd49cd","VERSION","fOlKkMuLY15CpvanQo4BuLHk80OD1auF","true","2026-02-09T11:07:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154821/7c28e8e1-b5be-4de9-a7be-1c50cb41fa50","VERSION","t1s3vEwVseBlBkWO0awPxtysZ2TfHiII","true","2026-02-09T11:07:02+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730154848/6dbcf4e8-4c23-47a3-91fa-a15e0f3589af","VERSION","IZ71XcyDiLRqSXuaUYxswgDjDpLcftNs","true","2026-02-09T11:07:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154848/6f1a8525-9bf5-4819-81ac-859d136956e8","VERSION","uQLHRp3ekJ7.GCnb_NHkEkpdXn_SXbok","true","2026-02-09T11:07:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154848/8eb864e3-f9f7-452e-8d1e-6a272c780bf3","VERSION","DGAkWpubs74isKXseXp8y0uV_LMeD8dw","true","2026-02-09T11:07:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730154848/f6dc51c8-2e35-48ad-b341-d8f2af9a788e","VERSION","tuX2UtKFggaw5GthZet3brgJ6a3H22Jx","true","2026-02-09T11:07:03+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730256705/0a2c6de1-a4de-4d3f-ad92-aec0210cbfb0","VERSION","u1tkLVbw3AbJixmVytxYH__Hq7V5Limm","true","2026-02-09T11:05:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730256705/3b390aa0-ca34-4221-84dc-17130d8287c0","VERSION","lKeyQ0adGnQwGpTi62V7etcCx12HC3w1","true","2026-02-09T11:05:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730256705/78f80492-e13f-4e21-b05c-349f9612b032","VERSION","DGKB4JID34QcJDNbssLgCYR272G8VWdl","true","2026-02-09T11:05:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730256705/e6743802-037a-4662-97cf-7e72b993aa6c","VERSION","DcUBzH7VN1jVywlpfyJu.GL49i0u0iCq","true","2026-02-09T11:05:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730326924/0a2b4cbb-05ba-4206-a881-4e4c63e824cf","VERSION","D6TI1R7tJ2_wkiLehUcaT2aZrTYQ.gsk","true","2026-02-09T11:07:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326924/0f8c6133-39ab-4936-9424-140979daaf2f","VERSION","fpcA4.40fmhRO8rhrOv5aXaEnUikHfQf","true","2026-02-09T11:07:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326924/8cdfb688-d647-4ae1-b2f1-c3c0b8ec2261","VERSION","FpP73l89D4m5kbx4hNldU8wn5OD2tu0t","true","2026-02-09T11:07:04+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730326924/b34f2f57-dd7a-462f-8850-8414e7d94204","VERSION","xeuzp9OBmUzV4m7ixXSDkzVmORGbiCMc","true","2026-02-09T11:07:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326932/06ec5006-e98c-4cbb-a437-6059c15bfde6","VERSION","wkVGi6_PApeWDokm8NWgzST77Rg8JyCj","true","2026-02-09T11:07:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326932/7f9ad213-4398-4659-8485-34f9f0b9d074","VERSION","BsRkfwRyHabdg5G2VdnMRDEmSqAndgOh","true","2026-02-09T11:07:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326932/edd80d6e-3b6e-4f55-a93b-863c713eab39","VERSION","NhRKB2QT5dDf.9D1Zi2GaYPZ2iRP3kYY","true","2026-02-09T11:07:05+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730326932/f16cc9d5-4879-47b7-a6b9-8be7c7a147f5","VERSION","zKazUkyfZZJpHVu3WnYs68bw44Q40xKq","true","2026-02-09T11:07:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326940/07c7faf7-1b86-4831-811d-b51eb23c0989","VERSION","NLb84oDWB3xCcwdhAyMyjPvjvaM8NxAc","true","2026-02-09T11:07:05+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730326940/6e9f90ac-e583-4a09-a483-54dbaf3a7511","VERSION","0ZDR0UjxTOusjV8IU3EIIwf7FnOuDFyZ","true","2026-02-09T11:07:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326940/8e4450d3-80d8-4bfe-bee1-04f8035b4a95","VERSION","PmQoBwLl.ZJKGgJaVOhtXu.U6AumZucy","true","2026-02-09T11:07:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326940/ba410733-bd98-4522-97d4-57961e5897fb","VERSION","wWt8xdESsT3SQBufquFlfIBkqsy7szel","true","2026-02-09T11:07:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326959/367a296d-a4ac-4d6e-a9c1-94fcf81d3b2a","VERSION","V0szN5_Km7Sq_JwcB4wf0jOL_QZHuzRW","true","2026-02-09T11:07:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326959/3b5c3f8f-f1db-46a6-8f7f-97498871851b","VERSION","WFXBI716yDFMTvvoTunEfu.Q7BtrwASa","true","2026-02-09T11:07:07+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730326959/e58de8aa-ef97-4f97-b1d1-a732c1190890","VERSION","I.HBFP7bjKRwdpAl8auz.ekaogSAO6wB","true","2026-02-09T11:07:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326959/fa136c09-6092-44be-9507-4f4914c3a77a","VERSION","jgzTQ3caPkfwPc_.WHx2vNcweSeD03Jf","true","2026-02-09T11:07:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326967/b7001f1c-5857-44a6-bc2d-e1e71500e77a","VERSION","587peAPiH8nPGi5aP1gHIvcH9VxwPE0t","true","2026-02-09T11:07:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326967/d3eeb15d-147a-41f6-90d3-41f0489ee6b1","VERSION",".KLV_AKy4jz2DsUNccgARpM7cTG7zfmY","true","2026-02-09T11:07:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326967/ee1f8eb8-e541-4cfc-8433-ecc0efd9b862","VERSION","cOgCJmI0zFcPjx6CKePVHtL8jioOBJRA","true","2026-02-09T11:07:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326967/ee8ccf47-9037-4983-a309-00cf1237bb75","VERSION","O6gLQsaBjE0XkSeEgt4Fjo8JBXmmnmvu","true","2026-02-09T11:07:08+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730326975/1ca2a685-e15c-46c9-9788-3d8a9cd720b8","VERSION","LGC_67.BXmId9ZAxN1MaJqHtK75i9PaX","true","2026-02-09T11:07:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326975/27ce7387-a976-46a6-b366-7a04258b5871","VERSION","UyTsL7.d0FB4ybsPiYVuMZ8PiW3EcAiE","true","2026-02-09T11:07:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326975/4864c461-029c-4df8-ba83-9ccb7b20b38b","VERSION","LM65N6iOnjVJ732d5D.TIetO0QZLL7R8","true","2026-02-09T11:07:09+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730326975/8e9122ed-ee0b-4a60-bad0-a039393de5fa","VERSION","QprF5XiVKQoRuDhvALjDTNt0zx_LE9LE","true","2026-02-09T11:07:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326983/6f84adc5-012e-424a-9f29-cfd2b9bc6dda","VERSION","aY9F9vUhrWDyoBDftAn9ZKVEK2CH5Ldq","true","2026-02-09T11:07:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326983/8eabcb7e-7e9d-46cb-b65e-8ebbfd4782ff","VERSION","ExQ8nJdSqJGV.9bjTa47vlo7UTU39Aas","true","2026-02-09T11:07:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326983/b59ccf2f-0a8f-445b-9835-ef4ba91937fa","VERSION","fs4RMJvmBPTWpFtwLBIjYimscf07v8kH","true","2026-02-09T11:07:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326983/bc57271a-25e7-40c8-b459-bdaa1314b876","VERSION","jJ6vDaaPLve4miLAlE5cDr4ZsJTrKlyL","true","2026-02-09T11:07:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730326991/1fb67162-9ddb-49af-82b4-357d055fcaaa","VERSION","laaIyJz9BaOEVgo80c9dFPqblaeTXv0i","true","2026-02-09T11:07:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326991/4aeb52c9-0679-4a9f-bd92-acb16821204f","VERSION","sELlwyYobeXmqhDOrjGrcuzjIVsV1exr","true","2026-02-09T11:07:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730326991/661b7078-d5a8-4c18-a149-f405a742b4b8","VERSION","x9QtPthfbAUXwOhWFIBsBSTWbIPZXwtw","true","2026-02-09T11:07:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730326991/b55c5d5f-a0cc-4605-bd3f-dd685aecb3ec","VERSION","BvC_zWwW9SXEoxwPjxtX24sjtU2BriN0","true","2026-02-09T11:07:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730327009/2ac31698-6c6c-4f06-976b-c9239a3c0f77","VERSION","UdfmmIHw5F53GZ83D4ERDCK6FRwy1QH6","true","2026-02-09T11:07:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730327009/d6a6c756-3e59-4751-b28f-7b1679dfd645","VERSION","VYkBNc.nzy0cWvV1gcV8tUf0OuIefhpt","true","2026-02-09T11:07:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730327009/dac0e7d5-839c-4689-9bdf-1edba24e65bb","VERSION","qjyZwovPE9fpnDtwH23hEjtGBY.AHnH3","true","2026-02-09T11:07:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730327009/f6a19db8-982f-4c76-8c3f-b89fb72a2e3c","VERSION","vevwavaersn_RxjMlql84bP3cDHMZxB8","true","2026-02-09T11:07:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730327017/05df7e36-d70d-4aeb-ac58-8a814a6f2958","VERSION","SB4JAiiG571u9K9C5PKT9BovZjWBsIuS","true","2026-02-09T11:07:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730327017/2eb129b7-47da-459e-90e2-d6a4c25eecfb","VERSION","Qvd2KklRXAQ.mFZRd.4tcq7eBG60e0Ao","true","2026-02-09T11:07:12+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730327017/d7ed2a33-5727-4046-8fe9-cfa574aa7556","VERSION","QhzfGmvDIxXAeHO6Jp0DhhlYcCIoxJEl","true","2026-02-09T11:07:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730327017/d90121f6-5251-45ff-9ae9-fccf0e6dc04a","VERSION","WBROfnz8.GeMzwmYNQ6aXNSSLg7J5BU3","true","2026-02-09T11:07:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786917/450b66e3-026c-4c7a-ba90-b629a76d1a95","VERSION","87_wuJ.n9aV9v9ZGOOaYaFeKj6QGHYHV","true","2026-02-09T11:03:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786917/788f0515-9c1c-45cd-aafe-f12c548d91f5","VERSION","nNYZFHzCIr8a19aA1wrmKdT9co8hCRS6","true","2026-02-09T11:03:39+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730786917/a26bed07-447f-4968-9392-f45f2203bb12","VERSION","mGQ3wwVNySDDvR4rLbAayxW_SwlawhBl","true","2026-02-09T11:03:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786917/b2851a48-fbe6-4f83-be8c-7a44d27bd947","VERSION","4_NOWtWSUE4vX.EbKM17xwbkFSql34Up","true","2026-02-09T11:03:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786933/3071ef4b-dc63-4c60-804c-91854a392ce6","VERSION","rRm0C3.5Ga1IX2QHQqfv1tzk3UxvHqp7","true","2026-02-09T11:03:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786933/50213d42-0af1-4288-a49d-94afda601b28","VERSION","J05ItrCsJunLWC0D2bnjL8ZXfmHI82Q1","true","2026-02-09T11:03:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786933/580c8bd8-9093-4a88-95c0-4f20b0e6607a","VERSION","TdeOv1GTqIEc2CbX6H54afHlHwt77En0","true","2026-02-09T11:03:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786933/eccd3d9a-081e-4836-9714-572c301f0e20","VERSION","eD50Au08P49aARiuSmJ6OqJO_8QYkTHc","true","2026-02-09T11:03:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730786941/7a675142-b57c-4666-88d5-eef81b1c20b6","VERSION","bOIbqFrM7xoGpXg64vxIAZ1WZE20.yHA","true","2026-02-09T11:03:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786941/a5b9ffcf-5c9c-41f0-ad8d-227256ee3ac8","VERSION","yWyqxl6AKIkEBIc2UGgrUyqPnO22V1F9","true","2026-02-09T11:03:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786941/ccce6e43-6cfb-4e5e-b73b-5182a065d978","VERSION","HFC2AKeK3A2Khb4zqxCBuLnxQzSpcj2G","true","2026-02-09T11:03:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730786941/dce473f6-fc42-4ff8-89f5-a2f4ee3383ff","VERSION","tPJ3zfIZeHSAndDW.N.ANx33ZFdnv4OU","true","2026-02-09T11:03:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786976/61269381-2419-4cb1-bb6e-3cc72d31aae3","VERSION","a0nwW_fFsHBD50LTvszeeNMVF8GR1GOB","true","2026-02-09T11:03:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730786976/67d884e4-b7f1-441e-b5c1-ff731439a376","VERSION","iTw.EVUpbniu3GWBe7nvf5FOPbAW9F3O","true","2026-02-09T11:03:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786976/7061f7f3-9dfb-4d8e-b5c9-5b008e98116d","VERSION","EWDICE3qlfrTourzmcs0wmb4XcVuSeCd","true","2026-02-09T11:03:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786976/a74fd3f9-18df-49cd-ba69-222663dc811b","VERSION","bhHoOkDJmjHgKfQ23UEUyB6FmQoo2fK5","true","2026-02-09T11:03:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786984/4f34d9b2-6f48-420b-b307-a0defcd3b9b4","VERSION","UyP_CAwDyaoMfAt3yEN3B6uq1mqFq7dD","true","2026-02-09T11:03:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786984/581ce269-b551-44a4-9476-0932bdcbb3d9","VERSION","aZvyGSOKeliPxpDKPnlDBmcxhwaBcbJ1","true","2026-02-09T11:03:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786984/67712390-7ab4-4cee-b400-0aa44ed8ecb0","VERSION","ftgHyAS0he8Hr.VMin6jmAyi8buGQu9p","true","2026-02-09T11:03:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730786984/9a611a34-aeed-4e15-9c0e-0066fd60efed","VERSION","xdksNtYIRk8rTc93G.qMYpkU.SoOvEYP","true","2026-02-09T11:03:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786992/7dfaa92f-7b73-49e7-abc5-bfdc7ee9be95","VERSION","Qihxn8cf_8A2s_vek4V5AUF2qOvcuFB.","true","2026-02-09T11:03:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786992/b48bda64-c792-4109-bda1-813d522bc65b","VERSION","7hOmpiDz80aVowHK.p3s8ZmJO38NWqdK","true","2026-02-09T11:03:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786992/d3799f2a-c1d7-42fc-92b5-288251b83e3c","VERSION","V6AfcdmvYcjJj2DBb7pkq57owN6gdUdy","true","2026-02-09T11:03:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730786992/feb8692e-caa4-47dd-9951-02c35eb32723","VERSION","IL08qdzDkte9.Rm0.THqrU7CZ8x2Ps.h","true","2026-02-09T11:03:42+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787018/00940e32-aee0-4598-b07d-3e1b445bc4ba","VERSION","HC_NY6MGjqNoPwESFY7y3pO2bs5tcevS","true","2026-02-09T11:03:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787018/165f30c7-f221-4dbf-b953-2247cd98c154","VERSION","MoInuL2f.k31OnLw64UspN51.Z3KDPZh","true","2026-02-09T11:03:43+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787018/6ddce189-33b5-415f-a2e0-dbe42b4ea3cf","VERSION","6m.AHV8Xoz4yvTcBr5fP12OWF2_Q2m84","true","2026-02-09T11:03:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787018/982f6a98-f631-4e46-a48e-a7d489fcc3a9","VERSION","0bAw5elrUflHVZYoBvXm7slhEjrvZDiY","true","2026-02-09T11:03:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787026/04a3c99f-4250-48f7-b820-98e74d690511","VERSION","VSGVWj8BSqlDcYc.t375fU1wfyqvTpo0","true","2026-02-09T11:03:44+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787026/8ecd6b58-5d98-44f8-964c-fce744918a17","VERSION","AcR17q0zjRoX6mFzXvFgJkxSLBeFO8d7","true","2026-02-09T11:03:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787026/d5d7ee02-7156-449e-ba45-dbee2f6a66db","VERSION","mQnI0dW6Og6HZQx1qdzmjJm3if5KNTP3","true","2026-02-09T11:03:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787026/e597e3fc-3c94-451c-8e65-dde2d75caa8d","VERSION","7yOrXSVjW0CxfpYH.6r0AoujIkhQnQoD","true","2026-02-09T11:03:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787034/98e9e023-f452-4c86-a1e9-144eba0890d2","VERSION","0CqjG9Y6jpuP8P1o75tkHsetbjXKGs7A","true","2026-02-09T11:03:44+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787034/9b3a7d6e-c1fd-4b9f-b648-52842ac27846","VERSION","YCaB4H4gT.w6PDW0sZ.KO94NmAWX6wZ9","true","2026-02-09T11:03:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787034/9d076584-7c04-4b15-944d-82bed6ae67f1","VERSION","7t2PHzrk30TWhZ.p24AGfJsCVGLytcGo","true","2026-02-09T11:03:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787034/e5b9499b-7601-466c-89a8-d61b936e956b","VERSION","sv.fIEYeFM.P2CB1KpapTuQuS26bTutz","true","2026-02-09T11:03:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787042/395f2da7-a0d4-4c09-8d2a-61d9b6b63b7d","VERSION","o31odPoqA0cfCfAe6FkxC5F.EocsfsNI","true","2026-02-09T11:03:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787042/55b53a14-5a77-488c-9b5b-93d0aa975a58","VERSION","zsY7U34mc8fJpX8jghs9MJRsAsyk92R3","true","2026-02-09T11:03:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787042/a9d530ed-4815-401b-93a9-7efad4284b9f","VERSION","ZVZQ7JSKppxlmbpJYYnyypVRbWnmBL8R","true","2026-02-09T11:03:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787042/aac970b0-0ce1-4f6f-b466-812543a1b10a","VERSION","F.xU.C.lHMXk.6iqEWV_PSIWZjvoY1oY","true","2026-02-09T11:03:45+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787050/25be0652-7445-4910-8c94-6ee4554d5777","VERSION","NrmqsPSrPdGe2CztTuvxKEhMGQPYlRdV","true","2026-02-09T11:03:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787050/62d24fac-5141-4c7e-a21b-39a5f119dd8f","VERSION","M_8l0FPMS_hMzwowXwIdBJVvOd6oNURs","true","2026-02-09T11:03:46+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787050/d40db5bb-36fe-41ba-9c7f-39d24b85d8e4","VERSION","dkrzDi6__9.393k.nW3C4BKxXxJQWWCV","true","2026-02-09T11:03:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787050/ed761c22-4dae-4175-865e-e594ff9ace20","VERSION","1_EVZzmjnvoO5YATv1pysL3g86kMbL_0","true","2026-02-09T11:03:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787069/1e25b3ab-fbb2-4937-ab1c-1f5e0713472c","VERSION","W3um6_L_8S1w5efoHQZEWdmqD34HeXr6","true","2026-02-09T11:03:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787069/3a8388cd-ac51-496c-a8ce-35ba30a7bbfe","VERSION","5kVp.lvAmlGGmOBYR0o.ZQzdOfAXgLpp","true","2026-02-09T11:03:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787069/6653bbfc-a646-4b5e-a36b-17095cb7e55f","VERSION","ueScYzef2sky9DYqh70r3lgBzfi9v41d","true","2026-02-09T11:03:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787069/b6bee025-68b3-476c-a656-9b4eea1985f9","VERSION","bsm.8qboHbswXagGA1llkrbMglVtBtZU","true","2026-02-09T11:03:47+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787077/420ff59f-886f-45f8-93ad-4aa006254038","VERSION","AVjE541KA_2ZCoC5OiJGbfW5b4mTSND9","true","2026-02-09T11:03:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787077/85a1f285-c341-4c6c-890f-15ed42fead92","VERSION","Y79LROPvtr4bRTeWFgze5Ux8GdMqMWlq","true","2026-02-09T11:03:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787077/99945306-3ce4-4e5f-b5ec-693bfcedce9f","VERSION","s251lmd1MtNCTIGHRRi2.DbZwlgT.8c2","true","2026-02-09T11:03:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787077/d3cc13e5-e369-4bf8-bfa2-5ae95b53289e","VERSION","nv8IXQZI30PXUqcOrd3Zr2MEu0Rty9Qh","true","2026-02-09T11:03:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787085/2e23ae54-5383-4691-bd4c-70dac495bd37","VERSION","O6t6MPZbw821BKCJwhEgTTIBU4Bf1RR1","true","2026-02-09T11:03:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787085/64298c1b-7952-4d95-ab84-04b73b522984","VERSION","OFuPMSAo_pxOKA2Lp_Vn9zC24a8aOG7R","true","2026-02-09T11:03:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787085/c36ff844-c2f9-4074-8600-eea046a78d56","VERSION","grSZAZuHALtgtxcF5eNIsDyUGgQCfeok","true","2026-02-09T11:03:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787085/d14ca48e-10fe-4490-b8ec-8c48b7f71beb","VERSION","0abkH_eLWiwNJ.rWZRHklhPMz21co.Dx","true","2026-02-09T11:03:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787093/267a1c8d-56bb-41e5-9d3e-3882903a49e8","VERSION","zVpI56iJ.KONL9fLpgPsJnUyzKt6KakA","true","2026-02-09T11:03:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787093/61a70c9d-7910-4877-ab92-55ae44ccb41a","VERSION","JYKMgGdyJN6_Lgz0j7eeDsp6DwWp.LGb","true","2026-02-09T11:03:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787093/c157a734-bfd5-4127-888a-104bfa1eedf3","VERSION","Sd_o5SQ8gdqH_qQ7Gu1EblH6r6kKqqDq","true","2026-02-09T11:03:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787093/d8edd7bb-c8cd-4d0d-bd17-27f72b356cfc","VERSION","v23NJQIHAt9G77vqbTjz43jWGaPhJUya","true","2026-02-09T11:03:49+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787107/3c0545b2-1ce5-40ec-8f9d-9458ffc4eee7","VERSION","ztRqcEVmyaYTvXvKq2x4sn1S9N1xwfc1","true","2026-02-09T11:05:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787107/4b66fcc9-198b-488b-826f-ee6f5dd58b6c","VERSION","wleqfpE6Aw0lz8ceEh8pg5TZfH9axyNu","true","2026-02-09T11:05:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787107/64071553-548d-426d-a45b-ce2b78f7260a","VERSION","TT8BF5Gq7Kvp5EiDRE.pbdPdWAD3ebhL","true","2026-02-09T11:05:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787107/73732713-e001-4ef3-92c5-5756eab752c4","VERSION","jgrapsWmunJA3rcTDnDVJi3m0VCwYdnO","true","2026-02-09T11:05:39+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787115/182ae986-291b-467c-80f0-06a94896c5ca","VERSION","viscw.YvLmuozDCi_xOVQGycpXkWvhWa","true","2026-02-09T11:03:50+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787115/9b29f041-0ddb-4677-9be8-709522a2285a","VERSION","753JfZS2X_srUtIiGVtgc2B67VBmp9q6","true","2026-02-09T11:03:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787115/db0dfabd-c621-49f1-aa6e-7f54dc8cbb0b","VERSION","JSKEP6KSP7cD.rILd2_bpF3EfX0kNwgM","true","2026-02-09T11:03:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787115/ee955f96-e72a-4383-b668-1c0bfc9b175f","VERSION","UaOIa2zfLcDwHKF2D_3f_C7Q4JSuzwlB","true","2026-02-09T11:03:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787123/1fb16c75-f598-4b45-8302-ce355709a8ed","VERSION","orZwrl9186XQ9NqtBmMTiGRjRjSK172z","true","2026-02-09T11:03:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787123/59c25251-e2ea-4558-a353-53a6a403542d","VERSION","RovePNZN3q9xj.iyt3ervrSfzTnNHTst","true","2026-02-09T11:03:51+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787123/a60eea50-4c0a-482e-9fe2-f427274bf661","VERSION","dQfo5A6EFfmdKA.uvS40Eg5GhC6WsO3x","true","2026-02-09T11:03:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787123/e104d8d6-298c-4120-991e-935244bc1720","VERSION","lAXhewCwMKqxrkpStnYVTfuKn75DymLC","true","2026-02-09T11:03:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787131/b3b37d99-db12-4c92-9228-faa0c183fdb4","VERSION","5NtPlIR70_uXKtRi.5sYEb88VcsD3O4z","true","2026-02-09T11:03:52+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787131/b5bbb67f-9c45-428c-babb-7038167f919e","VERSION","sGx0b9gDIB3Oq0D4mcL5_8ROEQbxpa3R","true","2026-02-09T11:03:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787131/eff69e9c-ef9a-4b51-834d-d1e47bb3a442","VERSION","qwPUl0zjW81xqq3dXvckkh98u3hS5o3d","true","2026-02-09T11:03:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787131/f11ba74a-a661-40d3-8a82-7e0a5677c74b","VERSION","Y6fzKhd9VHqoMFpsLy9FOrtFfMt8bgVi","true","2026-02-09T11:03:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787158/2c167af8-c04d-47e2-9c92-a6bafbea5b52","VERSION","ze0u8xqdvqcFdBnzZkiFlH2eSnKoOif4","true","2026-02-09T11:03:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787158/4994d473-71b1-45f5-8400-1ce2782b7996","VERSION","DSn4x5_TbgNEHqMa1c4NKDiuubWZ3pH1","true","2026-02-09T11:03:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787158/bfc5ccd3-1042-4f6e-ab8f-4a99a8200283","VERSION","wprrQMhCNOmzi_BTXEmD7JkWdEpSmyFd","true","2026-02-09T11:03:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787158/d5d517c3-2d93-41f1-86fe-4dc87b94fc46","VERSION","YLhLxGMievMY9XBLdklGtdPS2cAzeZRB","true","2026-02-09T11:03:52+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787166/3f8e00bf-3a25-4601-b5b8-8084e3024a7b","VERSION","oJOKHc3rVaFQ3hIxaGDzGeaChOWnzpPL","true","2026-02-09T11:03:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787166/7bbfb965-1ae8-407c-a200-43c342768ee3","VERSION","yhCATpePj_y71drRLIAVELa95kALfzMu","true","2026-02-09T11:03:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787166/b61a45e7-d2ca-4b34-bc5c-8bc62a0e45e3","VERSION","EODapifgS.KxP3oeoEA0eK4rAxnb65Qv","true","2026-02-09T11:03:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787166/c5d6f874-ecec-484b-b219-bc72a0ede022","VERSION","CVBNwpcdeTc1ioXFzWj.urvAN3FxAQqT","true","2026-02-09T11:03:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787174/3b909e85-1726-48f1-aa4e-fa356810c556","VERSION","gp_UUL9eeBabrFS0jqVQAZ3dL34T63Hf","true","2026-02-09T11:03:54+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787174/59cc32ed-9726-4a3b-a816-fdbbd937a671","VERSION","WiEGvn_4x0MMina9siZlB6miCiTIaLlu","true","2026-02-09T11:03:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787174/ae40fcf3-4dc6-439e-adfd-cd0352ad885d","VERSION","M3mgKw6nwsW0EXDIyfWz_B_muuDg1h68","true","2026-02-09T11:03:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787174/b40c80d3-4154-4ce9-a05c-60e9312a75cf","VERSION","0iv4WqlGXmkaQ0LRCnn30uS4k9Hakjis","true","2026-02-09T11:03:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787182/5b73ec0c-44d2-489e-9a9b-664f6e88a80a","VERSION","T4WonGb8akiOtdwgLyw5yg08YEfVNGvS","true","2026-02-09T11:03:55+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787182/8bbd7314-4b9d-47ef-89ff-80ded865f09b","VERSION","0V0ltDP2J7nLSIVOzKkxZgIYqouL9mAk","true","2026-02-09T11:03:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787182/b55a7cc0-c7e4-4bed-8665-eed539ff0cd9","VERSION","6O2ArVhaAYwLCE0GrgGu09foXGPR0y4R","true","2026-02-09T11:03:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787182/f5d767e2-c6ff-453e-8fb5-1e863a7f6a6b","VERSION","OuO7L_nD.h6M.wX55kzSvhiClWhgssz7","true","2026-02-09T11:03:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787190/3e3f4cf5-5b7e-46d2-8c69-b8c80ea0444d","VERSION","TQ0c2TnNkj_yuywVUYK0vFZnRnAjqbRt","true","2026-02-09T11:03:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787190/4a71acc2-a8e1-4e0a-94ca-77c254372ab4","VERSION","bAb.Q8VQh8guulIhcyJyOhVFX_M4auIW","true","2026-02-09T11:03:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787190/aedbea47-63b9-400b-b3d2-c59671920361","VERSION","ez8cbdbYz8_QZhsvUTq8KO2PPs1cTaJE","true","2026-02-09T11:03:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787190/bdbc5921-0edc-4622-b6f0-80328053cd00","VERSION","6bttypdgnAJVpuW6evqIpSrSPYBnqF5R","true","2026-02-09T11:03:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787204/146b9106-04ef-4ec6-b707-4e1081333b0b","VERSION","aL4.cxcVme5ASjtrlxdN.pipzDJmyHNO","true","2026-02-09T11:03:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787204/26cf25dd-bfa1-4bce-8c80-27beb45a5fcb","VERSION","q9mxzNKU_OjTLTzrg5oi0gpifOT16N7V","true","2026-02-09T11:03:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787204/38a6f454-0137-4d31-a7d4-73a3599a1a4a","VERSION","J.2hpcYzfpq5S0FLvyyw1UgpnBepEPck","true","2026-02-09T11:03:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787204/5cec417c-60ac-4517-a2db-a85cc237d969","VERSION","2PklMFXnWFKA0zLF43bb5hsx3ovLdNmP","true","2026-02-09T11:03:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787212/7a9d9bf5-57db-4981-8c2e-e4ebae06367d","VERSION","OAds2ZZlFzTSMksZXuoprdY6pzQQwd44","true","2026-02-09T11:03:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787212/900768de-1bf4-4e2d-adc6-a1d86f5ccd05","VERSION","9r_n6PEiHxHPw8qisRxBpBd8Rt3xL99T","true","2026-02-09T11:03:57+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787212/a018f958-5b38-4e3f-ac8d-01432f961086","VERSION","0XE3vZ1Jq5ylOuVnzDlXmllk5RZxxDXP","true","2026-02-09T11:03:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787212/da5bfc82-4e6b-4230-ae33-58b523c1ecdd","VERSION","mBKBNT9vlcHlgfwtnV8vS9bdDZ1QPJH.","true","2026-02-09T11:03:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787220/3603c1ec-8b3f-4ce0-a305-291b483aa3f0","VERSION","Atp.ny7yYWC6xmSv6TRxOjHaWcsOjDyF","true","2026-02-09T11:03:58+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787220/36640fd5-182a-443a-8949-d17c0af6ce2a","VERSION","ju4K6CQHKaKUhZE3c88U1LJuYTy1xg0J","true","2026-02-09T11:03:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787220/61d630c4-4336-43d7-b8d5-74aa3cc0fa32","VERSION","OktOSv80H4uW4iIIkjfZGijhnAYtTqn9","true","2026-02-09T11:03:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787220/da78d496-1d9f-4d9e-8c4b-af636128fce6","VERSION","8Twf5Jp79e4qJoEeGZIyMymjDytQjU8E","true","2026-02-09T11:03:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787239/0d0a217a-507e-491a-afa3-c9f68f56efc9","VERSION","DVOF9NavbXlZNWKEFVVD1azCoSSJn8T8","true","2026-02-09T11:03:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787239/0e4ea8ef-2a0c-4501-9bbd-9de292dc918d","VERSION","fExZCmcnMSVZu.jgpQ3Ai2DYhDIbizaf","true","2026-02-09T11:03:59+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787239/80d75f53-f952-4c1a-8dd7-ede93715b77d","VERSION","LG.cGGfsyYI4EWlJwYaolvV.fg325Wd0","true","2026-02-09T11:03:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787239/c5be0c00-ebeb-42d1-bebe-24f4fd6c52ad","VERSION",".PhU.erOxAn0j2awMHHeKKDA2crcGkRs","true","2026-02-09T11:03:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787247/17791677-e2db-4b68-9c29-988c0daf53ca","VERSION","PThsb6pnAZRhRiMFccVKeZa3TZNNkPTt","true","2026-02-09T11:03:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787247/1bdeb547-a077-493c-8c53-1341d50bdce1","VERSION","LQYHXmyWRKAe_1scyjitUmblo7o83KMD","true","2026-02-09T11:04:00+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787247/2855ca16-e5f5-49bf-a875-d791a633c9ed","VERSION","k7MQmw0DfGQBfVyjyICK5LJ_mNqYP3DH","true","2026-02-09T11:03:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787247/29f5946f-f361-49d8-bdc1-495401f87f5b","VERSION","Xw3DZNr0ORqx589nlQ2gt6ysppBr3U.G","true","2026-02-09T11:03:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787255/3313ccc9-3fa9-4951-8c1c-0eadb24d124a","VERSION","RT0KgvKMwZHnDTCJEpCCKV1sb7Y4StR5","true","2026-02-09T11:04:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787255/367d8bb4-4c43-4ac1-a92b-cb4b34c319d6","VERSION","j1aZ10Rndo0PNaexGiImLqJiWnz4uhBo","true","2026-02-09T11:04:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787255/7563f017-d8e0-41ae-a46a-4110f7fcf470","VERSION","1z7vzgluNAkarW74RwR1f8TDUgDJ_vk_","true","2026-02-09T11:04:01+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787255/ec7b921a-da56-47c9-8e44-414c7c376261","VERSION","ZKZ_QdkuFp.vRfTF3CjEGEf4fx_Z_aH1","true","2026-02-09T11:04:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787263/11db1ee8-cdcb-4ae8-9c1e-febaf6b46c6f","VERSION","8dZcL3UQDizpx3OH1cDy2doQ7uP_pXCz","true","2026-02-09T11:04:01+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787263/55386408-9063-4214-b1b5-d3227c26c33a","VERSION","4X2OdQ6E5x_L5s..4ddEPVJwutu.y0wo","true","2026-02-09T11:04:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787263/8fbfdaa6-8f0b-45a4-b3a9-bfd92ad7b10e","VERSION","jJuobbTx6OmTpa3edD0uZXx1iA4YqKlh","true","2026-02-09T11:04:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787263/e9c64dfc-c210-4113-b707-310e0bf170d1","VERSION","xFob.RGfFThN5VfH.62NBwjdet91_qPd","true","2026-02-09T11:04:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787271/9d5e86ea-80bb-4682-aecb-b3585ae1caaa","VERSION","ZbLSvcvfzLZeGxxc2aFUL3GqffXPCwEh","true","2026-02-09T11:04:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787271/bcea33ec-c982-4b53-8620-73b0ab8bbe62","VERSION","iSIgYNWNX8fYHw49IGHsoiMYKwzlAbdm","true","2026-02-09T11:04:02+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787271/d275a34c-14fe-47e9-be34-dcdd222a55ee","VERSION","CXWP8bvOxzIDEmDkZRc0DnI05REo1b3V","true","2026-02-09T11:04:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787271/fcddd4bd-feaa-490b-b4a4-8c339202957c","VERSION","rVJWgsbuWQxBggIXF4ddxsWo8y9vsZdN","true","2026-02-09T11:04:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787298/14debf5f-a004-4082-a46b-ffe190354a89","VERSION","codZNGYrPHdmxbJs990TkW5tAqa2PFxD","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787298/219e15a8-11bf-4969-823f-b72ecd2e99e8","VERSION","cd3LsjlHjSMhHXtDtYrNjRzQ9AYLycyr","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787298/28a85fca-1a29-429c-88ed-ddcda727f080","VERSION","FDzbZwjQZ7cThKv3F1ZiHSH4FQZKoUfo","true","2026-02-09T11:04:03+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787298/48262a51-dcd3-4184-872d-3feee97d12e6","VERSION","Gt4ogCAeEnkfeCftXJdWvDqq42bRSMso","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787301/5614da09-5ed7-416d-9eaf-f4f9ddb529d7","VERSION","eQFOEqeiQBAVbMZIZmiKdnQv_CGIM4ND","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787301/a8f449dd-e8ae-425f-8ab5-fcadb71eb547","VERSION","Vx42qdVY7AWQ8Dnf_wlgnECTiyjDxRbK","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787301/b84ef83c-bfa7-4823-b7a0-cb403b51b445","VERSION","A1wyVLs2IzmpHGTrUAkqKDy7QISDejiw","true","2026-02-09T11:04:04+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787301/c1eba79d-da26-467c-af20-a86cc8cfcd40","VERSION","i_5n12asiinNRibZ_1jt1pErB6fomsSN","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787328/015d7dd3-74dc-4b1b-b5d9-fa84ba4dffa9","VERSION","DPmLRJum3YPArLJ09Pq3Z3HgPzQMbUeL","true","2026-02-09T11:04:05+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787328/06082d7f-f9de-41fe-97a4-a03a019aa305","VERSION","kaL6KzRI_Spm0pNUK2E0T6J5AFsf3I74","true","2026-02-09T11:04:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787328/5d0e8e1a-09ed-4ffc-9f7d-860114d281bc","VERSION","GAAmUT3fELgxFrxoIXid.je4IB6UdF7S","true","2026-02-09T11:04:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787328/a79b7c66-f8be-44a1-90ae-cf78df0f9cf0","VERSION","JugMKfuB1TtifAMtHWK7Zc82zs0YaeZw","true","2026-02-09T11:04:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787336/4fbb033a-9d31-4d3e-9a7b-6339ebfe5547","VERSION","9egYxLhauJapmzPM5ugyvP1iXmdn1dVm","true","2026-02-09T11:04:06+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787336/7c18a855-fc20-4855-b243-ff64957c5d4a","VERSION","N41ldQX3WG9mcvQclLHo6gPFiTz6Bxms","true","2026-02-09T11:04:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787336/ca8f01c4-fbf7-448a-944e-981f2ea160f4","VERSION","SOzX_kKn1o8xYtV86cM_GpWy.pNbgF1K","true","2026-02-09T11:04:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787336/cde55e3a-9013-4696-8745-1f82650bb1ae","VERSION","dLqA0nxXS3r5m51I0xzxwpFT0ncWOFxa","true","2026-02-09T11:04:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787344/8c83e40e-1c82-4c17-837c-0b6e1c5b29c5","VERSION","hZmdGbXd6EgDzr_kUG2osh3iucEiQVSW","true","2026-02-09T11:04:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787344/ab1d0b5e-947a-4270-b1cf-0a66a6bff191","VERSION","8D4vk.xz8c4Cye3XwLaVBAqyE4xouoCI","true","2026-02-09T11:04:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787344/b4621120-8f2f-44a5-924e-8ad3ee100128","VERSION","zsmCTK47UdI4CoOzGuRzZ54PNY_j_4hI","true","2026-02-09T11:04:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787344/f7d53096-5593-4542-a9a2-f70dbc8ea695","VERSION","bF8uwVlhoPs6QKW82e0CiMpPn0fSdzZg","true","2026-02-09T11:04:06+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787352/b355e677-7a10-4f96-af48-b35da71e5107","VERSION","U8HQO_83Uh7J8c2_fV682pOb__HvoAOX","true","2026-02-09T11:04:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787352/b8393e37-e474-4c61-98b2-4ca59dc9c4d0","VERSION","LMcK4RszX4sHdrgzyHb8lyRG03GfVbsW","true","2026-02-09T11:04:07+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787352/be8cdf42-d6c6-4c01-a828-590b8a887b22","VERSION","IZJTCMAINuM1OMPrsLHswEcF3qBexE6b","true","2026-02-09T11:04:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787352/f014f558-1148-4995-b559-13689e4d709c","VERSION","HS5.IduCNmCXrJ_bY2UWLB7D0VHtcr.T","true","2026-02-09T11:04:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787360/0938f82a-9cf5-4043-988b-540142958ada","VERSION","..47jejCCt57.19RS8OI1_u.B5_jnWpK","true","2026-02-09T11:04:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787360/58a6b859-0e7d-4df9-9540-337b118bc33e","VERSION","T84s3UUvROTtw_7avvebObxuCtG_ktc5","true","2026-02-09T11:04:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787360/768afac3-4372-4b5c-9e20-b8917b863f5f","VERSION","hwKB97HJxpieGYf8.hxPS0wMjx_bMYtU","true","2026-02-09T11:04:08+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787360/b15b5eb8-e3ca-4cda-b53a-6a2dc36e41b9","VERSION","lJNRxknxU1Z98WwHhV1U_oAEKIio3rX_","true","2026-02-09T11:04:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787379/34df6020-70b4-407b-a16f-260becbc2d63","VERSION","6jyzAmZyrj0y740BTrpa.jJ7yJvO5MLP","true","2026-02-09T11:04:09+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787379/51d5479a-30e9-4f92-b657-79a49adba2d2","VERSION","5rZy12AedZROuohVkOL9d9fQXpxx31H5","true","2026-02-09T11:04:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787379/f32e991d-4b61-4f76-8090-20dbe7d00fc2","VERSION","7bYJVkIyl9p2T2R84sDLVyLXwSVHz3a7","true","2026-02-09T11:04:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787379/f44c464e-8997-4893-87b7-f2cf439898c3","VERSION","AeKOznp1cJzcIONRxKQQAbU1RG0dWXYc","true","2026-02-09T11:04:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787387/3ede482f-c9c8-4ccd-b0f5-a1d984ea43d6","VERSION","7wQbPh42MAgh2Gb00Aj7p0Szl1vWaGiu","true","2026-02-09T11:04:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787387/7035cdd4-cbd6-4853-89b4-bd7016db25a7","VERSION","iueZ7eH8L5Bz6qc20wBI0J2xYreWeqJK","true","2026-02-09T11:04:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787387/b110fd8a-c5a0-4a66-9c23-a6b2ff55a9e0","VERSION","lBq4uOpRvStncekNR1HddP1EggMyDPaD","true","2026-02-09T11:04:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787387/b7f0fb93-e5a0-498f-a255-7e4cf89358c1","VERSION","zUF0U3rEczrk7F1Z9OrpIv0YELVG5xh2","true","2026-02-09T11:04:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787395/00369675-b771-4a18-b7de-0b53a64a96de","VERSION","8kYDCUD7iHvh_9xd7MotwhXee_eotAe6","true","2026-02-09T11:04:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787395/1c1f2c67-25de-4ff9-855c-65a3bafa31eb","VERSION","j8cFLNwu93l9tXoxb6KITg4jXVS28BWy","true","2026-02-09T11:04:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787395/88eb036f-8ec6-4f43-9cf3-cf67c9ab59ba","VERSION","xACPYxzMKmunRpKL4tfk60opGfRGq2sJ","true","2026-02-09T11:04:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787395/d82e2dfd-90b5-438f-9003-ed264f1f19f9","VERSION","VAQVX.P4UlBvnW9vuYgiS5vvuVo8IfnP","true","2026-02-09T11:04:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787409/1dd66c96-cb8e-49f2-87ba-858fabce6dc5","VERSION","w0b3XlXRJpmc0Gh8PjQ_IMaN_xMgpFIU","true","2026-02-09T11:04:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787409/20ff72ef-a279-47d7-b8dd-78cd2b744efa","VERSION","s8dGYp3lZ64tccKp7WM8OQ1735hpA8Vq","true","2026-02-09T11:04:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787409/27f050be-5c8a-4ecc-a477-81f0af920fbc","VERSION","8mT5SeLcj03Su8Qq3aV8smkiKZEZskI6","true","2026-02-09T11:04:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787409/3b8a0e5f-5b8a-4678-881a-ebe2789434f2","VERSION","A74Kh643CwLvtoFi8PJocQXbW8oyEtWe","true","2026-02-09T11:04:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787417/73216057-cb75-422b-aaf6-9deceed4ba92","VERSION","mxFhdnV32vTSpTaqrBs_7kcTfnc0dxR3","true","2026-02-09T11:04:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787417/766c7237-d7c5-47cc-9766-7c0737474c80","VERSION","16rvwxDy1MIRg9axkK87KrCRHR7m99Qg","true","2026-02-09T11:04:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787417/e771fa41-cea8-4162-9547-bc2032aee8a7","VERSION",".fLFHP6sEk59uG9CWg.tTdm8A4gPHwyL","true","2026-02-09T11:04:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787417/f884cded-8ba0-4920-b28a-fd2799ba1bdd","VERSION","mihif2OU5B2NjXu0INVJmi_KftBm456y","true","2026-02-09T11:04:12+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787425/340a12bb-5ba1-42c6-9de4-2a3412ae8ea4","VERSION","A68NUxZ6Pm_pDKIx.DvUsyN6EBCwJMVN","true","2026-02-09T11:04:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787425/6631a035-8b4b-4e69-a5b8-0d2443de5a7b","VERSION","fO50KUijCrX_dhGSOBzLHFGjZyulfR_Y","true","2026-02-09T11:04:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787425/cde619f1-540f-4b8a-9ce9-a197790db846","VERSION","2r0HgnkOuYar1NOJN8XJxdlvDNyU8T7V","true","2026-02-09T11:04:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787425/f17bf39e-f938-4ea4-82a9-8eb28d454540","VERSION","CBBba.f_5bQiIuy9.hwtTS2aaow_bTG8","true","2026-02-09T11:04:13+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787433/22d700e7-0329-499e-9343-a2416f78a4ec","VERSION","YZtikIAuQlLNegab5XW0u.6WNSBUN67w","true","2026-02-09T11:04:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787433/737c3916-f4be-4fed-a8c7-f105e9533c2a","VERSION","6QPjVaoQbnfXuKNVxCkijUj6mGbUKciO","true","2026-02-09T11:04:14+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787433/afb41ba5-8ec2-4995-85a1-3ed7df88a8c2","VERSION","SwMtrAClfmVQlpm.G9tFiWVBc4mhp7jv","true","2026-02-09T11:04:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787433/f7d8abb9-726f-43d3-bb21-e320588bfe3c","VERSION","HshW_ID8ngKk1WMYWhrxnF_GDSKmNcc7","true","2026-02-09T11:04:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787441/1ed270b8-f8c3-4f5c-9fc7-e880d7a4a509","VERSION","CeTdbhhkQrjSLJ_tQOJ18HIL8nVFY88d","true","2026-02-09T11:04:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787441/880fdca3-d91e-4209-882c-5046472ccc0f","VERSION","Yu6hnzwUkeumMVfOycT_CY6kqL.v8Bb0","true","2026-02-09T11:04:14+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787441/a207fde7-cda6-4c95-9473-9525f8b1d73b","VERSION",".EYKOOZNd8PxrZylEup.BkqmFNdHYe1l","true","2026-02-09T11:04:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787441/de32e9f1-7c30-4d27-83cc-1c0db4052ae5","VERSION","kWm972dm4sNK4uNJFDQl5iRQihi6o4SM","true","2026-02-09T11:04:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787468/35ce536c-2ea4-4282-96ec-41f507337baf","VERSION","XlquVZDTMposgZS7hAdJtHD2t5pu4zvr","true","2026-02-09T11:04:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787468/3ef8dff2-f205-4e05-8405-3623f7d42e1b","VERSION","W8DhUUvvkKcng0rsuaR6B0tO8xW_4ZH2","true","2026-02-09T11:04:15+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787468/4ea43c2f-2248-4d36-8afe-fbc58ad38484","VERSION","OGULCL3PgCbYTeBlCvvNDSkqHaNx.ACg","true","2026-02-09T11:04:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787468/6d686a3f-41fa-41a1-a4ba-a9d362192345","VERSION","3Sj.CRnvkINaJP0Q8F48GvGIVLsnJTKW","true","2026-02-09T11:04:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787476/89c76f32-099f-47a0-8b60-8ae1c77bf164","VERSION","LTqdQF88V_rj4T9Uo0VqKb9nlZIp.jrq","true","2026-02-09T11:04:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787476/aa01a935-3353-4184-9976-90cad3e5e2df","VERSION","7pnCLtu7L.Gkxh161SNie8rWgtjL8mLk","true","2026-02-09T11:04:16+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787476/b9f7f267-ca8d-405b-9b9d-84a7d4c29088","VERSION","E0tsWSDNV2NnJnQAqsoLmq8GbX0FGGOI","true","2026-02-09T11:04:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787476/f9a093da-0720-47ef-bc0c-d5fca467e55e","VERSION","QWfQysVR9tIlY1A3c3OIxFm9FScaqHtK","true","2026-02-09T11:04:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787484/43e5688c-b56f-49e7-b28b-793c7de01a04","VERSION","H4rM3wqamOZa8hacdhA1MON0wbmLhA4B","true","2026-02-09T11:04:17+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787484/5dcc0e5e-fa31-4d98-b0e0-ba4e59842b66","VERSION","aUyCr_AAkPjaiNiXuKYm3rAlw_oQXVhv","true","2026-02-09T11:04:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787484/6495e15f-b4af-4d65-9c7b-a810b43d2225","VERSION","T4szx0jueVrMTaBFfCVIIfbRA2iL3Lqs","true","2026-02-09T11:04:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787484/7a2d3296-4d2e-4e69-ba04-2959c202db34","VERSION","SXYP.kStFdKz1DvmAkbLEhQ3Eij2LpwW","true","2026-02-09T11:04:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787492/3967023b-3762-4f80-9f41-1830e74e20ab","VERSION","kNRq5YhCCkMy.IW3vfQbi4QVGdeIMiWS","true","2026-02-09T11:04:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787492/43ea4b0f-fd31-4a11-9491-dc150a533e4d","VERSION","w.mbJqceAzs0jiC_KAwx7PXIxgvUI2Jk","true","2026-02-09T11:04:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787492/d5026249-098a-4c5c-8b0c-edc27045234f","VERSION","5N6PDWkBVY7XZBXh_LmTbQ71D4rNtf1.","true","2026-02-09T11:04:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787492/ea690e3c-f705-4ea9-a35b-b6ebd625e2cb","VERSION","agCIfTjNe4CZoo0c9HO5F5XJcro.d83l","true","2026-02-09T11:04:17+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787506/2e727b4d-e36b-4319-b477-2ec8ea937f06","VERSION","x18RBwB7ry8DxkC7R_gVn5XeiM0ZjWJp","true","2026-02-09T11:04:18+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787506/5cbf3150-d22b-46e4-9e54-5213ea41a1ec","VERSION","UIDEa2MFPVkcUuXDaSmdR.NtfbN_JX74","true","2026-02-09T11:04:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787506/d0b67fa3-6c7c-47bc-b306-ead982603b08","VERSION","rGQJ17aD5O1rDzhQ4D6bf309fJDEv_hi","true","2026-02-09T11:04:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787506/e28a3e98-2f97-47c8-9379-50e72d6090ed","VERSION","ZXFzWjQna9YO6cUbMxWfFpu1IDyBJmb8","true","2026-02-09T11:04:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787514/4725bd0b-3e17-4444-ad73-e381ecdbed21","VERSION","6IbX7JqTTL8dSEdDjGj1lAm8xGC1o264","true","2026-02-09T11:04:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787514/73420715-85ef-477f-9c76-2933c112ed28","VERSION","bOAYBoCisG7jWjXRGhm5U0F23QZzlJ9r","true","2026-02-09T11:04:19+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787514/a20604bc-755a-4025-94b6-3a5b832dcdf8","VERSION","COoc7s6c7hDCJAMM_y039apiLDkYcJCj","true","2026-02-09T11:04:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787514/c013ff98-6ef4-4edc-b0a5-39687b3e15c1","VERSION","x24XGO.ZKp6FAbJ3SIK3fVnY1PUq6Yf.","true","2026-02-09T11:04:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787522/54080ac7-6350-47f4-93c7-5fb27c34f74e","VERSION","xOT9hegK5CYwf0Ra5l_ANQdKSHGtq8n6","true","2026-02-09T11:04:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787522/8badc026-a3ea-4c5c-864f-c26d8472eeb6","VERSION","5mC3vF6uwkd2rrBwObQccbzKuC19WXPl","true","2026-02-09T11:04:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787522/afa73d9d-f061-44be-ab6e-c822f183cc76","VERSION","JdTwYIkRnE7aJ7BywT0ZBaANpE_K77nk","true","2026-02-09T11:04:20+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787522/e0893221-d6e6-45c0-9458-4833e7f50c3b","VERSION","Sv_vDP6PtFv4icf1ncgMCRuJVThyJxy3","true","2026-02-09T11:04:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787530/17237db9-96d8-4f8b-9d8b-e1e1879e7bb1","VERSION","E5AZnultC7BGwyGKP.0ztfydOGVyi4uT","true","2026-02-09T11:04:21+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787530/25c1e7d1-6e7b-4ec5-8c86-dc210576a329","VERSION","kXU_gNkErYuDEd0g6hlYWeIT3pGqROKI","true","2026-02-09T11:04:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787530/9c771f53-c628-4ede-a910-3535f0459228","VERSION","OnESFJXEodbeyQhYn7opqV9dzrTPSQu_","true","2026-02-09T11:04:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787530/a024ae22-bba0-4bbc-b8f8-5b7b0b611a95","VERSION","BWX14E.2sGqFpyXalML6i.J5405vN2N3","true","2026-02-09T11:04:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787549/006c1358-87a7-493a-bace-ee8f79009770","VERSION","cHlXqXdgZK90dqFcZlVdmvhf1fjDd5l7","true","2026-02-09T11:04:22+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787549/a568f20e-0af9-46d3-a5e4-007aa29a0f70","VERSION","iVPWnRjD7oE.QBgz9ASwnzjFtpXG78Tc","true","2026-02-09T11:04:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787549/b5d66d2c-35e5-42c2-98ec-727df9331099","VERSION","w7nBOmb2tJAWGd0RmeqRSh9lCaZH0Gyb","true","2026-02-09T11:04:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787549/c11a0598-ddce-4792-b6a7-b25925b861e6","VERSION","3XHhDwASQhz0.OyJdblUL5sIYYjw.8j9","true","2026-02-09T11:04:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787557/232a6d83-3ec3-4f82-9758-b18047d7c600","VERSION","4r_vk3asNrDlwHyF5a_9SUTuW91.7bwC","true","2026-02-09T11:04:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787557/2a5bef95-1338-44a0-b45a-6f3c0dc01ea3","VERSION","RX1j.alhNixLd2JyUNp8Ej2QNWcAwTk4","true","2026-02-09T11:04:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787557/72b9a7dd-f0c6-4835-8f49-738f63fc0838","VERSION","gN8R7tzMhNFGFPjGuUgpvIaBlj1R_PC2","true","2026-02-09T11:04:22+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787557/ec3d3239-2be4-4aa7-b17e-1c55d65ad412","VERSION","38lUWBlkIeAtDrltdfDUYDVMtKL4._kV","true","2026-02-09T11:04:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787565/0aad7f0b-195d-4ef5-a550-39ff437da0c2","VERSION","lfLI9bdaDxZLQriHRxhlhb.t7_ZH9EQb","true","2026-02-09T11:04:23+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787565/892b2712-1d84-4f5d-9dab-1fe323ff99ff","VERSION","Y9ycnOfNlUiSbh7aQhfS.zA4.O2EeUz8","true","2026-02-09T11:04:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787565/8baacad1-57a4-4b74-855d-3f6838b7bed7","VERSION","TNIK.VYlAOymxLurzQ.lYZILENuFcqTA","true","2026-02-09T11:04:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787565/b92db62c-a537-45e3-8827-5f04459a60ea","VERSION","_47_onKif58SPcSrbUOVHHZcmRPoMS6P","true","2026-02-09T11:04:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787573/34386dfa-349f-4b78-b015-0d3bf6f134cd","VERSION","ey5mfn0ONbWHF4qOQcqDTP79p9kbudsI","true","2026-02-09T11:04:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787573/3a88a2f1-2483-4c6b-9fc5-9cab6af4dadd","VERSION","U.4oP1dk9SyT..vqEy6XmyviFGhuXxf9","true","2026-02-09T11:04:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787573/68829f94-7b01-4178-b321-c879a3d7edd0","VERSION","yJzxOJ6zuG1FRxzZ9LmLCMDrJOcMRXWt","true","2026-02-09T11:04:24+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787573/d3290ca1-11b7-4153-9952-c18fc61d2b05","VERSION","LxLRaO76tB4.qUZ.hjZMKDMinmhiQGfQ","true","2026-02-09T11:04:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787581/15d66788-a653-4c46-971e-bb4d9aa1cde7","VERSION","45C5hqfSOS7FrTCgfigFHwn8v2h5nCkl","true","2026-02-09T11:04:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787581/6c123a82-fac3-4bd6-9e87-45d361527ef3","VERSION","yBJdtr0tyyF1o42bWdNPUxzI.ln.JuMZ","true","2026-02-09T11:04:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787581/729ad02e-1f06-4465-9d1e-f5d699615837","VERSION","nQmeZAb7vtHcdX6b2cGbKVppuwxIO2R0","true","2026-02-09T11:04:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787581/961db7a0-f472-48df-86c2-9a05e1a92d91","VERSION","HyX9H_1wt2q3if4qFd21A3eHnyU9TksQ","true","2026-02-09T11:04:25+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787603/4bab2ff0-c0a3-4e20-b049-1f1baab6f69e","VERSION","ADhFjcMC1.STqrU9jnlD6RsW4N8mheqR","true","2026-02-09T11:04:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787603/508683fa-a8c5-4cfb-9d40-24fa34e8caaf","VERSION","UOuGW8tQcYsBazfKSNT.CMbJMuJSvAdH","true","2026-02-09T11:04:26+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787603/e0d94df7-e249-4ff9-84f5-a3489c35ed85","VERSION","jngI6YaZq.chJWH3SXFoQhsP4o2eDHuk","true","2026-02-09T11:04:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787603/ff01b4ca-6dbf-4d93-9097-4d7e62100325","VERSION","X2WqTrIsTq9bW3UjpL7TyBQZW5iTqxPm","true","2026-02-09T11:04:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787611/33ec82f7-310c-49f3-a078-e83b860f7dd7","VERSION","rehDFSBdcVK0jb99mt6VqrrPkGxbJNqq","true","2026-02-09T11:04:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787611/ab43c953-9deb-48f9-bd8a-0501ced99acf","VERSION","SRUPupoOI0lOPDW28l3gpaLJJrqgUkMm","true","2026-02-09T11:04:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787611/d7e5c7ea-2c0d-4b71-8feb-703ae35afd77","VERSION","bNassaZJndMOt9aHb6wD6dVGfpfNQFF9","true","2026-02-09T11:04:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787611/f40f8408-ec4a-4cd4-9414-68086c07c882","VERSION","FeDSxeY91anKGF4VoSDIRX6okQzeO5Oz","true","2026-02-09T11:04:26+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787638/5f119bd4-a1a8-451c-802a-dc9a4df81cd8","VERSION","BzOISdz4mzCYJX.jdB3L7F_nrQsfC7Oy","true","2026-02-09T11:04:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787638/9b626639-8e76-4b8c-90c0-ce8c5f5a3c1f","VERSION","AmeeihdvrvB2vsbjhPX1u6goKLN45Z7S","true","2026-02-09T11:04:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787638/d92e1183-4d4f-45a3-91aa-6b4648b1ae4d","VERSION","WAM5zCQmm0xiglwNBxpCWCU47og1jfSu","true","2026-02-09T11:04:27+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787638/f1d472ea-df6b-4bda-af81-65aa5012db61","VERSION","9wrjPSHFvmG3ka6VPLpKKYv73R6t7glS","true","2026-02-09T11:04:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787646/0022d3ca-81b7-4846-a896-5d051d831f90","VERSION","yqHDxAYw_ka198MQIRVAJQ3PrnB61aR1","true","2026-02-09T11:04:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787646/71624ac9-4b33-41c4-a16c-f856b5cd1e81","VERSION","zZD.AZr_4pUS.pWa3QwQcaTfFdEBkgi5","true","2026-02-09T11:04:28+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787646/7e07b9ee-0a80-4dfe-9e1a-0fcebbd69ff9","VERSION","ycwKcWq6jYNgPUwTg8jYaVNYZHrqS1CE","true","2026-02-09T11:04:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787646/c9147a85-1d0d-492d-8c87-ec613df0ac1b","VERSION","3KSZGRGQbhxWYbKnlJllxxjGKy5FCLGo","true","2026-02-09T11:04:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787654/1291e185-b2ce-4294-9c5f-6fd47ee77178","VERSION","mBB8o1341Y2rrK2XCDDEZwo_RDRcBEn2","true","2026-02-09T11:04:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787654/2887de0f-a1e4-4f92-97dd-2aeddef910ce","VERSION","M.ylnvkLO_OXCwh96zCijji.JNYD0Sf5","true","2026-02-09T11:04:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787654/497ca7db-43fd-48ff-bf0c-679772ee1757","VERSION","jWbNjdvuxuCLtywcOX0f_Q_XUcSx2e_Y","true","2026-02-09T11:04:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787654/ae72a221-b3ae-477f-b4c3-f219239718b6","VERSION","YbET2Mu0eQ7btZw6bVsEKCTsU9azzVIP","true","2026-02-09T11:04:29+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787662/338752dd-d8b2-4920-87ae-7d38e31fc4cf","VERSION","NZZUPVM5ppK.31sdpbN6NFk7naZzVKf4","true","2026-02-09T11:04:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787662/663714d6-9116-4949-bb91-afb0bea52ac8","VERSION","I56VRND_8oFI_4fXzH0IW1K_nAnXrQrX","true","2026-02-09T11:04:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787662/85d58ba4-6072-46d7-942e-45ab4d5863be","VERSION","RzW9pgWgqBQxpt0r84b0jinMZs87S72i","true","2026-02-09T11:04:30+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787662/d60c3b7e-2463-4a0a-b9a9-319bbd5872a6","VERSION","NAlAY24FDP_9wriFuiNEO319.m1sHE8B","true","2026-02-09T11:04:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787670/2610eaa9-0607-4ee3-a0aa-ca7f4bd36c80","VERSION","pgs6_e3aF2zSy_lZejgP7G3TEFP235GN","true","2026-02-09T11:04:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787670/3d863e50-1065-4870-bee1-12fb16273915","VERSION","i5HORf5E02G04XYi1sfCNwsutTtTrp8o","true","2026-02-09T11:04:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787670/45477684-08ae-40f0-be04-b070c275e1b1","VERSION","reyWMgsqGwLfRvVUVayzAMpPwun2xykn","true","2026-02-09T11:04:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787670/897c25d2-1ae8-4974-91a3-fcaf488da03e","VERSION","ybJZJLLEtg4gRq3FJBWJ6zZiMk6MbRxH","true","2026-02-09T11:04:31+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787689/5a48e4bf-f9fa-4295-b7b7-609d5483d679","VERSION","YJ2Afecja_VRJGBs246Y7yZR8Dyr8AaD","true","2026-02-09T11:04:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787689/99d93316-c4ec-4b5f-b80e-80b41f3d2cfb","VERSION","q4DNErwZkc0V1Zpg5.UkC0G8RRqoFp3B","true","2026-02-09T11:04:32+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787689/c41a7f1b-71ee-45b0-826c-c405ece336c5","VERSION","E.pMyU1OcxVpKU52apzOvQOQOLOtdqBV","true","2026-02-09T11:04:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787689/c54ba598-745b-4552-9056-5a3e05b4e6e4","VERSION","oIS0pABlFlc0lcwfMyGNQd7hYpnAfBMk","true","2026-02-09T11:04:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787697/45aaa698-7bc3-4a16-a327-3095598900ba","VERSION","p7LTSziGwriNDo7w53Bo6uMIQFEo5NZX","true","2026-02-09T11:04:33+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787697/46ba6c69-ca7e-4892-b110-6f565202d5de","VERSION","LiZCYpgdMWumJnZqNYvoV8JFBsaxMNwV","true","2026-02-09T11:04:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787697/ad726d60-07cf-4586-9b1a-1737c82cda64","VERSION","tymV7BehHVVSuXb_.foG9CFAImh8EgY2","true","2026-02-09T11:04:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787697/e02fbe4e-e01d-482b-932d-6e8ad44236c4","VERSION","KmBRTYIo3njmtUuJcMNM86dRuuqhq.iT","true","2026-02-09T11:04:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787700/1727e345-a8eb-4baa-b140-f8fb3b96451d","VERSION","Kb6IK3J1IOUTzYCy_8p0JjW3EmDa6Dvp","true","2026-02-09T11:04:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787700/51ff7457-6f67-4f4f-b382-a5ba46d5e773","VERSION","zTlWZQ.rEdZMFmnA7fHXZqre8fjS0Z35","true","2026-02-09T11:04:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787700/c14e779d-2c52-4532-9566-98155a85e853","VERSION","t55ZxjSwhIHrDvcQkC7XdiaNO7uoo0mt","true","2026-02-09T11:04:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787700/c56a03f7-947f-42c8-b080-187075ab651c","VERSION","f1y7xstzGkK.4kk_v2EdtciJA72hoOqj","true","2026-02-09T11:04:34+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787719/4b88f251-a4ae-49c5-a67f-b2b5653c73f0","VERSION","5danmD7I1AEcM5UIHMFuCW37jMl5Ubn2","true","2026-02-09T11:04:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787719/7f5cf099-7e80-41ac-93e3-667a798361ea","VERSION","TNUfevXVanplyyz4VCWWh8SfJ17Ec1qL","true","2026-02-09T11:04:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787719/d56fc4ae-27f2-41cd-95d8-bb95e61acb55","VERSION","xL3vOl2ERDHL7FrYgvcISmJ49nAyCjl.","true","2026-02-09T11:04:35+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787719/f1ddbd59-9b45-415e-b88d-f2fdcc786e87","VERSION","xCxV.dZ5V8eDmm7tPaSxANdoU.JsQQq1","true","2026-02-09T11:04:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787727/0cf5ebad-82a0-4593-a12c-0a90639d4a58","VERSION","gVcXVcSL3WsBVqbnMPwv6wNt.RA.pHJA","true","2026-02-09T11:04:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787727/300a526e-5d80-44c9-8673-29a5c6f3a49d","VERSION","Tq25LDnEZGILeN4LxwzA38AbFaWQfCpa","true","2026-02-09T11:04:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787727/85dd38a8-89bb-40dc-ad84-e8c7b120a6b2","VERSION","ByjggVQseyqZActxavst6nh6xjWXsc29","true","2026-02-09T11:04:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787727/f7013c5d-b1e4-421d-ad85-0bf5f25a2a2a","VERSION","4DRo5L9YyI0wZ2xp.VIYEkJapNAQ_7jZ","true","2026-02-09T11:04:35+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787735/6613579f-19d8-48ed-8f54-973eab63a4a3","VERSION","S46Qo2dQdRSA1qB4McI0Uhe49vXvCPAG","true","2026-02-09T11:04:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787735/6c3c3128-367c-4031-a48c-cd1242ffa35e","VERSION","Z4LW6OBf8dENpT._X4lo8sgUnP0J3LxG","true","2026-02-09T11:04:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787735/753e25ff-bf63-4745-abf4-96c3ebefda8d","VERSION","1HdvcSLYtk3IxG_UbvGqVG8EKX5BiiLE","true","2026-02-09T11:04:36+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787735/ba6ff9b6-0cdd-4dd3-a080-793b7049d7c2","VERSION","0tPSGGlt5Xrzv5x4NGjC7lEJQGA_ZWAS","true","2026-02-09T11:04:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787743/1cc522b0-f554-4207-bd52-73ddf2d9a699","VERSION","rFczbpxA7d1QSYvGGeU6whxu4sQaiiNJ","true","2026-02-09T11:04:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787743/378b7c63-c1f0-4ae2-a16d-36db4a401c1b","VERSION","KOE4O3cjt6x3WtfCfDe5VttHgtEfaqJM","true","2026-02-09T11:04:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787743/6cbe2772-bc1b-47c5-82fc-1b9f2accd458","VERSION","iRxzTY_XAZEEHgwmbJQgozlKJYUAu2Gj","true","2026-02-09T11:04:37+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787743/bd389783-bb93-497b-aa5b-7c8ed914774d","VERSION","jnw47MjvtKnLm7i2n.z_YNlwuUqqgHQz","true","2026-02-09T11:04:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787751/2ac848f5-b7cb-4536-ae4a-1510168c1a35","VERSION","HjvrjzrWOVCDkFg73LPYlqYKEuFNVHy9","true","2026-02-09T11:04:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787751/6700bf53-baea-417e-a324-a4e2166deb28","VERSION","MnyW2Iv.OYTSlbieYdZbiAZdqhDCpyF.","true","2026-02-09T11:04:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787751/91397d07-de55-4418-b1aa-03cbbe7fc02c","VERSION","69vjYcghm04b4adBGoo352utCz58eH5y","true","2026-02-09T11:04:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787751/92ad22ac-0f1b-493b-8416-17838725f202","VERSION","nryeCamwr1kFFoNOItJlevZhLLSmgX7J","true","2026-02-09T11:04:38+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787778/196429cc-a7e9-4fee-ac9b-73501ab185d0","VERSION","WHKu.I.Ms5AGZ0cwppcZsSynqy5UkbZV","true","2026-02-09T11:04:39+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787778/6a69d510-2d64-45b1-b988-9cf7bf5a703f","VERSION","TFsW3rTb7Sk6dFFrjJkbsqXsExKrfISC","true","2026-02-09T11:04:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787778/808d4fda-5cb3-463c-8ebb-cd70ed16b11b","VERSION","wIiB8YuaGWRjaXn5Ng500XN6wJa3geMI","true","2026-02-09T11:04:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787778/d56858e1-fec1-4745-b4d3-454ec1cb18ab","VERSION","D__vLdGucDqTeHxfRy8q6a20cPT8FFN4","true","2026-02-09T11:04:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787786/16e59f51-d62a-4b5d-a18e-bfeb8b163e41","VERSION","YzYGENwCJGja2TB1bzY8KaY_VcuHQ7fo","true","2026-02-09T11:04:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787786/35959497-2880-4b6a-8945-30e1068d5ad2","VERSION","aq7RUHx59nqHy6OFpHrwF.mT.10oJ9c7","true","2026-02-09T11:04:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787786/6fbb3c60-343b-44a4-b8fe-f97e2bb06e12","VERSION","rOey6hG61PqSJc8DOC8GHQaT_hWPgxOv","true","2026-02-09T11:04:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787786/e3c603e6-408b-42f3-be71-34ea9a8a0a7e","VERSION","QzV3ximl_rj9zqrr3eP8OQ9NeY1xwAu3","true","2026-02-09T11:04:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787794/2a132f02-53e9-46d1-8f05-f12580529e0d","VERSION","fyxeerRB_Ovhev5xMHjWXH8BLIkDR6OI","true","2026-02-09T11:04:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787794/5f239eab-fdd3-4896-b423-8d860b15e762","VERSION","boQtXy6_JJw_xat_sgUdaCZNqmrvwR8r","true","2026-02-09T11:04:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787794/71473aca-1cf1-4128-98ed-9b49417374a5","VERSION","Q2qQPJ12mpQeyRHxAPmN90LowPBDRBx3","true","2026-02-09T11:04:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787794/8e7ab022-d2d1-4e34-ba55-79f897017daf","VERSION","WDSUzjcBakIt6puD8krG4ra7F7n6hklB","true","2026-02-09T11:04:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787808/0fb1003e-deba-4d21-9736-1e9a3d6323fb","VERSION","7Cq15CG5aTybXlbSv2vBWHzfoNmr7UJR","true","2026-02-09T11:04:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787808/21846a95-dc11-482d-b656-89116d8f4bd1","VERSION","sazZptqnaHBXh6E59OCakLIySWf2i.4O","true","2026-02-09T11:04:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787808/39b881e4-ca59-4eb1-92fa-17cc7028dab6","VERSION","pzPxdpjWZxcKQ7wk0UmrAcxcDtrDJst6","true","2026-02-09T11:04:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787808/c261fdb4-556a-4c2f-b343-64e7607b43cd","VERSION","9P2BkUpzDMfRWTs7p9YYR0uke5snF_Jd","true","2026-02-09T11:04:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787816/6366a769-2941-4a0c-aa8a-c97e541d5024","VERSION","Tdec3MnmTHRaX4jFSjulKWsg8jXZ9wno","true","2026-02-09T11:04:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787816/8cf8dfec-6ab3-4fba-a828-d583e2e13bb0","VERSION","uOHqTNG23UpmOpqHTqfvoZXGdAL8Bdq2","true","2026-02-09T11:04:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787816/c245ecf2-54e9-4835-8ac3-176f43643d79","VERSION","_KUMvkgXVoBQY0oweoqaruanG.ZSEAT_","true","2026-02-09T11:04:42+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787816/eb01f7ca-b10a-4864-8344-d663820ef876","VERSION","._dBg12nJfkzf8jILyFVk2J5wOAh5Ufb","true","2026-02-09T11:04:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787824/3278a8e0-daf5-4e9c-94d1-fcd93ea008f5","VERSION","2pgGWmNcQpaAOLXA2xI8ZrjFZhS4uDn0","true","2026-02-09T11:04:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787824/5764c314-66f5-4a71-ab29-886a87bca627","VERSION","tKvgVQBo6UGsPCoqnAsPsynpyshkT.qT","true","2026-02-09T11:04:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787824/5ba0fbb7-0f97-4534-b3b5-330504ff4dca","VERSION","JrEDWZJMQjNuHOzdNyBwpTxXJXFjIh_d","true","2026-02-09T11:04:43+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787824/9dd8f57a-22e0-4826-a5b6-390acc3d1f99","VERSION","PmDUcjy1DJiWy_ycQfhGD0Kd2PcvWX3f","true","2026-02-09T11:04:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787832/2675699a-09a4-4ee3-8414-8c46ee381688","VERSION","dhDMq10dqAG70T9xJR2Bc3_0peofqVHc","true","2026-02-09T11:04:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787832/49d0dcc2-7ab2-4cb9-b220-e8d7f44c23e1","VERSION","G5QnWrniUyvvF6MTlHF.LrbZNDpMQxes","true","2026-02-09T11:04:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787832/54987673-d27b-46ed-9fcb-3c69381e309c","VERSION","Z_GO0StCBPrqBxzulrIeYSTLvQO.rLEy","true","2026-02-09T11:04:44+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787832/f7e4fe7c-7681-4772-8952-b6f1bc46e767","VERSION","EoKI6CBX8HJbzrEyfUsmIle.yYr3Lwbs","true","2026-02-09T11:04:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787840/10887898-661f-4b15-9728-0661c8f3522f","VERSION","T0s7cu3WbNMV49x7s5SM4k6kRswqpKiV","true","2026-02-09T11:04:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787840/40b7fbec-02d3-4803-be52-71a064c35154","VERSION","o3f4p3RaoxNf1l1KV96jSTtj8qG6q_Y0","true","2026-02-09T11:04:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787840/473169df-61a4-4cbc-b365-83e96cdb840b","VERSION","bGeWlZopHYSK2GppUcGEe_HPkMazbF45","true","2026-02-09T11:04:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787840/c37a6dd2-f119-47b8-a60e-bba0146a7644","VERSION","M8FxJvaGK1O8vK.9wtti0aOVhHGieo1R","true","2026-02-09T11:04:45+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787859/59083f22-a63a-456f-a9df-e6a5fae22244","VERSION","jw.YUV_ixs4LPeDfW9KdhyOcuGM5wQw1","true","2026-02-09T11:04:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787859/a032340c-11b3-4f8b-8f83-2b21f364155b","VERSION","4Jgip1Tel6Te43F5CctMOp9EebDTaaSS","true","2026-02-09T11:04:45+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787859/c8832544-bf99-44a4-ac28-eb3a7ec79704","VERSION","yJFLwdxMyUU.54DqrJR04jwKMJBreU4z","true","2026-02-09T11:04:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787859/f5e52899-14dd-469f-bb16-c2cbbd036b7f","VERSION","uuQe8JnAIP0c.jwxoQIPGcv5O6iU8AJp","true","2026-02-09T11:04:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787867/17b48988-8cd6-4c2a-8661-8a9ce36d130d","VERSION","TxiUNF1WQx2324UB_ei4s9PGCb6NBalB","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787867/30d3e036-c074-49fe-9ade-eaba04ca30c6","VERSION","viq5zMzX7SstC5uyMq.wsNAH4Auhekps","true","2026-02-09T11:04:46+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787867/48cf9e28-9329-421b-889e-682ba684b0cb","VERSION","LpKCpdu6biz.FPxt9.F.F.cJVQATtPDJ","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787867/edadc080-a4b7-4cc0-a3a5-05abc9b2f4d2","VERSION","z15bNSgIA9..6CH7CPuMYjAJe_Usy7mo","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787875/0f31abfd-e373-4c48-9082-3362cd6e01ff","VERSION","b_zVNcQrzIxHxafRezU0NiDqAk9EvIjO","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787875/3ca8fe72-12c7-4cd4-ad05-25da8d6f2cec","VERSION","dPJUMSz6hKsJPyf_ErDbXEWg7b6GT1WD","true","2026-02-09T11:04:47+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787875/f0436581-d8c7-45b9-a2b9-8b3518c65367","VERSION","QFeIJS6E_tLkNcoQdlkV.FWmKN95YdMt","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787875/f97a5af9-d797-4072-95d3-3c68fb14443f","VERSION","4het9HtekJGPAym20OHtyZXFX18Hpex6","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787883/0fd7cd68-f46b-4091-b13d-124fcfcd9d0f","VERSION","zJqzPyPoOOlS0LjQOKH0KshLakNVaoT0","true","2026-02-09T11:04:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787883/29943a71-a17e-4b7d-a834-59dbed3c3a81","VERSION","gTqRAxte7D.VHcggPpjOTtgYflO5IWZJ","true","2026-02-09T11:04:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787883/5218557c-b40c-4a6d-8cff-17abf50bcb1a","VERSION","vioubYoKbg1kEtfjN8.ZbyrV6PSv8rZ3","true","2026-02-09T11:04:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787883/c725bede-de13-43ef-b77d-f816aebddb78","VERSION","WKkYfZtd3xZOy2gy4UsO2szjmBhr.2Wa","true","2026-02-09T11:04:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787891/29d59165-2a71-4050-a8f3-7e4959def454","VERSION","8pVBlscEvs_3UFlGZ8h4X0WwjgBk6VFv","true","2026-02-09T11:04:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787891/588babfe-62a2-48eb-9da1-a6d1eccedfef","VERSION","r5NZ2ku6WM_LFJWy5Sv2JrZ38uialhVp","true","2026-02-09T11:04:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787891/8961725e-66c1-4e07-a86e-d1ee64cb4b99","VERSION","18JAka9aNsgNS7nV6ggcRW7UW06bkDIB","true","2026-02-09T11:04:49+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787891/e8c90504-da8b-4d5d-ad86-82629ac5e633","VERSION","wdc.z3qLQuZ4s0D4FhlPP50Hvq8IZ2ai","true","2026-02-09T11:04:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787905/1555a43f-52d7-475c-bd28-006fd1e50ce7","VERSION","pKH._S.H_xeIDAX6dzCNzj6.h9rKiqsD","true","2026-02-09T11:04:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787905/472d263c-11d6-47fc-8c25-056343eb1165","VERSION","3hkqoaiCkRdf02MyrOO9k57pTHhcl7ZV","true","2026-02-09T11:04:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787905/9779891b-4d06-47de-86ed-2098fdd7058e","VERSION","6qbiGRVomhPzFFLiAoFN4vU46rEKx0KJ","true","2026-02-09T11:04:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787905/ca72d9e1-7f4f-4d79-973f-dac0e6eee763","VERSION","M7A3XZo2StIfcLVClaUw1N5I_O1YXUpc","true","2026-02-09T11:04:49+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787913/03e7053b-01f4-4ffb-9259-be92e68fbaed","VERSION","XnVstQkiV_ezEl0kTSp_DU_k7coPSYRx","true","2026-02-09T11:04:50+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787913/04c2d02a-c32a-4f0d-bf07-73354de411c5","VERSION","eAgBeTMhrrJXFwILVLhQxd1OTH1HUJAV","true","2026-02-09T11:04:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787913/32624c63-d6e3-4770-9e54-5e919d5c23ee","VERSION","t.J1b8eWaIm5VZp4K1AA5cEWez_bezot","true","2026-02-09T11:04:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787913/cb6e1aa9-884a-470f-b879-d40572b69bdc","VERSION",".lTfFdZG5ixStQruNxOqSLrlVV5p77Eh","true","2026-02-09T11:04:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787921/0cc6f2b6-1491-40e3-a39c-5654dcb0ceae","VERSION","W.wY9CvfCHD.o3EYhCsRUEedIov5RPJz","true","2026-02-09T11:04:51+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787921/3bdd56fa-5acb-4e13-acb6-e90a1e57c888","VERSION","PwSA3_81JAqiJyFNTnIv3eciktaKuoOU","true","2026-02-09T11:04:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787921/de009a1e-e056-4c47-b181-8df3d1f28ad7","VERSION","6ASx7Ly0r_ZrchsIj5UanOQU8a0HcXEU","true","2026-02-09T11:04:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787921/fcf85e46-fe15-4a52-bcb2-45c755bd7e13","VERSION","oaDjvNe5U_Fcno7RhPXYjhws91smtP0D","true","2026-02-09T11:04:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787948/00c2123b-487d-4cdf-80b9-67fffa64b0d2","VERSION","twLYvZEVLqndnuLAQ4Piki3kq2Fu1ZZK","true","2026-02-09T11:04:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787948/78170cef-953e-4336-b2f7-c27268e26e03","VERSION","6HTOWJi_oB3TD45qgmH_5pqvfeJIY6lh","true","2026-02-09T11:04:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787948/90444c89-8488-4649-a54b-455db61ef0dc","VERSION","qSrU54.xAwuQRWWWEv3SV.iCrxS3Tc2_","true","2026-02-09T11:04:52+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787948/d449be20-a185-4f9d-940d-3cc7a07c8c1c","VERSION","jV09I9.Oo47oOLYGozztnirc4VLjOBx_","true","2026-02-09T11:04:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787956/6b0b62ea-4e78-4a0a-b6b7-e7269fd67313","VERSION","OARlc041QSoJT6MAom0yr.UDecAHp2zG","true","2026-02-09T11:04:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787956/6bb56123-1d4c-49f7-a1cf-ac25eca38942","VERSION","x.wI9UZmN.UANCKJ8m3AgjLDe91s5krX","true","2026-02-09T11:04:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787956/9944d9b5-cb3e-4d15-8518-885a1aa2b4d9","VERSION","jLT.1d568eDiizLCsVf6N98fUoNGI_M8","true","2026-02-09T11:04:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787956/a4d54975-07c1-491b-99b9-cd5a8da461bc","VERSION","QaPbf.nMB_5DANhawETQO3W762F06iz_","true","2026-02-09T11:04:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787964/d37136e4-1a1e-4897-8b0a-05a739ad90d1","VERSION","HldShr9xY_edzmYN2WCDN73w.skkMldd","true","2026-02-09T11:04:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787964/dc4dde95-1c8f-4db0-9402-0b1639e2a164","VERSION","syZ9SDunjAhuKX8WgOmb58NZvpfaCnBc","true","2026-02-09T11:04:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787964/e5670e45-b6f7-4596-8b03-ad91cec1fd71","VERSION","IExgTOlFJyJiRoh1iv7WOQlOc1VZBgTK","true","2026-02-09T11:04:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787964/f3ea92a4-33ea-4aad-8721-541339c188a0","VERSION","OIp3GzMcy8poJ4HcXQFsAk4nJlJdjEm8","true","2026-02-09T11:04:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787972/2da66636-600f-4f9b-9388-a1ed736ee0a0","VERSION","gEQjytTaTiXmI_uLhipmLuVUF0HRRxVd","true","2026-02-09T11:04:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787972/8f714c18-283d-4579-b4c7-5faeb8bd3c5d","VERSION","I.1oMD8R7z6g2pFmcb.uMPd4Nt.Y14mB","true","2026-02-09T11:04:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787972/b19e5859-c057-4e42-b142-a555dc5419b0","VERSION","dmcMyF1QLM.0a3V443_oasiaEuaCBSZO","true","2026-02-09T11:04:54+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787972/f035331f-6b75-42a5-a1aa-7b095352320a","VERSION","jFJrnoefzUP27Kg4i8m7piaVabfIek1d","true","2026-02-09T11:04:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787980/18b92f89-71f7-45ab-a6f2-83f6c3008c73","VERSION","xzvA1nGqEu2OrWx22hECaxiswfN2yN5Z","true","2026-02-09T11:04:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787980/4a48c760-6f78-473d-a9e8-a8a05d973553","VERSION","9gjYxsWX6ZwnBjIr3fykJxvVTxmZaRmH","true","2026-02-09T11:04:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787980/613fa1b7-484a-446b-bf31-daf7d93060cd","VERSION","UNxO97cxaBmsmWJqk5xLVUfQP4QTAJ9u","true","2026-02-09T11:04:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787980/a0c78e37-83eb-453c-b413-357a661a01c7","VERSION","7po9FaukN8t4uJUz1pyNPxDBzvx.QepH","true","2026-02-09T11:04:55+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787999/52f3c434-6d37-41fe-9f9b-6bfd691e2039","VERSION","lDSM4lk4lD6OTgkmrAm7ZbG5EdW1FoHJ","true","2026-02-09T11:04:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787999/ac5ef3d9-feff-487a-8a98-f872baef5db0","VERSION","jjd0tyZ90842_Gc1Vl9Mhl4HnBZRNQ9T","true","2026-02-09T11:04:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730787999/cd14eed1-0aba-4986-94b6-1e59c23c6fc0","VERSION","mXYnl.yk4coyYz8QfgNe.g0P2KxRQegr","true","2026-02-09T11:04:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730787999/f331965c-394a-4bf3-abe3-7cadfc59aa2b","VERSION","mEeTMMzgD3CNgkY2XbV_zVyHaRwd2ZeI","true","2026-02-09T11:04:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788006/52a03a4d-1fd5-4bcc-a94f-53900c952014","VERSION","Skrtx28vVOmRaJO1A_CZRPWPMcGuVuMM","true","2026-02-09T11:04:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788006/6d0c3a64-867c-4d7f-8af2-3f9835300969","VERSION","JMQtIjTH2xmT.ktaUDdEI6LJpLeBjzdq","true","2026-02-09T11:04:57+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788006/892f05ab-75e2-41b4-a24b-54b9ee822e5f","VERSION","GNF829mca6nGJxlh1vb0TOdyZ3D9U8kN","true","2026-02-09T11:04:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788006/9f94e70e-81dc-4968-b9f6-1189e900f1f8","VERSION","4sUlPZQm6yLMj5TXwJSPztRUlusyxo0o","true","2026-02-09T11:04:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788014/378d4a81-494c-4845-8206-d6640430d0da","VERSION","0RnTJQ39zdsb8n3Ud0gcMAtRZ0ewi3c4","true","2026-02-09T11:04:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788014/70272662-e611-4a71-b6fc-1d3ce6d2fe89","VERSION","ApSmW1n0dEXP1gWz5FM_HZ1_Xh4zEqpl","true","2026-02-09T11:04:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788014/e028916c-1c5b-4097-abd1-d1cea17f785d","VERSION","ivaaA_W4G6Er4Necit9BX8thW_yztOg_","true","2026-02-09T11:04:58+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788014/fc6906e3-a15d-4be1-9ae9-bfa4eecb9695","VERSION","HmA2ha4pGFHb9OcMfGlzxVqumORas9kD","true","2026-02-09T11:04:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788022/0d588958-1906-4ba2-baf9-8cab41b263fd","VERSION","AOyA5cOcQQT6kZLnMzSX.jwjvYYd.uhF","true","2026-02-09T11:04:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788022/591063c4-221b-4f85-83d2-b59581892b45","VERSION","z8u_THkRkHEGm5prZM87mFzvHgarFdby","true","2026-02-09T11:04:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788022/8d947b74-f0b9-4d37-9d4e-2373870843b5","VERSION","eMPaxBgDE8GgZq25saeo9jxxkfWxiDSv","true","2026-02-09T11:04:58+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788022/bc40bac2-d3fd-4378-aad3-8d953c488d83","VERSION","4nhGqaahNJMy7TRz71KEzrbuW3EL7rQ5","true","2026-02-09T11:04:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788030/a180f722-1ffa-418a-860f-ec3e2269b135","VERSION","v.Di_QKcMZwQzEj0d7EYiDZgQoVTkN_6","true","2026-02-09T11:04:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788030/e1ccb62b-e3ec-4383-8c5a-6fc334b1566b","VERSION","sW0h2cOkGR8HX_6E9c5rQ6xDzf0l0rJh","true","2026-02-09T11:04:59+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788030/e330843a-a9dd-4f35-8e31-a51e54812834","VERSION","1EDip8wWVf2ofT2AlMm0PgnKqzq31UXW","true","2026-02-09T11:04:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788030/e91c43c3-c5e2-40b2-82dd-e0933e51fe69","VERSION","U3mwaH4o4CSQKswYLgv2aQrqrlXqN02H","true","2026-02-09T11:04:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788049/380617fe-fe7c-471b-9414-047dc2228ae5","VERSION","25I1WezHi1xVoddAnvetQ8Fm.hQWSWCM","true","2026-02-09T11:05:01+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788049/97e1a3a4-78c9-41e7-9b03-3407bf1f768c","VERSION","meMIvdNTkiQr.73p_Q6TCdOvznmPo9Ij","true","2026-02-09T11:05:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788049/cae4ed7b-80cb-42f5-add7-f6a12ba67920","VERSION","r1Q_rexDZ1CrlozXDIrbPB9vVxCfc6vf","true","2026-02-09T11:05:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788049/e2a7e431-d653-46ff-a70a-7ed9a7c6946b","VERSION","m3nSIRon8.JojOARfQgqEkV3sRWiqUTj","true","2026-02-09T11:05:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788065/3bf3ea12-768a-44ca-b21b-43d40c3b0281","VERSION","oQ3EY.LKCfKp_05Np0z20U39DvSX2IBl","true","2026-02-09T11:05:02+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788065/6ada6cc6-b41d-482c-8702-9cdbbd78ef4f","VERSION","30WyihB0HrgMk2f4q43GGnn7aq8eqQPC","true","2026-02-09T11:05:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788065/a2c09c55-3a03-45a1-9e0f-e3d7c691d7ca","VERSION","gM9zfmdOBiuZ8f1eL6N1sP_KQaCQHTQI","true","2026-02-09T11:05:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788065/adcc553e-0891-4f6e-9e58-e563c29dbbe2","VERSION","T32HMfFDodEwgT6Iw_gEUEjFueYo3V2p","true","2026-02-09T11:05:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788073/0c2414dd-84c2-4dea-8961-c72db466b4b5","VERSION","y5vrjAiAkH5K7cw9MSJLh2BlSxaoVbh0","true","2026-02-09T11:05:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788073/2566d6d1-05e6-4abe-8b82-05831addb0cf","VERSION","G3lO0bL4HNucUU_OyEV9IL78Z64Wa0BT","true","2026-02-09T11:05:03+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788073/3ec3b32a-f79b-482c-b5bf-422c48684dcf","VERSION","PfEj8IfIhpDUdcuTVpt5PL6Bue4.BM4T","true","2026-02-09T11:05:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788073/f9c63c75-14ad-4d28-85d6-ec35bfec1046","VERSION","76si65FHrRyRTjXJDRDDhZuuglgFHOFn","true","2026-02-09T11:05:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788081/06412780-1c59-45ee-a4f6-8b0ddcd72fab","VERSION","SKF5LQRhY39L26g4wTmFpXDFGIzIgWYx","true","2026-02-09T11:05:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788081/b75e37c8-b4ce-41dc-9e33-ec87d40a7f93","VERSION","HOIsTIoHg6YVUbvEh1ij_ymVLN8WMb7y","true","2026-02-09T11:05:04+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788081/e072a87c-627c-4297-8177-c30ac21e77c6","VERSION","pmppNkP.DdxpvDDwLqCsCEg2j_0BxZW0","true","2026-02-09T11:05:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788081/e2180ab7-0720-411d-9043-42f49f255fa3","VERSION","TZHS_E_JMa4WGXtURvAiBINt8EXsv3qV","true","2026-02-09T11:05:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788103/03c2c6e0-921c-4fcc-aaf0-308427d2c60f","VERSION","XnrG_jdaZqWVg8p3SA7VWsnTSnphgDOI","true","2026-02-09T11:05:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788103/3db180f9-6835-48d9-b38a-fb38aa40b8cf","VERSION","13.TyQ8xiafdlB4iyK448jTa7NFhMbpY","true","2026-02-09T11:05:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788103/787c893c-e131-49df-ba15-a491d93ec363","VERSION","975mQkjm.jjxzR1aVhpcYmo4WjPSWnaC","true","2026-02-09T11:05:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788103/fdae22c9-256c-4f96-8d00-346691b2cd68","VERSION","2BnwaRzLqrL.nK5vFq4V7qhx68TtP8h5","true","2026-02-09T11:05:05+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788111/21970e23-2674-4706-a732-89548517765f","VERSION","t02GaGn2Ucb_BQ5Q9oDhqs76TqeB4A5t","true","2026-02-09T11:05:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788111/27f01613-236f-4ea5-9083-104d58148566","VERSION","kCSNH4OInilxV2UiRd0HkT7vRZdYRQGz","true","2026-02-09T11:05:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788111/b0750656-15b3-4d55-9819-d8e9a692e716","VERSION","4L.yhV5LM8lInu00Zan9yJYg7rFtyqpN","true","2026-02-09T11:05:06+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788111/ba6b0133-7bf4-43a1-99d5-386a8a2c45ae","VERSION","LJz95809ItWIW4WyM_F3wNSOCr2hDFNA","true","2026-02-09T11:05:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788138/0bf9bfb3-44a3-4acc-8c06-2136f9235671","VERSION","Dms157G6Aa3DcFCcr2lj3QZ0gVigOWWM","true","2026-02-09T11:05:07+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788138/b216c474-df43-4a54-800b-d33c6f2c4687","VERSION","0mKe0sDZZSZEzADI_FOMYZ5FSdiuAs_n","true","2026-02-09T11:05:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788138/be31d167-5690-4c6d-aefc-4d06da2adc1e","VERSION","Jw_16sAXsFvPibmUq4mSM58klM4GPIq5","true","2026-02-09T11:05:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788138/fe90b35f-1b96-4c47-8fd5-2959d6630387","VERSION","1Gaa74cv_owlokOOCV4eH.i5M.iSwCvE","true","2026-02-09T11:05:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788146/14d9a2a9-10f5-49d2-9565-8ca95c6960fb","VERSION","whcPxKWbQGYHRSh18I7IUoPaG.yIaum8","true","2026-02-09T11:05:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788146/8783e02a-4389-4f0d-b415-5eba1280b730","VERSION","qOWmj0rCwV0RQZwNlszlI3xJywjp3D4x","true","2026-02-09T11:05:07+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788146/a8e66ac0-9a06-4602-8f9f-b10e19b7f185","VERSION","P0fwGq2eOLiODcZklTmLaWjuREODhgN4","true","2026-02-09T11:05:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788146/ec2ebad2-1526-4013-9ff5-3bc338f22027","VERSION","WE.4.qViIV_ARkwa0muKebSkJQ.8PNRe","true","2026-02-09T11:05:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788154/003ff292-1c33-4968-90b5-4ce2d49fd815","VERSION","k7LqytNUyIiGLdPMYIg6V2jNIXoE01uq","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788154/484a327c-90de-439b-9750-09a97b4580c0","VERSION","0xGqR63RNYdqRCaLDD5T8kUVQ3tqvSL2","true","2026-02-09T11:05:08+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788154/6a8c240c-e9c3-4688-83d3-1091d0cac023","VERSION","C3.bjyd0a1BOY0olg8flmIPTdAtZchHc","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788154/7cd9c074-d8d7-4e6f-a629-0d26e7e3b5ac","VERSION","QyrvlvQTRdP9kGkzmC45HIbyCD4S_4u9","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788162/19a9c179-68b0-4b2b-ba2f-db48d4bd0b52","VERSION","Uvz7GygwnRnJJSA0YDTJRg_evtux3pke","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788162/7f2add37-64cf-410d-9eca-7f7328323aa0","VERSION","CcvZ.mm8wV3KdDRbmbBaUp1i8dbW7Pbn","true","2026-02-09T11:05:09+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788162/81a2dc13-d1da-429f-ac6a-c258f9b79392","VERSION","GTcSatzISD_L49b.C0bBgkCUCMljSzPj","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788162/85c81263-5436-4581-8575-5bc578cf9545","VERSION","HVTjlIQ.5v1gN7l5ov_2lN4EQ0kojqSD","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788170/0c4d4a47-2db9-425d-a1c9-5214d56a70cf","VERSION","lHImqyyjQ_4uY9OsF0QLJfI4A6eUsCmS","true","2026-02-09T11:05:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788170/45cb66d8-f445-474e-b172-8f462eee6b94","VERSION","D34m3dOcF9ETqVOTC2TdwN8emg2TLtnm","true","2026-02-09T11:05:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788170/6383ecb9-b188-47be-b2d0-663910f68f4e","VERSION","DSY0Bu8h6MpZFWlXo4lRizP54knp00Iv","true","2026-02-09T11:05:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788170/eb0fb9c3-3565-4ef5-ac82-5584d480357f","VERSION","EX_uYQNXjxIxUGuybgs9uSqZCTG1sFEh","true","2026-02-09T11:05:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788189/3d93054b-15e7-4b7d-99c5-7b36c8814414","VERSION","GX0dL2P3qjfXBwuefYM_JLGyg.cjCI0w","true","2026-02-09T11:05:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788189/6c9b7e7c-9bb9-411c-b062-516af22054b3","VERSION","QhupvdHs5W8MuUmbe4QvELn8B.7SLsgt","true","2026-02-09T11:05:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788189/cbade354-438d-471a-979d-28b0c7c8b67b","VERSION","DoHFGjlkKjJ2fMcgRz5da1OebeJLWxnW","true","2026-02-09T11:05:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788189/e08d8cbe-cdba-49f7-9a88-849e190c2986","VERSION","Y34MzzXr2Edbo9_L3RZvY2dLLIEM1hez","true","2026-02-09T11:05:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788197/2ab07d09-50fb-4764-b463-2ee619256fe6","VERSION","stj3SwAXAZTzMB9SoWhcjhCtlE38k6K5","true","2026-02-09T11:05:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788197/89b328ea-d60b-4ae0-b335-d4ca95a06e5a","VERSION","tYnU530dLOXvzto8g.xgc8ZqHPQ_QXUA","true","2026-02-09T11:05:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788197/a1cb33db-608f-4a0f-a6e9-ac381cb52046","VERSION","qJbtKcSNO26ZbgndYrJdyP3m5KB8Aw2u","true","2026-02-09T11:05:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788197/e489a480-b279-43bd-b5e4-b26ac01c71f2","VERSION","2vIVvPqGg1a_v_nRhhKI5RFvSqYjst5x","true","2026-02-09T11:05:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788219/3933d2da-6546-4e0b-9450-8062bbdfe2a1","VERSION","9Lf1BSX6344LW_.8tBkoPzACCVHxaJqF","true","2026-02-09T11:05:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788219/66c4471b-7b8e-4d26-a4b4-c20b6120954f","VERSION","577TQNObfLhkKyyYHxDB04aY9kHc0Ff3","true","2026-02-09T11:05:12+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788219/8f6f462b-0b9e-446d-9c03-e2b3bac82584","VERSION","21pnT_0GvZJ_AZ8BKyWhBYzhxLvje28p","true","2026-02-09T11:05:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788219/b83bf1c1-d788-4f2c-aa7e-0e0ba59d7367","VERSION","TrAzaYPk9XwrqATjzPCJu0eOjTXeT_5N","true","2026-02-09T11:05:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788227/34f840f8-d541-4ba1-90d7-4e169305c081","VERSION","QP6B1LvpP5F2pipjgBCNmlMsvimh6xRH","true","2026-02-09T11:05:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788227/50cb808f-fc70-48b4-8020-bceb8ca311bb","VERSION","lQnwDCc5c4vbzwMu6lLugIy29kLTZZE.","true","2026-02-09T11:05:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788227/62fc1306-623b-459a-85c7-e6f03e074001","VERSION","f7rpJi6TIzVvdDwUKEYorLqyC6iqmPVG","true","2026-02-09T11:05:13+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788227/e389999a-3158-44b6-99d6-a7e7e50a6857","VERSION","pVJJrIJqk_EUCzCcTojnk35A7tFZo5Ti","true","2026-02-09T11:05:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788235/46851f89-d93c-47bf-a5eb-e3a9263df1f8","VERSION","GAhym2PS3C3UjM8vOAjlfmuou5mv9qPA","true","2026-02-09T11:05:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788235/8a4e1311-cae4-4844-b585-75d357f15c6b","VERSION","eIEGAjv61UhvFB9KinXn0jVVYXmxhxfg","true","2026-02-09T11:05:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788235/b549d52e-f3a6-4d41-be29-63fbd2c417ef","VERSION","BtcPS8YL3cXtkvTzhn1Y2S5brQfGvFYT","true","2026-02-09T11:05:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788235/e29b6c13-e872-44fd-ac4f-5b120822c56b","VERSION","7K5W7z2WbVtsqEepFRwMI36E_DKFhHH9","true","2026-02-09T11:05:14+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788243/087817b7-749d-475e-90ea-42de3578ff9d","VERSION","KIhWLqni1WFAmZNUVPWNewWf5PApsXSZ","true","2026-02-09T11:05:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788243/632c9d5f-4b18-4ed5-b6f5-ce6dcf4c58db","VERSION","lEARXxSiCyRW5gEWo92kcCsAUXotips0","true","2026-02-09T11:05:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788243/8a8162e9-d0e9-4125-bf11-4559b7633fda","VERSION","SDIsHicegT7fbdwtOZr67Ssr6faq3fo4","true","2026-02-09T11:05:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788243/cad93be5-2f2b-4d68-81cb-aff1981afbcd","VERSION","uWXZkp7BhLq_TSNUZ2Lo7dLyhi2pEBEn","true","2026-02-09T11:05:15+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788251/2a6ac9d8-d071-4c92-89e9-5c8cec20e0de","VERSION","LFlqhXcCCMcp2IwIeEwuLxINtIxSm90v","true","2026-02-09T11:05:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788251/35c2e5d0-c61a-40d6-ba6a-ebd8a1eca95e","VERSION","GaQl0ezpmWJhf0lnSiIsLPREVGvXhLMC","true","2026-02-09T11:05:16+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788251/8cb45214-95b6-465a-84a4-9453fe5d52ba","VERSION","BOzSdEW9CX4IYUAUGK4TFFIYIWhrlkjC","true","2026-02-09T11:05:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788251/bc49e6eb-ba0e-460d-8f79-a3d8caf0e6ca","VERSION","HQYQUFZU4JepD_I99o3zSbAYp_NesXCW","true","2026-02-09T11:05:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788278/2682d918-5694-4a46-8b57-ea0cdb2dbda3","VERSION","OF4GV6riYk9b.wdkVTA9jsSKYV6eCEg0","true","2026-02-09T11:05:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788278/a6537dfe-251b-4b5f-8fb4-77fcc9668d74","VERSION","ayabzIF7bGcCyZKJriFaeA5e0Hy_9DVw","true","2026-02-09T11:05:16+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788278/e303d2dc-00e4-4fff-b9b2-88c94714f8d8","VERSION","v3Ch5Hy9NfiGid_q4KbHhOvOvsL9vabR","true","2026-02-09T11:05:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788278/f76f4fb1-0c96-46cb-895c-be6633249eae","VERSION",".280.bbYVwQabK1GVaOrYuJ74U6ngE8m","true","2026-02-09T11:05:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788286/1bd30f6a-c496-49b7-b042-87c80b29b4d4","VERSION","KPCii6SWAP17DghD2ytTo3ArIteEySs0","true","2026-02-09T11:05:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788286/4fc70f87-013a-45e7-852c-58e5b144b83c","VERSION","skFpiCV_AWgtcSUATXkUmpkM6C_UAJKP","true","2026-02-09T11:05:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788286/a4f3f549-36b7-48a1-aaab-793f2e4feb03","VERSION","9W7WPWRnjT5u6FuCoo5CkJ5n2RCxd7NX","true","2026-02-09T11:05:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788286/eaf25696-f932-4945-a358-be1b0a019b0a","VERSION","blJwmXED9mh43lDfw14ST3pevZetnHGZ","true","2026-02-09T11:05:17+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788294/36747770-c9e6-44b4-ba3f-3dc27d14112f","VERSION","cnvdhpDS2ja7vWZNh74t0Z.al5HGWT75","true","2026-02-09T11:05:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788294/3a5aeedf-54bb-480c-bbf4-218c0d15daa4","VERSION","OiJMg1a0QAwzl0_ytED91zTOoaNdTKFV","true","2026-02-09T11:05:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788294/4383ee85-92dc-4de2-9174-f69b597b736d","VERSION","lgFlkBHz2NtboQyxuiaEq6tb6Tvftj_1","true","2026-02-09T11:05:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788294/6b84b930-36dc-4b77-898e-e85b16c440e0","VERSION","P54X2hrvNIejhONCVaiY_ygTYb3i66Qj","true","2026-02-09T11:05:18+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788308/69be3538-d187-4682-8bbc-9b63ec6342f9","VERSION","Vm8Es62lmVctgB_.u.y4XPij3nlSrH6u","true","2026-02-09T11:05:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788308/78fa46a6-4707-436d-8acf-437d51ba16bf","VERSION","juL2Qcf8H0OS6vCv5gaWxlullbK9705n","true","2026-02-09T11:05:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788308/aa71f297-3004-48c4-8240-3b6d4ab1a81d","VERSION","jH8T.MsVAX4vsfEahBroTjhCAijmEmY_","true","2026-02-09T11:05:19+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788308/b0a2fbf0-83bb-4d3c-9c41-60476656a627","VERSION","oqrVQUVdm5Ia.lpdidtmxP6TUMHfAgea","true","2026-02-09T11:05:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788316/09c3f573-222b-45db-af9b-75e0bcc3e5b5","VERSION","yinBc0ZpzkWuz_Htplg91zarF3u15jFe","true","2026-02-09T11:05:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788316/6d89d318-bcda-411e-b592-d3d4a5e86f7b","VERSION","FV5rEyAYsykU6tp2sjdWv_JS8MZXlwUy","true","2026-02-09T11:05:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788316/dce28bd3-0f05-4e4a-9cfc-2b73b4306d97","VERSION","j8T9ssD6JKKqUUmZzUknLd1T6fyFbbw5","true","2026-02-09T11:05:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788316/f7019d1c-49b9-4189-a5ff-5b1392968e01","VERSION","IM4jlXVReeUC_If3XNoaWPEPpnDTfovh","true","2026-02-09T11:05:20+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788340/6edbfdcf-ad6f-47b2-bebe-b55fca2b44b8","VERSION","VFiRywEfEk.dIbvBhykAfhdnfuJ5PkOC","true","2026-02-09T11:05:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788340/8bfdcc20-945d-485b-b8a7-763222ef7ced","VERSION","l_Ai8t.ksC6fzSIjqtf6OrGpl49IereN","true","2026-02-09T11:05:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788340/aab26a1d-8d0a-4616-8da2-d1932af3685e","VERSION","OL4qjj1vu9_gZCJtwxM8IG2PtsxSw2Ky","true","2026-02-09T11:05:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788340/d7b8eb2d-3e1a-45b5-a4d6-6af7c450af3d","VERSION","lsjxLMypfbB3lTxigw3pmUI_RJVsBji2","true","2026-02-09T11:05:21+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788359/3ec25110-d9b2-461c-966d-eec1114cd334","VERSION","JFNbFQeWbKAiCn20vJBJhakhbTGWkmwq","true","2026-02-09T11:05:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788359/b2fcb807-83c3-4d82-b55e-0169ee66fd57","VERSION","lRX5UfHy1RrrLSNfk8.MGD9E0w53jLKK","true","2026-02-09T11:05:22+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788359/f236208d-12af-4577-bafb-1b99dc0cd297","VERSION","SEyOlGnRXxvhvTh1HbieOkvsEx7kQZvK","true","2026-02-09T11:05:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788359/f8ff0e29-afa3-4279-b5bb-012888ad829f","VERSION","kGiIw2TaCX.uf6JVOPyHF4.XkovE8QXk","true","2026-02-09T11:05:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788367/58e55810-eb83-424c-a290-a3f79d28b875","VERSION","1xdB3jDOUOxkogmijZNmy3LXOD3azck5","true","2026-02-09T11:05:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788367/63025d5a-007d-4340-ae58-f3b3e6114428","VERSION","ElH60i37OxDDob1YRKGixhbzmWHAEV.b","true","2026-02-09T11:05:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788367/8ed35943-e6c0-48ab-8196-056e31609520","VERSION","GLIn9iy_VOiOO18qTrYjHMF7Cit.5aWx","true","2026-02-09T11:05:23+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788367/d2975b4f-e891-4966-8f1f-191ce670a98e","VERSION","QiUKMR._lMEUuYvgT9rzrbsXo000gGA8","true","2026-02-09T11:05:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788375/7ba4c4dc-2b6a-4fa1-ba01-05c4f939148f","VERSION","CpAF8veQFSQF8yX8ZrzW.fKPPOAXQxhA","true","2026-02-09T11:05:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788375/90f1a686-02bf-4d19-b2a6-895d0ddde8d6","VERSION","VkoRdhkkjKnoPlL2UiA5xAKDkiAQpk3G","true","2026-02-09T11:05:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788375/9d216c99-5fd3-4770-8d34-b2a6ad7c499d","VERSION","1vA9GpsI6UJb0duuM3qGp3nxtDkhFzQ7","true","2026-02-09T11:05:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788375/d8e9c7c7-0b77-4a7f-b4c8-093e68dccf02","VERSION","QiouXn.J4GPkHEbP5mKXSDYmrfmPVNnT","true","2026-02-09T11:05:23+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788383/45c100fa-ebf6-4336-9784-5f9938e14654","VERSION","SJ8dUO5o9M5MqABUOfQuifRiu741Ehw4","true","2026-02-09T11:05:24+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788383/847e66a1-99ff-48a6-aff1-3798586d721a","VERSION","AvCdOkbeFTvkoaq4aUjHPlbmP2l7phu4","true","2026-02-09T11:05:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788383/a66d1eff-06fe-451d-b094-6b75815d304e","VERSION","APtvJ0MCoehFg4E4LqOTK8Ph9ZQnnvyz","true","2026-02-09T11:05:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788383/a882b076-6cdb-4b4b-8cd2-077148690005","VERSION","Gz9oa4Q4w9.4iyIaonmnh9qcVYOBvqNy","true","2026-02-09T11:05:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788391/19b227ad-1a1f-4733-8b59-b404147f314c","VERSION","H_S9FxvYW_E1Dm1AhaqHeDwQ8H8Jx5F2","true","2026-02-09T11:05:25+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788391/9af29ea3-3544-4326-bafc-5a4da50d02ab","VERSION","WUnFydEZyAGXMi8PfpZvFh3k94TbcnhI","true","2026-02-09T11:05:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788391/9cc635dd-4b70-421b-a432-32d460ef7ad2","VERSION","OOphl78n8hhiTQsxzf4E0eg7gBRTmeQR","true","2026-02-09T11:05:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788391/b0f1242e-9669-4535-b0c0-653c3b9f6d41","VERSION","VJC8sDXD8CbjrtY2Nb1HOmZE0IsrL1AJ","true","2026-02-09T11:05:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788405/0c08b83b-e495-49cc-9969-6c9d01e7e0d4","VERSION","lAPi05UyTM6DdAHgqhmO5J_ySSEMhzKU","true","2026-02-09T11:05:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788405/1ed277ea-33a8-4041-b8c7-a51b00ef5ef8","VERSION","lnSfbSgvGSCtaPzgti.Ze_awqBqaPish","true","2026-02-09T11:05:26+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788405/83a008e2-217e-4bc2-a4b3-16bf9898abc2","VERSION","NFT7d_lply.Qe._QBDRPxusUZKYb5byv","true","2026-02-09T11:05:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788405/fcde8ada-36a9-45ee-bd0f-14224a77c7fe","VERSION","aIEeCBDfdgrMRxt3o99kyP6ZonsD0PrQ","true","2026-02-09T11:05:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788413/4e19de25-140d-46cd-b8ec-7c83989de573","VERSION","QqM2tAsDBOZ.MCgwqKwdv2.84Jski4Ik","true","2026-02-09T11:05:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788413/6ad7039a-9a4b-4da8-b67f-5f1c41a78bbd","VERSION","LT5s4YIsc4i.PUKDLHDZN7H8cG7JNt5L","true","2026-02-09T11:05:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788413/79655978-6ba6-477f-aff6-25d90843921b","VERSION","1OgEc99jSzzXMJYuFdWr.tHyRY2UgcW3","true","2026-02-09T11:05:27+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788413/bf92f717-df27-4082-9636-19a48e8491b5","VERSION","9Bzk7Sgr3OPUiIylCrmT8TN.nglUk0w1","true","2026-02-09T11:05:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788421/49f5d451-afb5-4f50-9243-84dfc9c00386","VERSION","O2ICFKlL9FeiV9zzaeEfo0ojjX.WT.vM","true","2026-02-09T11:05:27+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788421/7e4b1711-0365-4166-881d-7b17774c0dc9","VERSION","TiiON_3B4HG16.zo5tEopYNOg70w6NoV","true","2026-02-09T11:05:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788421/92114185-afe3-4d9b-9b8b-79f3c6ebb00d","VERSION","3pqu_8FMIuHvfxq.FfObI4zs2HlRB.DY","true","2026-02-09T11:05:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788421/e6469780-c529-4406-ac0d-1ac34f9596f5","VERSION","bu6ppA3c8NCOS9C2fBCK9V8DGLxsFSTk","true","2026-02-09T11:05:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788448/173a695d-67ed-445d-b8bf-33b816c147e5","VERSION","t0V5Z1CbX4t3waRni_.6QZj8_c_DSiBl","true","2026-02-09T11:05:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788448/1a509a81-6e68-4081-a23f-ed78d1fbdeb2","VERSION","JiW7V7IECZIvVX1viu5D2alR2MzygQ4e","true","2026-02-09T11:05:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788448/91f7dff6-a61d-4d7f-90a9-1e77dd624337","VERSION","BJyaaDlRUTWZJDoWNExPFbFYh_bIVLVh","true","2026-02-09T11:05:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788448/b3294319-e5dc-4aa8-8c63-04d08f6f93d4","VERSION","JQdOsHkaXZBbpFhpBuqEFKxVkCcq7RxD","true","2026-02-09T11:05:28+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788456/19c2a4a1-95da-404b-b8d1-db2213cf1d20","VERSION","Mx33QRL5xQ4Pr4utN_fRmlqQBbbYx1RB","true","2026-02-09T11:05:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788456/772ec8c1-2842-44b1-8cd2-b8dc0ef30d9f","VERSION","nzead7oqVkEnBh6R02.xRoGjYPSnIPkA","true","2026-02-09T11:05:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788456/867309a6-c68c-4357-afae-588b2b097ed3","VERSION","FF5YSzgEtxznQ_R.CJfJwBAlvx37Jd8y","true","2026-02-09T11:05:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788456/94352bbc-7ce0-4c50-821c-41067ba87e50","VERSION","RBrI.N8LniMugGJaRLAOyL4WO4d1O09h","true","2026-02-09T11:05:29+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788464/32e8a955-c608-4bc5-9a71-89c6d37ee750","VERSION","3dqpPm0nbJBcOFYtZp3s7qJgqKYNoQx_","true","2026-02-09T11:05:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788464/6589cc96-b2e1-4cb8-a782-46eb4d9ea27d","VERSION","m1N0sVetSdliQzDyWxdWu1HLCik6b9xT","true","2026-02-09T11:05:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788464/805cdd0c-ac7b-419e-907b-150e36d3e828","VERSION","zluuxiYphsM2NZ3I.howzxtArw0PxJMj","true","2026-02-09T11:05:30+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788464/a1e6e081-3b95-4848-b36b-bd14951b2337","VERSION","I6Dqy6wiBxOWEoaTTGvlClBbIgqoOr2l","true","2026-02-09T11:05:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788472/1c150753-68af-43af-9b66-662b0eee1dd2","VERSION","oJNhduZxiP4MW.ZpE7iJAqfU.r9JpWit","true","2026-02-09T11:05:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788472/44114133-45bb-44c2-8bf7-64aefab22d68","VERSION","Xqk6Ko19ucBUkYe5mF6wARAgXXx6WmgB","true","2026-02-09T11:05:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788472/89e81e93-0a24-4c69-a036-cc9b16ea9181","VERSION","SFNxWSSGSOEw2XrWV7sAhwr6gp1POtly","true","2026-02-09T11:05:31+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788472/b548231c-2835-4e91-993b-12ab69871ca0","VERSION","F8veP3oGBVvrIUkAvnn930dvx9RYLtoQ","true","2026-02-09T11:05:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788480/49caceba-d0da-4967-a25e-f80f45772a56","VERSION","0B8Pn0Ob9ZMykTiJcHrMbrkyVxWm8Dyy","true","2026-02-09T11:05:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788480/525a5dbf-2f35-48c1-a879-50e6a61aea13","VERSION","FrdRf2eYun3dPRYx_LFK99rc1qvui7RC","true","2026-02-09T11:05:32+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788480/792e76b9-70fe-4ebb-a675-83d8002cbe2e","VERSION","Z7omakSMEFYKPcKmAsWaEjhybOGK.VWl","true","2026-02-09T11:05:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788480/b295a74d-4ea4-4770-9cfe-cb0a99fd9cb8","VERSION","3T2RYIJl015aP4DLniHs1PHLUSZM9VUd","true","2026-02-09T11:05:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788499/245f073d-6848-4a6b-b7c7-ad475875e3a4","VERSION","hvzUSti1WTaEsOWO7XzSEMKh4zgSDa8L","true","2026-02-09T11:05:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788499/45faacac-8796-4d52-950e-148042dd63db","VERSION","L1J8pTUmtcxpDGAL.p4npU4sMTH6dhpp","true","2026-02-09T11:05:32+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788499/a0243a75-4845-4eb6-bb5a-10b94c60b5f6","VERSION","lMjJ4HPfsnXQGDTQSvwOa.Fy.XVijE89","true","2026-02-09T11:05:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788499/d025684d-aee9-4e86-8ff5-d3ca126f2b6d","VERSION","rcUmFJjP4zq7uU.6Fulc7ZA_nIyfdO7w","true","2026-02-09T11:05:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788502/6d383160-b6ba-4d45-ae5e-9877ba916fe0","VERSION","jjZShzGmL6L7TXgmGkLThtrDkupcFMYb","true","2026-02-09T11:05:33+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788502/9019772a-3bac-4aeb-8db2-770cf7d1d7a8","VERSION","eifW0e6qI9RzUCkk5I9cMWzXPgmBWi8z","true","2026-02-09T11:05:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788502/911a1765-4bba-47b6-9b5f-b4201a67fe01","VERSION","lG2heZH6x3c97cNSyx_V1ylhUc6j8QuW","true","2026-02-09T11:05:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788502/e51b98da-70a3-4c75-92a7-c25bcfbf87cb","VERSION","_.WSetW4iM6FSCBZP7_9kZSdi4v33WoO","true","2026-02-09T11:05:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788510/958720bb-7c57-4930-b6bd-0290e8596b22","VERSION","2_eHTJRbjSNv6syoy0afq3koCO4.JYQ6","true","2026-02-09T11:05:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788510/a0e82c47-29c0-47e4-8dc4-65af8e41350c","VERSION","dNP5t2Zr8jB2vrJHuNeoNLE6AghN1sPu","true","2026-02-09T11:05:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788510/b48ade2b-7a9c-4df7-8798-997483a89973","VERSION","hGGoLgPtTqxPfnRG66cuwLqIs0NFmniV","true","2026-02-09T11:05:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788510/d38e7eec-0466-4453-a43b-6793aabb24fc","VERSION","2Uym0OI81VgZnY5XEDZNJaWlkVvX8CLm","true","2026-02-09T11:05:34+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788529/0a1effb4-54d0-4cb6-9119-d4d7247dee12","VERSION","EMsABpc.7dhwmbhL7DuLWKkEU7wlCgNq","true","2026-02-09T11:05:35+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788529/52cc12a8-15b5-4113-b2b4-41966ee7f3c3","VERSION","hVGUWPtb.0AIa2neT4Y0V37IKKVc082K","true","2026-02-09T11:05:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788529/6ee1f3fc-b2a3-4a64-81ac-b5ed06188435","VERSION","dRM_QuTnXxUvQKzattcBr6fxEh3jXslb","true","2026-02-09T11:05:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788529/a6664ed7-cad3-4d11-b5a3-b2116fdb7700","VERSION","VIVDmLeZLJLoK7RMMHX9Hyf1ikV8Oz46","true","2026-02-09T11:05:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788537/61040766-8883-478e-8f78-57680cb8aeaa","VERSION","4_hojs2NFmoBe10HbFXX0kOSS4PyCOp4","true","2026-02-09T11:05:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788537/7100a4ea-43f0-41ba-aae9-eea2f042896e","VERSION","OkTQPZ2zouqTpsRrib.mHZIftr8wAk0b","true","2026-02-09T11:05:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788537/b0acf380-2efa-4ae5-9592-8d4d1295195a","VERSION",".jVYVbLORd2OrJeuAUHR8pXfaVw_7uqA","true","2026-02-09T11:05:35+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788537/b1cb887f-5e59-471e-a3a0-1dfeeb2a7904","VERSION","HQE9DafO3PprGwzFRdPMvnriicPAlBAQ","true","2026-02-09T11:05:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788545/0af3f3f8-3230-44c7-b723-f6221b86ba81","VERSION","8RFAtyjlzD6aYYUElZbA.6cTGVQxN8fD","true","2026-02-09T11:05:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788545/1c8a8a21-e1f0-4086-99e9-9aa2e2429bd2","VERSION","Ou5w5zAe3WrZnGENt6LMvtT.E8UaoBVl","true","2026-02-09T11:05:36+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788545/d7d0264c-eecd-44cf-86a2-b44dbeabd420","VERSION","zfl7_Ada0H5TlBL0onyWPt9rkSif2zPB","true","2026-02-09T11:05:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788545/e4c39f9e-4e56-4563-849e-3c78342dc393","VERSION","mwenIn2TjVlU_sNCaUsLs3PKICvR9h2p","true","2026-02-09T11:05:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788553/5f75332c-64ee-4469-80ff-a5b8334236ee","VERSION","m7h1Xq4yAi0mZYOCL3wLXjYyTnWiEovN","true","2026-02-09T11:05:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788553/8faa65f0-6be3-427f-97d0-6b47d380d522","VERSION","yshGtdblgOUSveTW8tBZY9ZOE8BsJKXZ","true","2026-02-09T11:05:37+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788553/96d83730-1fc2-439d-ac5e-bf29f3a9a995","VERSION","DlMlqfWiiiiFfBJPZsYbJeEs0DbT9Gv5","true","2026-02-09T11:05:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788553/bdc45251-e1d9-45c3-99fa-f6eafa64fc11","VERSION","T5f2_Adi7XMD6erIlVSAK0yFCZOQG6BB","true","2026-02-09T11:05:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788561/28bfc062-49c9-4f89-b050-7c813465d86b","VERSION","29eYUtzZxW5b_gU5n9JUPVuxTWe18Sci","true","2026-02-09T11:05:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788561/3afdd181-2c98-4472-8c39-b41e3c02a338","VERSION","VPYmTbZxMw1pzAKIH18l274iCTI0liJO","true","2026-02-09T11:05:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788561/cebe1236-0043-4b5a-8f96-11bb0812fdd6","VERSION","zpifaKBnaRtWwqRgHKdkkH6HO4SNp.Xd","true","2026-02-09T11:05:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788561/f5d09480-44de-449f-8716-697485e6a5ea","VERSION","EYyEAGrK8NtUP.oqlp8LWln5IUfxXVRQ","true","2026-02-09T11:05:38+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788588/1df71e85-88d6-449a-8653-bc5d7caa17f7","VERSION","AX7i6c8VMWAtR2rfDdC4UGdGhPhRRG7S","true","2026-02-09T11:05:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788588/3f5cfa62-ddca-4993-a78b-6d11f3a7fa77","VERSION","uPgP1wwgGp4eDPWAZAWzk6DVeupdApGl","true","2026-02-09T11:05:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" +"p1058-lloyd-george-store","9730788588/569a91f4-e49b-4b28-9050-f621f382c46e","VERSION","_SKqO_TsW0aMQttCEm25DnQnSsIdwswn","true","2026-02-09T11:05:38+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" +"p1058-lloyd-george-store","9730788588/bfef3570-c159-4276-a0c4-8f71f2546dbb","VERSION","nwSrjayxX64urytGIc2XklViGdhu3i4T","true","2026-02-09T11:05:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" diff --git a/s3_inventory_versions_with_tags.sh b/s3_inventory_versions_with_tags.sh new file mode 100755 index 0000000000..54aae3c845 --- /dev/null +++ b/s3_inventory_versions_with_tags.sh @@ -0,0 +1,143 @@ +#!/usr/bin/env bash +set -euo pipefail + +REGION="${REGION:-eu-west-2}" +BUCKET="${BUCKET:-p1058-lloyd-george-store}" +PREFIX="${PREFIX:-}" # optional +OUT="${OUT:-s3_export.csv}" +PAGE_SIZE="${PAGE_SIZE:-1000}" # AWS max per page for versions +TAG_SCOPE="${TAG_SCOPE:-latest}" # latest | none | all (all is expensive) +PARALLEL="${PARALLEL:-8}" + +export REGION BUCKET TAG_SCOPE + +# CSV header +echo "bucket,key,entry_type,version_id,is_latest,last_modified,size,etag,storage_class,owner_id,tags" > "$OUT" + +# Convert TagSet json -> "k=v;k2=v2" (empty if none) +tags_to_string=' + if (.TagSet|length)==0 then "" else + (.TagSet | map("\(.Key)=\(.Value)") | join(";")) + end +' + +get_tags() { + local key="$1" + local version_id="$2" + + # If TAG_SCOPE=none, never call tagging API + if [[ "$TAG_SCOPE" == "none" ]]; then + echo "" + return + fi + + aws s3api get-object-tagging \ + --bucket "$BUCKET" \ + --key "$key" \ + --version-id "$version_id" \ + --region "$REGION" \ + --output json 2>/dev/null \ + | jq -r "$tags_to_string" || echo "" +} +export -f get_tags + +emit_version_rows() { + local json="$1" + + # VERSIONS + jq -c '.Versions[]? | { + bucket: $bucket, + key: .Key, + entry_type: "VERSION", + version_id: .VersionId, + is_latest: (.IsLatest|tostring), + last_modified: .LastModified, + size: (.Size // 0), + etag: (.ETag // ""), + storage_class: (.StorageClass // ""), + owner_id: (.Owner.ID // "") + }' --arg bucket "$BUCKET" <<<"$json" +} + +emit_delete_marker_rows() { + local json="$1" + + # DELETE MARKERS + jq -c '.DeleteMarkers[]? | { + bucket: $bucket, + key: .Key, + entry_type: "DELETE_MARKER", + version_id: .VersionId, + is_latest: (.IsLatest|tostring), + last_modified: .LastModified, + size: 0, + etag: "", + storage_class: "", + owner_id: (.Owner.ID // "") + }' --arg bucket "$BUCKET" <<<"$json" +} + +row_to_csv() { + jq -r '[ + .bucket, .key, .entry_type, .version_id, .is_latest, .last_modified, + (.size|tostring), .etag, .storage_class, .owner_id, (.tags // "") + ] | @csv' +} + +# Fetch a page via AWS CLI pagination token +TOKEN="" +while :; do + if [[ -n "$TOKEN" ]]; then + PAGE_JSON="$(aws s3api list-object-versions \ + --bucket "$BUCKET" \ + --prefix "$PREFIX" \ + --page-size "$PAGE_SIZE" \ + --starting-token "$TOKEN" \ + --region "$REGION" \ + --output json)" + else + PAGE_JSON="$(aws s3api list-object-versions \ + --bucket "$BUCKET" \ + --prefix "$PREFIX" \ + --page-size "$PAGE_SIZE" \ + --region "$REGION" \ + --output json)" + fi + + # Build rows (json lines) for versions + delete markers + { + emit_version_rows "$PAGE_JSON" + emit_delete_marker_rows "$PAGE_JSON" + } | while read -r row; do + # Add tags conditionally: + # - VERSION rows: tags depending on TAG_SCOPE + # - DELETE_MARKER rows: tags always empty + entry_type="$(jq -r '.entry_type' <<<"$row")" + + if [[ "$entry_type" == "VERSION" ]]; then + is_latest="$(jq -r '.is_latest' <<<"$row")" + key="$(jq -r '.key' <<<"$row")" + version_id="$(jq -r '.version_id' <<<"$row")" + + tags="" + if [[ "$TAG_SCOPE" == "all" ]]; then + tags="$(get_tags "$key" "$version_id")" + elif [[ "$TAG_SCOPE" == "latest" && "$is_latest" == "true" ]]; then + tags="$(get_tags "$key" "$version_id")" + fi + + jq -c --arg tags "$tags" '.tags=$tags' <<<"$row" | row_to_csv >> "$OUT" + else + jq -c '.tags=""' <<<"$row" | row_to_csv >> "$OUT" + fi + done + + # NextToken (AWS CLI pagination) + NEXT_TOKEN="$(jq -r '.NextToken // empty' <<<"$PAGE_JSON")" + if [[ -z "$NEXT_TOKEN" ]]; then + break + fi + TOKEN="$NEXT_TOKEN" +done + +echo "Wrote: $OUT" From c06d836b72bef40366fabcf7539f95eff702995d Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 10:06:28 +0000 Subject: [PATCH 37/43] chore: advance revert sequence (empty patch) From 427eea70d156c869d37181c3656c67011419df1c Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 10:14:01 +0000 Subject: [PATCH 38/43] [PRMP-939] Restore repository state to match commit 886fca311 --- .../base-lambdas-reusable-deploy-all.yml | 14 + .github/workflows/base-s3-data-collection.yml | 119 -- .github/workflows/full-deploy-to-pre-prod.yml | 11 - .github/workflows/full-deploy-to-prod.yml | 10 - .github/workflows/lambdas-dev-to-main-ci.yml | 17 - .../s3-data-collection-deploy-to-sandbox.yml | 58 - lambdas/ecs/s3_data_collection/Dockerfile | 19 - lambdas/ecs/s3_data_collection/__init__.py | 0 lambdas/ecs/s3_data_collection/main.py | 23 - lambdas/handlers/report_s3_content_handler.py | 22 + lambdas/services/base/s3_service.py | 1 + .../reporting/csv_report_generator_service.py | 7 +- .../reporting/report_s3_content_service.py | 24 +- .../test_report_s3_content_handler.py | 43 + .../unit/services/base/test_s3_service.py | 246 +--- .../test_csv_report_generator_service.py | 9 +- .../test_report_s3_content_service.py | 16 +- p1058-lloyd-george-store_versions.csv | 1029 ----------------- s3_inventory_versions_with_tags.sh | 143 --- 19 files changed, 140 insertions(+), 1671 deletions(-) delete mode 100644 .github/workflows/base-s3-data-collection.yml delete mode 100644 .github/workflows/s3-data-collection-deploy-to-sandbox.yml delete mode 100644 lambdas/ecs/s3_data_collection/Dockerfile delete mode 100644 lambdas/ecs/s3_data_collection/__init__.py delete mode 100644 lambdas/ecs/s3_data_collection/main.py create mode 100644 lambdas/handlers/report_s3_content_handler.py create mode 100644 lambdas/tests/unit/handlers/test_report_s3_content_handler.py delete mode 100644 p1058-lloyd-george-store_versions.csv delete mode 100755 s3_inventory_versions_with_tags.sh diff --git a/.github/workflows/base-lambdas-reusable-deploy-all.yml b/.github/workflows/base-lambdas-reusable-deploy-all.yml index 495c36fb46..7ae4922e09 100644 --- a/.github/workflows/base-lambdas-reusable-deploy-all.yml +++ b/.github/workflows/base-lambdas-reusable-deploy-all.yml @@ -838,3 +838,17 @@ jobs: lambda_layer_names: "core_lambda_layer" secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} + + deploy_report_s3_content_lambda: + name: Deploy Report S3 Content Lambda + uses: ./.github/workflows/base-lambdas-reusable-deploy.yml + with: + environment: ${{ inputs.environment }} + python_version: ${{ inputs.python_version }} + build_branch: ${{ inputs.build_branch }} + sandbox: ${{ inputs.sandbox }} + lambda_handler_name: report_s3_content_handler + lambda_aws_name: ReportS3Content + lambda_layer_names: "core_lambda_layer" + secrets: + AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} diff --git a/.github/workflows/base-s3-data-collection.yml b/.github/workflows/base-s3-data-collection.yml deleted file mode 100644 index 4d53e7e1c2..0000000000 --- a/.github/workflows/base-s3-data-collection.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: "Z-BASE Deploy S3 Data Collection: Build data collection image" - -run-name: "${{ github.event.inputs.build_branch }} | ${{ github.event.inputs.environment }} | ${{ github.event.inputs.sandbox }}" - -on: - workflow_call: - inputs: - build_branch: - required: true - type: string - environment: - required: true - type: string - sandbox: - required: true - type: string - secrets: - AWS_ASSUME_ROLE: - required: true - -permissions: - pull-requests: write - id-token: write - contents: read - -jobs: - s3_data_collection_build_docker_image: - runs-on: ubuntu-latest - environment: ${{ inputs.environment }} - defaults: - run: - working-directory: lambdas - - steps: - - uses: actions/checkout@v6 - with: - repository: "NHSDigital/national-document-repository" - ref: ${{ inputs.build_branch }} - fetch-depth: "0" - - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v5 - with: - role-to-assume: ${{ secrets.AWS_ASSUME_ROLE }} - role-skip-session-tagging: true - aws-region: ${{ vars.AWS_REGION }} - mask-aws-account-id: true - - - name: Login to Amazon ECR - id: login-ecr - uses: aws-actions/amazon-ecr-login@v2 - - - name: Build, tag, and push image to Amazon ECR - id: build-image - env: - ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }} - ECR_REPOSITORY: ${{ inputs.sandbox }}-s3-data-collection - IMAGE_TAG: latest - IMAGE_TAG_SHA: ${{ github.sha }} - run: | - set -euo pipefail - - docker build \ - -t "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" \ - -t "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" \ - -f ecs/s3_data_collection/Dockerfile \ - . - - docker push "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" - docker push "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" - - echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG_SHA" >> "$GITHUB_OUTPUT" - - - name: Download current task definition (raw) - id: download-task - run: | - set -euo pipefail - - aws ecs describe-task-definition \ - --task-definition "${{ inputs.sandbox }}-task-s3-data-collection" \ - --query taskDefinition \ - > task-definition-raw.json - - echo "revision=$(jq -r .revision task-definition-raw.json)" >> "$GITHUB_OUTPUT" - - - name: Render task definition with new image - id: task-def - uses: aws-actions/amazon-ecs-render-task-definition@v1 - with: - task-definition: lambdas/task-definition-raw.json - container-name: ${{ inputs.sandbox }}-container-s3-data-collection - image: ${{ steps.build-image.outputs.image }} - - - name: Sanitize task definition JSON for registration - run: | - set -euo pipefail - - jq 'del( - .taskDefinitionArn, - .revision, - .status, - .requiresAttributes, - .compatibilities, - .registeredAt, - .registeredBy - )' \ - "${{ steps.task-def.outputs.task-definition }}" \ - > task-definition.json - - - name: Register new ECS task definition revision - run: | - set -euo pipefail - aws ecs register-task-definition --cli-input-json file://task-definition.json - - - name: De-register previous revision (optional) - run: | - set -euo pipefail - aws ecs deregister-task-definition \ - --task-definition "${{ inputs.sandbox }}-task-s3-data-collection:${{ steps.download-task.outputs.revision }}" diff --git a/.github/workflows/full-deploy-to-pre-prod.yml b/.github/workflows/full-deploy-to-pre-prod.yml index ac6864ba62..de251f2c25 100644 --- a/.github/workflows/full-deploy-to-pre-prod.yml +++ b/.github/workflows/full-deploy-to-pre-prod.yml @@ -136,17 +136,6 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - deploy_s3_data_collection: - name: Deploy S3 Data Collection - needs: [ "tag_and_release" ] - uses: ./.github/workflows/base-s3-data-collection.yml - with: - build_branch: ${{ needs.tag_and_release.outputs.version }} - environment: pre-prod - sandbox: pre-prod - secrets: - AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - run_fhir_api_e2e_tests: name: Run FHIR API E2E Tests needs: ["deploy_all_lambdas"] diff --git a/.github/workflows/full-deploy-to-prod.yml b/.github/workflows/full-deploy-to-prod.yml index 2e4e91415b..b9dae923ee 100644 --- a/.github/workflows/full-deploy-to-prod.yml +++ b/.github/workflows/full-deploy-to-prod.yml @@ -75,13 +75,3 @@ jobs: sandbox: prod secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - - deploy_s3_data_collection: - name: Deploy S3 Data Collection - uses: ./.github/workflows/base-s3-data-collection.yml - with: - build_branch: ${{ inputs.tag_version }} - environment: prod - sandbox: prod - secrets: - AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} diff --git a/.github/workflows/lambdas-dev-to-main-ci.yml b/.github/workflows/lambdas-dev-to-main-ci.yml index f6be9cceca..f67055b175 100644 --- a/.github/workflows/lambdas-dev-to-main-ci.yml +++ b/.github/workflows/lambdas-dev-to-main-ci.yml @@ -80,18 +80,6 @@ jobs: secrets: AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - deploy_s3_data_collection: - name: Deploy S3 Data Collection - needs: [ "run_tests" ] - uses: ./.github/workflows/base-s3-data-collection.yml - if: github.ref == 'refs/heads/main' - with: - build_branch: ${{ github.event.pull_request.head.ref }} - environment: development - sandbox: ndr-dev - secrets: - AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} - notify-slack: name: Notify Slack on Failure runs-on: ubuntu-latest @@ -103,7 +91,6 @@ jobs: publish_all_lambda_layers, deploy_all_lambdas, deploy_data_collection, - deploy_s3_data_collection, ] if: failure() && github.event_name == 'push' && github.ref == 'refs/heads/main' steps: @@ -173,10 +160,6 @@ jobs: { "type": "mrkdwn", "text": "*deploy_data_collection:* ${{ needs.deploy_data_collection.result == 'success' && ':white_check_mark:' || ':x:' }}" - }, - { - "type": "mrkdwn", - "text": "*deploy_s3_data_collection:* ${{ needs.deploy_s3_data_collection.result == 'success' && ':white_check_mark:' || ':x:' }}" } ] }, diff --git a/.github/workflows/s3-data-collection-deploy-to-sandbox.yml b/.github/workflows/s3-data-collection-deploy-to-sandbox.yml deleted file mode 100644 index 05f9508411..0000000000 --- a/.github/workflows/s3-data-collection-deploy-to-sandbox.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: "SANDBOX S3 Data Collection - Publish Data Collection Image to ECR" - -run-name: "${{ github.event.inputs.build_branch }} | ${{ github.event.inputs.sandbox }} | ${{ github.event.inputs.environment }}" - -on: - workflow_dispatch: - inputs: - build_branch: - description: "Feature branch to push." - required: true - type: string - default: "main" - sandbox: - description: "Which Sandbox to push to." - required: true - type: string - default: "ndr" - environment: - description: "Which Environment settings to use." - required: true - type: string - default: "development" - workflow_call: - inputs: - build_branch: - description: "Feature branch to push." - required: true - type: string - default: "main" - sandbox: - description: "Which Sandbox to push to." - required: true - type: string - default: "ndr" - environment: - description: "Which Environment settings to use." - required: true - type: string - default: "development" - secrets: - AWS_ASSUME_ROLE: - required: true - -permissions: - pull-requests: write - id-token: write # This is required for requesting the JWT - contents: read # This is required for actions/checkout - -jobs: - push_image: - name: Push Image - uses: ./.github/workflows/base-s3-data-collection.yml - with: - build_branch: ${{ inputs.build_branch }} - environment: ${{ inputs.environment }} - sandbox: ${{ inputs.sandbox }} - secrets: - AWS_ASSUME_ROLE: ${{ secrets.AWS_ASSUME_ROLE }} diff --git a/lambdas/ecs/s3_data_collection/Dockerfile b/lambdas/ecs/s3_data_collection/Dockerfile deleted file mode 100644 index 346165068b..0000000000 --- a/lambdas/ecs/s3_data_collection/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM python:3.11 - -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONUNBUFFERED=1 -ENV PYTHONPATH=/lambdas - -WORKDIR /lambdas -COPY requirements /lambdas/requirements - -RUN pip install -r requirements/layers/requirements_core_lambda_layer.txt -RUN pip install -r requirements/layers/requirements_data_lambda_layer.txt - -COPY ecs/ /lambdas/ecs/ -COPY handlers/ /lambdas/handlers/ -COPY services/ /lambdas/services/ -COPY repositories/ /lambdas/repositories/ -COPY utils/ /lambdas/utils/ - -ENTRYPOINT ["python", "ecs/s3_data_collection/main.py"] diff --git a/lambdas/ecs/s3_data_collection/__init__.py b/lambdas/ecs/s3_data_collection/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lambdas/ecs/s3_data_collection/main.py b/lambdas/ecs/s3_data_collection/main.py deleted file mode 100644 index 14ae36f82e..0000000000 --- a/lambdas/ecs/s3_data_collection/main.py +++ /dev/null @@ -1,23 +0,0 @@ -import importlib -import logging -import sys - -from services.reporting.report_s3_content_service import ReportS3ContentService - - -def setup_logging_for_local_script(): - importlib.reload(logging) - logging.basicConfig( - level=logging.INFO, - format="[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s", - datefmt="%d/%b/%Y %H:%M:%S", - stream=sys.stdout, - ) - - -if __name__ == "__main__": - setup_logging_for_local_script() - logging.getLogger(__name__).info("Starting Report S3 content ECS task") - - service = ReportS3ContentService() - service.process_s3_content() diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py new file mode 100644 index 0000000000..70de3ffbc9 --- /dev/null +++ b/lambdas/handlers/report_s3_content_handler.py @@ -0,0 +1,22 @@ +from services.reporting.report_s3_content_service import ReportS3ContentService +from utils.audit_logging_setup import LoggingService +from utils.decorators.ensure_env_var import ensure_environment_variables +from utils.decorators.handle_lambda_exceptions import handle_lambda_exceptions +from utils.decorators.override_error_check import override_error_check +from utils.decorators.set_audit_arg import set_request_context_for_logging + +logger = LoggingService(__name__) + +@ensure_environment_variables(names=["LLOYD_GEORGE_BUCKET_NAME"]) +@ensure_environment_variables(names=["BULK_STAGING_BUCKET_NAME"]) +@ensure_environment_variables(names=["STATISTICAL_REPORTS_BUCKET"]) +@override_error_check +@handle_lambda_exceptions +@set_request_context_for_logging +def lambda_handler(event, context): + logger.info("Report S3 content lambda invoked") + + service = ReportS3ContentService() + + service.process_s3_content( + ) diff --git a/lambdas/services/base/s3_service.py b/lambdas/services/base/s3_service.py index aea283c6aa..4a9bdb0a3d 100644 --- a/lambdas/services/base/s3_service.py +++ b/lambdas/services/base/s3_service.py @@ -275,3 +275,4 @@ def get_object_tags_versioned(self, bucket: str, key: str, version_id: str | Non return response.get("TagSet", []) except ClientError: return [] + diff --git a/lambdas/services/reporting/csv_report_generator_service.py b/lambdas/services/reporting/csv_report_generator_service.py index dfb00e6ac4..683ede526e 100644 --- a/lambdas/services/reporting/csv_report_generator_service.py +++ b/lambdas/services/reporting/csv_report_generator_service.py @@ -1,6 +1,5 @@ import csv from io import StringIO - from utils.audit_logging_setup import LoggingService logger = LoggingService(__name__) @@ -25,7 +24,7 @@ def generate_s3_inventory_csv(self, bucket, versions, delete_markers) -> str: "etag", "storage_class", "tags", - ], + ] ) for version in versions: @@ -44,7 +43,7 @@ def generate_s3_inventory_csv(self, bucket, versions, delete_markers) -> str: version.get("ETag"), version.get("StorageClass"), tag_str, - ], + ] ) for marker in delete_markers: @@ -60,7 +59,7 @@ def generate_s3_inventory_csv(self, bucket, versions, delete_markers) -> str: None, None, "", - ], + ] ) logger.info(f"Finished CSV generation for {bucket}") diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index b5c7c94d1e..a5d01b0eba 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -11,31 +11,33 @@ class ReportS3ContentService: def __init__(self): + self.lloyd_george_bucket = os.getenv("LLOYD_GEORGE_BUCKET_NAME") self.bulk_staging_store = os.getenv("BULK_STAGING_BUCKET_NAME") self.statistic_reports_bucket = os.getenv("STATISTICAL_REPORTS_BUCKET") self.s3_service = S3Service() self.csv_generator = CsvReportGenerator() - self.max_objects = 4500000 # To avoid prod from melting + self.max_objects = 4500000 #To avoid prod from melting def _fetch_tags(self, bucket, version): tags = self.s3_service.get_object_tags_versioned( - bucket, - version["Key"], - version["VersionId"], + bucket, version["Key"], version["VersionId"] ) version["Tags"] = tags return version def process_s3_content(self): - for bucket in [self.bulk_staging_store]: + for bucket in [self.lloyd_george_bucket, self.bulk_staging_store]: logger.info(f"Listing versions for bucket {bucket}") - versions, delete_markers = self.s3_service.list_all_object_versions(bucket) + # versions, delete_markers = self.s3_service.list_all_object_versions(bucket) + versions = self.s3_service.list_all_objects(bucket) delete_markers = [] if len(versions) > self.max_objects: - logger.warning( - f"Limiting versions from {len(versions)} to {self.max_objects}", - ) + logger.warning(f"Limiting versions from {len(versions)} to {self.max_objects}") versions = versions[: self.max_objects] + # versions = [ + # v for v in versions + # if v["IsLatest"] + # ] logger.info(f"Fetching tags in parallel for {len(versions)} versions") with ThreadPoolExecutor(max_workers=20) as executor: @@ -47,9 +49,7 @@ def process_s3_content(self): logger.info(f"Generating CSV for bucket {bucket}") csv_content = self.csv_generator.generate_s3_inventory_csv( - bucket, - versions, - delete_markers, + bucket, versions, delete_markers ) logger.info(f"Uploading report for bucket {bucket}") diff --git a/lambdas/tests/unit/handlers/test_report_s3_content_handler.py b/lambdas/tests/unit/handlers/test_report_s3_content_handler.py new file mode 100644 index 0000000000..75976cb2f4 --- /dev/null +++ b/lambdas/tests/unit/handlers/test_report_s3_content_handler.py @@ -0,0 +1,43 @@ +import pytest +from types import SimpleNamespace +from lambdas.handlers.report_s3_content_handler import lambda_handler + + +@pytest.fixture(autouse=True) +def patch_env_vars(monkeypatch): + env_vars = { + "LLOYD_GEORGE_BUCKET_NAME": "bucket-a", + "STATISTICAL_REPORTS_BUCKET": "bucket-b", + "BULK_STAGING_BUCKET_NAME": "bucket-c", + } + for key, value in env_vars.items(): + monkeypatch.setenv(key, value) + + +@pytest.fixture +def lambda_context(): + return SimpleNamespace(aws_request_id="test-request-id") + + +def test_lambda_handler_invokes_service(mocker, lambda_context): + mock_service_cls = mocker.patch( + "lambdas.handlers.report_s3_content_handler.ReportS3ContentService" + ) + mock_service = mock_service_cls.return_value + + lambda_handler({}, lambda_context) + + mock_service_cls.assert_called_once() + mock_service.process_s3_content.assert_called_once() + + +def test_lambda_handler_runs_without_event_data(mocker, lambda_context): + mock_service_cls = mocker.patch( + "lambdas.handlers.report_s3_content_handler.ReportS3ContentService" + ) + mock_service = mock_service_cls.return_value + + lambda_handler({}, lambda_context) + + mock_service_cls.assert_called_once() + mock_service.process_s3_content.assert_called_once() diff --git a/lambdas/tests/unit/services/base/test_s3_service.py b/lambdas/tests/unit/services/base/test_s3_service.py index 8751299644..b9e9aa2cb0 100755 --- a/lambdas/tests/unit/services/base/test_s3_service.py +++ b/lambdas/tests/unit/services/base/test_s3_service.py @@ -41,7 +41,7 @@ def mock_service(mocker, set_env): mocker.patch("services.base.iam_service.IAMService") service = S3Service(custom_aws_role="mock_arn_custom_role") service.expiration_time = datetime.datetime.now( - datetime.timezone.utc, + datetime.timezone.utc ) + datetime.timedelta(hours=1) yield service S3Service._instance = None @@ -99,9 +99,7 @@ def test_download_file(mock_service, mock_client): mock_service.download_file(MOCK_BUCKET, TEST_FILE_KEY, TEST_DOWNLOAD_PATH) mock_client.download_file.assert_called_once_with( - MOCK_BUCKET, - TEST_FILE_KEY, - TEST_DOWNLOAD_PATH, + MOCK_BUCKET, TEST_FILE_KEY, TEST_DOWNLOAD_PATH ) @@ -109,9 +107,7 @@ def test_upload_file(mock_service, mock_client): mock_service.upload_file(TEST_FILE_NAME, MOCK_BUCKET, TEST_FILE_KEY) mock_client.upload_file.assert_called_with( - TEST_FILE_NAME, - MOCK_BUCKET, - TEST_FILE_KEY, + TEST_FILE_NAME, MOCK_BUCKET, TEST_FILE_KEY ) @@ -119,17 +115,11 @@ def test_upload_file_with_extra_args(mock_service, mock_client): test_extra_args = {"mock_tag": 123, "apple": "red", "banana": "true"} mock_service.upload_file_with_extra_args( - TEST_FILE_NAME, - MOCK_BUCKET, - TEST_FILE_KEY, - test_extra_args, + TEST_FILE_NAME, MOCK_BUCKET, TEST_FILE_KEY, test_extra_args ) mock_client.upload_file.assert_called_with( - TEST_FILE_NAME, - MOCK_BUCKET, - TEST_FILE_KEY, - test_extra_args, + TEST_FILE_NAME, MOCK_BUCKET, TEST_FILE_KEY, test_extra_args ) @@ -171,8 +161,7 @@ def test_delete_object(mock_service, mock_client): mock_service.delete_object(s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME) mock_client.delete_object_assert_called_once_with( - Bucket=MOCK_BUCKET, - Key=TEST_FILE_NAME, + Bucket=MOCK_BUCKET, Key=TEST_FILE_NAME ) @@ -209,9 +198,7 @@ def test_get_tag_value(mock_service, mock_client): mock_client.get_object_tagging.return_value = mock_response actual = mock_service.get_tag_value( - s3_bucket_name=MOCK_BUCKET, - file_key=TEST_FILE_NAME, - tag_key=test_tag_key, + s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME, tag_key=test_tag_key ) expected = test_tag_value assert actual == expected @@ -223,8 +210,7 @@ def test_get_tag_value(mock_service, mock_client): def test_get_tag_value_raises_error_when_specified_tag_is_missing( - mock_service, - mock_client, + mock_service, mock_client ): test_tag_key = "tag_key" @@ -239,9 +225,7 @@ def test_get_tag_value_raises_error_when_specified_tag_is_missing( with pytest.raises(TagNotFoundException): mock_service.get_tag_value( - s3_bucket_name=MOCK_BUCKET, - file_key=TEST_FILE_NAME, - tag_key=test_tag_key, + s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME, tag_key=test_tag_key ) @@ -263,8 +247,7 @@ def test_file_exist_on_s3_return_true_if_object_exists(mock_service, mock_client expected = True actual = mock_service.file_exist_on_s3( - s3_bucket_name=MOCK_BUCKET, - file_key=TEST_FILE_NAME, + s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME ) assert actual == expected @@ -275,8 +258,7 @@ def test_file_exist_on_s3_return_true_if_object_exists(mock_service, mock_client def test_file_exist_on_s3_return_false_if_object_does_not_exist( - mock_service, - mock_client, + mock_service, mock_client ): mock_error = ClientError( {"Error": {"Code": "403", "Message": "Forbidden"}}, @@ -287,8 +269,7 @@ def test_file_exist_on_s3_return_false_if_object_does_not_exist( expected = False actual = mock_service.file_exist_on_s3( - s3_bucket_name=MOCK_BUCKET, - file_key=TEST_FILE_NAME, + s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME ) assert actual == expected @@ -300,8 +281,7 @@ def test_file_exist_on_s3_return_false_if_object_does_not_exist( def test_file_exist_on_s3_raises_client_error_if_unexpected_response( - mock_service, - mock_client, + mock_service, mock_client ): mock_error = ClientError( {"Error": {"Code": "500", "Message": "Internal Server Error"}}, @@ -312,8 +292,7 @@ def test_file_exist_on_s3_raises_client_error_if_unexpected_response( with pytest.raises(ClientError): mock_service.file_exist_on_s3( - s3_bucket_name=MOCK_BUCKET, - file_key=TEST_FILE_NAME, + s3_bucket_name=MOCK_BUCKET, file_key=TEST_FILE_NAME ) mock_client.head_object.assert_called_with( @@ -357,8 +336,7 @@ def test_created_custom_client_when_client_role_is_passed(mocker): mocker.patch("boto3.client") iam_service_instance = mocker.MagicMock() iam_service = mocker.patch( - "services.base.s3_service.IAMService", - return_value=iam_service_instance, + "services.base.s3_service.IAMService", return_value=iam_service_instance ) mock_expiration_time = datetime.datetime.now(datetime.timezone.utc) custom_client_mock = mocker.MagicMock() @@ -375,9 +353,7 @@ def test_created_custom_client_when_client_role_is_passed(mocker): def test_list_all_objects_return_a_list_of_file_details( - mock_service, - mock_client, - mock_list_objects_paginate, + mock_service, mock_client, mock_list_objects_paginate ): mock_list_objects_paginate.return_value = [MOCK_LIST_OBJECTS_RESPONSE] expected = MOCK_LIST_OBJECTS_RESPONSE["Contents"] @@ -391,14 +367,12 @@ def test_list_all_objects_return_a_list_of_file_details( def test_list_all_objects_handles_paginated_responses( - mock_service, - mock_client, - mock_list_objects_paginate, + mock_service, mock_client, mock_list_objects_paginate ): mock_list_objects_paginate.return_value = MOCK_LIST_OBJECTS_PAGINATED_RESPONSES expected = flatten( - [page["Contents"] for page in MOCK_LIST_OBJECTS_PAGINATED_RESPONSES], + [page["Contents"] for page in MOCK_LIST_OBJECTS_PAGINATED_RESPONSES] ) actual = mock_service.list_all_objects(MOCK_BUCKET) @@ -407,9 +381,7 @@ def test_list_all_objects_handles_paginated_responses( def test_list_all_objects_raises_client_error_if_unexpected_response( - mock_service, - mock_client, - mock_list_objects_paginate, + mock_service, mock_client, mock_list_objects_paginate ): mock_error = ClientError( {"Error": {"Code": "500", "Message": "Internal Server Error"}}, @@ -441,8 +413,7 @@ def test_file_size_return_int(mock_service, mock_client): expected = "3191" actual = mock_service.get_file_size( - s3_bucket_name=MOCK_BUCKET, - object_key=TEST_FILE_NAME, + s3_bucket_name=MOCK_BUCKET, object_key=TEST_FILE_NAME ) assert actual == expected @@ -465,12 +436,10 @@ def test_save_or_create_file(mock_service, mock_client): def test_returns_binary_file_content_when_file_exists( - mock_service, - mock_client, - mocker, + mock_service, mock_client, mocker ): mock_client.get_object.return_value = { - "Body": mocker.Mock(read=lambda: b"file-content"), + "Body": mocker.Mock(read=lambda: b"file-content") } @@ -486,10 +455,7 @@ def test_upload_file_obj_success(mock_service, mock_client): extra_args = {"ContentType": "application/pdf"} mock_service.upload_file_obj( - file_obj, - MOCK_BUCKET, - TEST_FILE_KEY, - extra_args=extra_args, + file_obj, MOCK_BUCKET, TEST_FILE_KEY, extra_args=extra_args ) mock_client.upload_fileobj.assert_called_once_with( @@ -504,8 +470,7 @@ def test_upload_file_obj_raises_client_error(mock_service, mock_client): file_obj = BytesIO(b"sample file content") mock_client.upload_fileobj.side_effect = ClientError( - {"Error": {"Code": "403", "Message": "Forbidden"}}, - "UploadFileObj", + {"Error": {"Code": "403", "Message": "Forbidden"}}, "UploadFileObj" ) with pytest.raises(ClientError): @@ -527,8 +492,7 @@ def test_get_object_stream_returns_body_stream(mock_service, mock_client, mocker assert result == mock_stream mock_client.get_object.assert_called_once_with( - Bucket=MOCK_BUCKET, - Key=TEST_FILE_KEY, + Bucket=MOCK_BUCKET, Key=TEST_FILE_KEY ) @@ -566,18 +530,15 @@ def test_get_head_object_returns_metadata(mock_service, mock_client): assert result == mock_response mock_client.head_object.assert_called_once_with( - Bucket=MOCK_BUCKET, - Key=TEST_FILE_KEY, + Bucket=MOCK_BUCKET, Key=TEST_FILE_KEY ) def test_get_head_object_raises_client_error_when_object_not_found( - mock_service, - mock_client, + mock_service, mock_client ): mock_error = ClientError( - {"Error": {"Code": "404", "Message": "Not Found"}}, - "HeadObject", + {"Error": {"Code": "404", "Message": "Not Found"}}, "HeadObject" ) mock_client.head_object.side_effect = mock_error @@ -585,18 +546,15 @@ def test_get_head_object_raises_client_error_when_object_not_found( mock_service.get_head_object(bucket=MOCK_BUCKET, key=TEST_FILE_KEY) mock_client.head_object.assert_called_once_with( - Bucket=MOCK_BUCKET, - Key=TEST_FILE_KEY, + Bucket=MOCK_BUCKET, Key=TEST_FILE_KEY ) def test_get_head_object_raises_client_error_on_access_denied( - mock_service, - mock_client, + mock_service, mock_client ): mock_error = ClientError( - {"Error": {"Code": "403", "Message": "Forbidden"}}, - "HeadObject", + {"Error": {"Code": "403", "Message": "Forbidden"}}, "HeadObject" ) mock_client.head_object.side_effect = mock_error @@ -604,8 +562,7 @@ def test_get_head_object_raises_client_error_on_access_denied( mock_service.get_head_object(bucket=MOCK_BUCKET, key=TEST_FILE_KEY) mock_client.head_object.assert_called_once_with( - Bucket=MOCK_BUCKET, - Key=TEST_FILE_KEY, + Bucket=MOCK_BUCKET, Key=TEST_FILE_KEY ) @@ -640,142 +597,3 @@ def test_copy_across_bucket_retries_on_409_conflict(mock_service, mock_client): "StorageClass": "INTELLIGENT_TIERING", } mock_client.copy_object.assert_called_with(**expected_call) - - -def test_list_all_object_versions_returns_versions_and_delete_markers( - mock_service, - mock_client, -): - paginator = mock_client.get_paginator.return_value - - page_1 = { - "Versions": [ - {"Key": "a.txt", "VersionId": "v1"}, - {"Key": "a.txt", "VersionId": "v2"}, - ], - "DeleteMarkers": [ - {"Key": "b.txt", "VersionId": "d1"}, - ], - } - page_2 = { - "Versions": [ - {"Key": "c.txt", "VersionId": "v3"}, - ], - "DeleteMarkers": [], - } - - paginator.paginate.return_value = [page_1, page_2] - - versions, delete_markers = mock_service.list_all_object_versions(MOCK_BUCKET) - - assert versions == page_1["Versions"] + page_2["Versions"] - assert delete_markers == page_1["DeleteMarkers"] + page_2["DeleteMarkers"] - - mock_client.get_paginator.assert_called_once_with("list_object_versions") - paginator.paginate.assert_called_once_with(Bucket=MOCK_BUCKET) - - -def test_list_all_object_versions_handles_missing_keys_as_empty_lists( - mock_service, - mock_client, -): - paginator = mock_client.get_paginator.return_value - paginator.paginate.return_value = [ - {}, - {"Versions": [{"Key": "a.txt", "VersionId": "v1"}]}, - {"DeleteMarkers": [{"Key": "b.txt", "VersionId": "d1"}]}, - ] - - versions, delete_markers = mock_service.list_all_object_versions(MOCK_BUCKET) - - assert versions == [{"Key": "a.txt", "VersionId": "v1"}] - assert delete_markers == [{"Key": "b.txt", "VersionId": "d1"}] - - mock_client.get_paginator.assert_called_once_with("list_object_versions") - paginator.paginate.assert_called_once_with(Bucket=MOCK_BUCKET) - - -def test_get_object_tags_versioned_with_version_id_calls_get_object_tagging_with_version( - mock_service, - mock_client, -): - mock_client.get_object_tagging.return_value = { - "TagSet": [{"Key": "k", "Value": "v"}], - } - - result = mock_service.get_object_tags_versioned( - bucket=MOCK_BUCKET, - key=TEST_FILE_KEY, - version_id="ver-123", - ) - - assert result == [{"Key": "k", "Value": "v"}] - mock_client.get_object_tagging.assert_called_once_with( - Bucket=MOCK_BUCKET, - Key=TEST_FILE_KEY, - VersionId="ver-123", - ) - - -def test_get_object_tags_versioned_without_version_id_calls_get_object_tagging_without_version( - mock_service, - mock_client, -): - mock_client.get_object_tagging.return_value = { - "TagSet": [{"Key": "k2", "Value": "v2"}], - } - - result = mock_service.get_object_tags_versioned( - bucket=MOCK_BUCKET, - key=TEST_FILE_KEY, - version_id=None, - ) - - assert result == [{"Key": "k2", "Value": "v2"}] - mock_client.get_object_tagging.assert_called_once_with( - Bucket=MOCK_BUCKET, - Key=TEST_FILE_KEY, - ) - - -def test_get_object_tags_versioned_returns_empty_list_on_client_error( - mock_service, - mock_client, -): - mock_client.get_object_tagging.side_effect = ClientError( - {"Error": {"Code": "403", "Message": "Forbidden"}}, - "GetObjectTagging", - ) - - result = mock_service.get_object_tags_versioned( - bucket=MOCK_BUCKET, - key=TEST_FILE_KEY, - version_id="ver-123", - ) - - assert result == [] - mock_client.get_object_tagging.assert_called_once_with( - Bucket=MOCK_BUCKET, - Key=TEST_FILE_KEY, - VersionId="ver-123", - ) - - -def test_get_object_tags_versioned_returns_empty_list_when_tagset_missing( - mock_service, - mock_client, -): - mock_client.get_object_tagging.return_value = {} - - result = mock_service.get_object_tags_versioned( - bucket=MOCK_BUCKET, - key=TEST_FILE_KEY, - version_id="ver-123", - ) - - assert result == [] - mock_client.get_object_tagging.assert_called_once_with( - Bucket=MOCK_BUCKET, - Key=TEST_FILE_KEY, - VersionId="ver-123", - ) diff --git a/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py b/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py index 2e5034f414..fba9fd9cf3 100644 --- a/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py +++ b/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py @@ -1,5 +1,4 @@ from datetime import datetime, timezone - from services.reporting.csv_report_generator_service import CsvReportGenerator @@ -16,16 +15,12 @@ def test_generate_s3_inventory_csv(): "ETag": "etag1", "StorageClass": "STANDARD", "Tags": [{"Key": "autodelete", "Value": "true"}], - }, + } ] delete_markers = [] - csv_output = generator.generate_s3_inventory_csv( - "bucket-a", - versions, - delete_markers, - ) + csv_output = generator.generate_s3_inventory_csv("bucket-a", versions, delete_markers) assert "bucket-a" in csv_output assert "file1.txt" in csv_output diff --git a/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py b/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py index 7ceb59751e..5c8c8354f3 100644 --- a/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py +++ b/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py @@ -1,8 +1,10 @@ +from unittest.mock import MagicMock from services.reporting.report_s3_content_service import ReportS3ContentService -def test_process_s3_content_uploads_single_bucket_report(mocker): +def test_process_s3_content(mocker): service = ReportS3ContentService() + service.lloyd_george_bucket = "bucket-a" service.bulk_staging_store = "bucket-b" service.statistic_reports_bucket = "reports-bucket" service.s3_service = mocker.Mock() @@ -14,15 +16,19 @@ def test_process_s3_content_uploads_single_bucket_report(mocker): "VersionId": "v1", "IsLatest": True, "LastModified": mocker.Mock(), - }, + } ] + fake_delete_markers = [] - service.s3_service.list_all_object_versions.return_value = (fake_versions, []) + service.s3_service.list_all_object_versions.return_value = ( + fake_versions, + fake_delete_markers, + ) service.s3_service.get_object_tags_versioned.return_value = [ - {"Key": "autodelete", "Value": "true"}, + {"Key": "autodelete", "Value": "true"} ] service.csv_generator.generate_s3_inventory_csv.return_value = "csv-data" service.process_s3_content() - service.s3_service.upload_file_obj.assert_called_once() + assert service.s3_service.upload_file_obj.call_count == 2 diff --git a/p1058-lloyd-george-store_versions.csv b/p1058-lloyd-george-store_versions.csv deleted file mode 100644 index 104dfe12b3..0000000000 --- a/p1058-lloyd-george-store_versions.csv +++ /dev/null @@ -1,1029 +0,0 @@ -bucket,key,entry_type,version_id,is_latest,last_modified,size,etag,storage_class,owner_id,tags -"p1058-lloyd-george-store","9449303304/02ae7821-1707-443f-8c5b-0fda3ae4f4ff","VERSION","7tN4NBIiSWkBjc3eIaVEMKT3QDozDhNv","true","2026-02-09T11:05:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449303304/2bf97e4a-e1d7-42f7-ab96-e4a22fe9f292","VERSION","L4bnWJmYgyKJw.9JMs53lvDNPih7F0le","true","2026-02-09T11:05:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9449303304/39375a3c-fd92-4faf-8d49-da71c9e03a29","VERSION","WQZ_DDNezYvyHbl.Ur_peg1ZeKLVMFQW","true","2026-02-09T11:05:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449303304/f27bc118-7095-46c5-b150-cb115c47e3d6","VERSION","lCxsKOk17BHZbXLk61AO.MlRDIgfblqI","true","2026-02-09T11:05:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449303371/03e0f437-27e0-4baa-b689-b00eee16e584","VERSION","obVxk5DAVa9MzOM44mGIfAd7Pv9b5Ta.","true","2026-02-09T11:05:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449303371/3dc5d32a-1bb1-400a-bb73-00b1078397c2","VERSION",".XM6I99xvAUN8RRSGMF9W5QtXMfKYgJB","true","2026-02-09T11:05:42+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9449303371/88202a9c-3197-414d-88e4-d8e797dd5a5d","VERSION","Re2fcv8SWhUrB.Hy_K2hIGxDkteKe2l2","true","2026-02-09T11:05:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449303371/a94ba724-d4de-420f-ab5e-489ae2a29a42","VERSION","VUXIIzBT9ipkZvoGT6LzB.OyVZ6ERAZj","true","2026-02-09T11:05:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449310033/8be31fa8-d907-46d3-8936-9eb5b4ee89a9","VERSION","yNJvcEDWG7ZscfPKyESUMkwHtQI6bnb5","true","2026-02-09T11:05:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449310033/bc6e56e9-1275-4437-b24a-34618d99ae1f","VERSION","0uDRxVgYqWqRg.8TiBkzaTpV63TjTb96","true","2026-02-09T11:05:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449310033/cf32d5dd-e96d-4b36-a69d-db4a0146bff9","VERSION","nZh.sMH.bXRFKoqTBzoLhqTFyZ3h2dr4","true","2026-02-09T11:05:45+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9449310033/f4d40487-d171-427c-a0f3-3e393593256d","VERSION","NEabeByFA1QT5Mvol4RbAhCFPzSoWkVB","true","2026-02-09T11:05:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449310610/0987b3bb-c74d-4ce1-8b4d-e63bd363df82","VERSION","ESRIa_gHQYniIjHYkKcbE.HmWYGdnHZs","true","2026-02-09T11:05:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449310610/6dc9d52c-9f4a-4c95-a350-859f6fc520f6","VERSION","oX_KGX9_pJ.trZm.xVPn_oWi.myjYKK_","true","2026-02-09T11:05:46+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9449310610/94ac97b2-fdab-4926-b67a-176178f5a6cb","VERSION","vU5M.mEK1TF4gEUMZegNdG.gpY2gF2wf","true","2026-02-09T11:05:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449310610/9edac6c9-d637-4994-a19f-b92d58ec8124","VERSION","xbwQFIPBTYsXXcVN_6RjBcLxj2.X9xyU","true","2026-02-09T11:05:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449310688/35c80345-428a-4def-a444-a7ad17e18ea7","VERSION","0DUw.vTnU1fsloQ3jBqk5t7J.PRfiFFh","true","2026-02-09T11:05:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449310688/3a3bba00-853d-43fc-90b4-64c0b72a6a14","VERSION","VWo5bxSIji6ouRxsZnIEpWzbOyGEojss","true","2026-02-09T11:05:44+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9449310688/ccc89d47-56fe-48a7-b5ac-f39b9ff72f2d","VERSION","5Yh82z7PfPbJ19sEc6jyHo2Oswb568sp","true","2026-02-09T11:05:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9449310688/e7772bd7-3520-4722-8351-7c33248996ee","VERSION","h9TPwA6U.uqx__vVS0VBmz2ohVvvlvWL","true","2026-02-09T11:05:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9729782814/0d29d55b-213f-4f9f-9e5d-2b0081488beb","VERSION","DkkiLwufOQjotn7mr7m16C2JZqlW8hDA","true","2026-02-09T11:05:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9729782814/55ec1b01-7f75-4e4d-8dcb-61f7848a49ea","VERSION","CZQ0MDELRGIqBJgsUU9L9YttcamR6hyY","true","2026-02-09T11:05:43+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9729782814/bf177406-5e05-49cb-823e-88d7e245ebb5","VERSION","Ky02RTCYDb6QqIo.7MW.QzlWBvm7Z0Fy","true","2026-02-09T11:05:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9729782814/f709819f-7c1e-4890-8c66-3679c0d6aca3","VERSION","7vL4ZEKC4iUXWuIQ6r.6rOVB66AJWCs5","true","2026-02-09T11:05:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9729782822/91742d43-6850-4175-bad4-f886c74267fb","VERSION","RxH5MhG1oClDhM8GbBRa3okPrpp8U7tH","true","2026-02-09T11:05:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9729782822/a0f5289f-cba5-415b-97e2-dedb8e21aad8","VERSION","0bgcixOxt2F8eOsG1s6dSVCfQY3wtQ0V","true","2026-02-09T11:05:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9729782822/de53a27c-26e9-471e-ae9d-027031b0aade","VERSION","tj7stde4OWbozY2jD6LcW4NzoK0iWGdL","true","2026-02-09T11:05:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9729782822/f8d5d271-00ab-44b9-8a1c-e134e5d44a05","VERSION","QeqCVUzo3gmG6usxogwHhyPimbPd2OqU","true","2026-02-09T11:05:43+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153817/1ba96aea-b30e-4c9d-bfb4-243ec86c487f","VERSION","myArFwLgChaWGJ07HSOactFExt5.ck9X","true","2026-02-09T11:05:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153817/3986594d-9b39-49fa-a2f0-21d1b90ede5c","VERSION","geo3itVAsm7_Ze1RHTP6VHBdtfu8XkY_","true","2026-02-09T11:05:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153817/4947ed67-07f8-485e-a248-b8f17b2524cc","VERSION","KegwnHvevukPMm1bSCsSkoGgOzk0WV2A","true","2026-02-09T11:05:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153817/85211e32-94ab-4279-8a66-c54b09bf54d6","VERSION","MdhPMgtIKhX19U_O_oTLN3e4CfAfGzto","true","2026-02-09T11:05:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153833/17f31080-c110-4562-b123-e166e6047e9a","VERSION","8m345u0s3v1SkmzT7BSBdl1bI8SrNZdz","true","2026-02-09T11:05:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153833/66545732-038e-478e-93cb-0cad3c50bdcb","VERSION","EJfkbmqw.s0AMt5ODIxEN50T7DuFNc1G","true","2026-02-09T11:05:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153833/8d5de18d-1c44-44f4-b88a-1b2e2f9d3a65","VERSION","QIv8HsiCXjOkJfctZ2mL0WrtjTMUPLA_","true","2026-02-09T11:05:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153833/a9128055-1305-47fa-9a5c-64f95d12b4c1","VERSION","SA_rBb7P5AYQuA1Iu5HM4_.0_lDo560D","true","2026-02-09T11:05:49+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153841/29676a4b-f718-4c4d-8ab3-1e252b947a86","VERSION","UdL1kwR.twtqzyMxbvtQV9kKXZXSmZwQ","true","2026-02-09T11:05:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153841/32f2bc30-7f37-4577-b056-677a47f35bc5","VERSION","AIMCZYzLQuWCsuvCOu2x3iUODtlo.p7i","true","2026-02-09T11:05:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153841/618fdd60-5682-4e5f-9472-3151b374bc3f","VERSION","yJuTlEEwtp5hmKZNjk20g8_ZDVjhDcZt","true","2026-02-09T11:05:50+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153841/dc44012d-1560-47dd-82ee-2f5e78c84669","VERSION","FruMJ12O_hYtUoaEDD5r8UldoIs3VSL7","true","2026-02-09T11:05:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153876/14c7a9cb-ff4c-4bf4-bf4b-e9cbd83161ba","VERSION","xG1FGQVf1P3XJXEFPK2QBPadp_X1dvf4","true","2026-02-09T11:05:51+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153876/1c9a821b-d551-4bfe-8d51-f0acbb0e09eb","VERSION","UFYs62luto0vjzweM0rzBg9S9JoTm_CM","true","2026-02-09T11:05:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153876/23156b5e-258a-4120-a7ec-e95c71ff4866","VERSION","h7YAORF7jIgXO1fyb0ikduiHhoZ_AUUB","true","2026-02-09T11:05:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153876/bcf98884-47f0-4832-a2e2-c54135f2ea05","VERSION","BC5k19jjstxhUMPOh8zwejTDV27hZlkn","true","2026-02-09T11:05:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153884/0426dcc7-d776-44da-ba61-d2485735ca68","VERSION","TBK06LVwtj6Z4b5s7dXQxCJtX1nMw6zg","true","2026-02-09T11:05:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153884/3087bcda-dcfb-4431-8d47-5935b5638e9c","VERSION","yfBMYHU3efxyS.h9PcsnDZfX7Jzu9uUm","true","2026-02-09T11:05:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153884/4ee3f0d3-b190-4391-8983-35d4adf7a3c9","VERSION","oJqF.QfRHNrGLgRpAHEiIV3LK5YnK1zg","true","2026-02-09T11:05:52+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153884/d084fc00-5665-4176-a5f5-6bd479aa8855","VERSION","fuacAQhyNF7YfHePQGsp27KiaZY.SyFw","true","2026-02-09T11:05:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153892/03c0c358-1c27-4b06-bd49-d17ae0686f48","VERSION","WVAM8JrGWXx7EGguov63YAjHPYgv3agp","true","2026-02-09T11:05:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153892/cf9f72fa-5119-4fef-b525-f23fec2bc51b","VERSION","Q_wH9F4mtlNjg.tWaFnD9fFTTv.Cadq.","true","2026-02-09T11:05:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153892/e6134582-a42c-4c50-8117-80cba8b881b2","VERSION","cdl9mbvfabfW_sXgdH_zUPxo3AXcwCZz","true","2026-02-09T11:05:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153892/f760a958-d095-4e3b-a370-ac9c03b32549","VERSION","Bu4nxzPHcyR6ZiUwGg8UHxlDViUgoqTD","true","2026-02-09T11:05:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153906/2ff8a3fa-08ae-4fac-9c58-b899aab3cc1b","VERSION","C6tqzUrw4VuSgHTR0wYXbEIc8GBrhzKt","true","2026-02-09T11:05:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153906/3956df72-5e19-45b3-8d20-ee008d7fbf2d","VERSION","NNrx83kaMe6BOX6vTX6iLK4IZIZG1cz1","true","2026-02-09T11:05:54+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153906/65d6c7da-df96-4683-9108-0c727a1beaaf","VERSION","CGV30uVsrxM5yhxeuknGihJiBhMHdpWi","true","2026-02-09T11:05:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153906/ccbb615b-2dca-418d-af15-8a010567e6f9","VERSION","gFcjQ9m1mf7L51n_y_w.vQn1IP8KuP1P","true","2026-02-09T11:05:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153914/4da98303-c8f3-439b-85a7-e87aaf6079de","VERSION","xYQQscfndmFGRzhrm9vhesDqfCK2D.HX","true","2026-02-09T11:05:55+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153914/74db7049-f9df-4d22-891e-07ec4fa7eb26","VERSION","xPhNxV0fjtXhzwhNnOBBsCfeChvL6YWi","true","2026-02-09T11:05:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153914/a0db5e96-8b35-48b4-b0cd-0db94574d140","VERSION","51UTi1tyDMCK_lsTw5y9yc5S9AZRYnGV","true","2026-02-09T11:05:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153914/bce71761-f6de-4ecc-9258-b970fd59630f","VERSION","TCFoqyGKxEzsdve4se_syxGSva8sOHRN","true","2026-02-09T11:05:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153922/1cb68b6c-ec21-443f-871a-c1bccc95f7ef","VERSION","0ap8drLjS53zjj7O6C6psYerKTiE7eNK","true","2026-02-09T11:05:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153922/a98a7376-a6d9-4ab6-8c5b-654b8b1e097b","VERSION","wR.v5jNWYz9t_1T5AzxgsEogproz.KfO","true","2026-02-09T11:05:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153922/be67f903-5765-4630-9ab2-8515836b6c0a","VERSION","VMAowV8.qc6ee_9pY3YCG2bMqh5eFLEE","true","2026-02-09T11:05:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153922/ec24ba32-4cc2-4c3c-b8cd-7fbac5d6f64d","VERSION","hpLXEKYSflxBEcaAHVzJfr66AZUwNTMO","true","2026-02-09T11:05:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153930/1a3a44ae-bfe0-4d76-b775-39686354a662","VERSION",".kfa6zIRT7dF52XHdM9vZX5GYut0rWKT","true","2026-02-09T11:05:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153930/6ca3e4b9-16aa-4839-a8be-cddbca6bd3ed","VERSION","_RuqLaJ9cV5SUOGGNu8yIdGEX56VcGpc","true","2026-02-09T11:05:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153930/a39a34e9-c091-4a9e-977c-5a1507a9e391","VERSION","S81zzL5dhKBQuoS4qK0T8V8Fa6HP3guA","true","2026-02-09T11:05:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153930/d5ba3ed5-78bb-49b7-abb0-4dd81d484b8c","VERSION","bvM7JWfPNUanpY28W0.xA6p6nwIBeQd3","true","2026-02-09T11:05:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153949/42d814c1-e868-47eb-880c-02338075fb04","VERSION","rp672GgH7Q7Vwz.68AOIORD.m09_GXXX","true","2026-02-09T11:05:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153949/4bd12a3a-64f2-4ea5-99d8-3acae1d9bae7","VERSION","bjmsyewPOOGIzqU27P7SyxTRjAA44_yB","true","2026-02-09T11:05:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153949/519b2a41-42c9-4ec6-94cb-9f72d857f80a","VERSION","6y0pIF3DOBNnwM_8T88sc6AoPuz_0FLg","true","2026-02-09T11:05:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153949/713aae74-263c-40d0-b09c-74125b222f4a","VERSION","jCDrKIDU3ysQdJrTMTONq_7nSe0OGoIV","true","2026-02-09T11:05:57+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153957/5edcb9b3-fffb-4486-80ba-f30022ff5369","VERSION","RoI95ndS6dgGOPHuva5bAXK5yvZpBANR","true","2026-02-09T11:05:58+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153957/c0d44bf3-48f9-41e6-af12-785ea587153f","VERSION","Yr6GaNULkNkSvKpLATI5SVih3p1rQYzK","true","2026-02-09T11:05:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153957/c26677f2-5fdc-4942-9f8d-147bc616b722","VERSION","grMYj.6LmhE0LBtwnhSrX3sC2iFrC6bi","true","2026-02-09T11:05:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153957/cdfb4dee-f955-48e2-b1ef-21ce55cda4c3","VERSION","m9pmgejIPxSahiFmxRrnuACow8rXfFMM","true","2026-02-09T11:05:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153965/1a08fb4b-ad1e-44c2-a158-e016d3f43a4e","VERSION","cK1252fQuCDsgjClOtwbWBrmwhT99QGK","true","2026-02-09T11:05:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153965/6c9f39c3-2c42-4fc3-be27-0d7d5674d9b6","VERSION",".DS51VLdLtP33wTYpbU1XZdIREQstVEL","true","2026-02-09T11:05:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153965/c872bd6c-5608-4643-8469-ed7019eef3a1","VERSION",".NfbeFkhPXBJRWShZgN66UWc.B1lRDE3","true","2026-02-09T11:05:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153965/d262df4c-0891-4409-aa33-0ec1560faf67","VERSION","jxLPapQvV3f7CwSi.4CmYYFtfGCAyHQH","true","2026-02-09T11:05:59+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153973/1c190c49-4041-4d60-bf20-35242b66dcd8","VERSION","6Y5x9amQ7sfkMvskYh19Pakgp7AMsuSw","true","2026-02-09T11:06:00+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153973/a3409c14-17d6-40d5-93f5-e28edcd444bb","VERSION","Wp2PcDvnnw7NaqePNOi_86zgD4xiN4Cp","true","2026-02-09T11:05:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153973/b3a69d5c-ade4-4aed-8f52-bc9e0ef86e51","VERSION",".u7usG1hpDeMEW47lOLVmnEWNxL6plus","true","2026-02-09T11:05:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153973/e7cba7a5-ef7d-48b7-bf16-ed3f78aefe48","VERSION","t.Y4QQ5ewkXSqce.w8TZVPNgMjyzndc6","true","2026-02-09T11:05:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153981/1d4bc4f3-8220-40c7-9378-1557a382be56","VERSION","ijPunLOe2DPJbIUW54_.0Q4vF7ofe5xu","true","2026-02-09T11:06:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153981/74ccef47-9d84-4fc9-9bb4-af1c0f247319","VERSION","C_y4W2mkVc11bHzEFNIAq8todFhu9yRw","true","2026-02-09T11:06:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730153981/8df4d979-835a-4f01-9b72-80637df66d08","VERSION","5ss6D5OgNau4qd1txar11N6uiiOQXIDi","true","2026-02-09T11:06:00+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730153981/b47b391e-4bc8-4cd1-a856-2118a4a7c618","VERSION","8vH29J0jsISlvQ5K1RAU1cQ4YSCRaWEH","true","2026-02-09T11:06:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154007/455498a6-27a5-4731-9c7b-d81fd445c121","VERSION","qSjtOsJvsUZoXdnpfM8QSrRQ0UakIcwz","true","2026-02-09T11:06:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154007/49816002-6b67-4b78-9ad9-8e8bcc8fa01d","VERSION","EsM5IxpNvv05Czo8dp6MZu6FhJcvgCoe","true","2026-02-09T11:06:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154007/6cd04170-b881-4a77-9a56-62f43471cd7d","VERSION","5JplSbQ99xojsXvqEZXt9zFlOu4Qbhm_","true","2026-02-09T11:06:01+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154007/90341bf0-a3a1-4492-99be-ae216b323608","VERSION","0H6FZFB73ineJbmR1VGbAJKtu8yBQCtq","true","2026-02-09T11:06:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154015/6804d93f-d46b-4168-b84b-aea316599c08","VERSION","cpXeVrZ7rmTRvCboFQqhAZEPYL5jaQCU","true","2026-02-09T11:06:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154015/771442c3-76bc-46ac-a414-ed3550dae00e","VERSION","eE2pmz.EiphrPI4FR1p0A_N7ty_.4Epi","true","2026-02-09T11:06:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154015/9b053792-bc8a-4033-8f5b-9195f4619df3","VERSION","6VXbsQjCMLh2cHp_jZ0ZM2OLipJquOXN","true","2026-02-09T11:06:02+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154015/f9b902d9-1063-434b-bd09-bacb1baff749","VERSION","IkUYW7zy2AKp3O4bX3vLWUbqaYRYJlAk","true","2026-02-09T11:06:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154023/4020d627-3dbe-4cb9-b039-8b6fcced0eef","VERSION","E_ufqqgnhe4ntFSTVB10PSUVyMSNvwdH","true","2026-02-09T11:06:03+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154023/a14cac19-c8a6-4cbd-9bd0-1b1197fa6edb","VERSION","nMlzVdj9v.Ari3W7tF35BcKX_CfdCu4V","true","2026-02-09T11:06:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154023/c13b62f8-0f8a-4064-897e-32796cc5eb38","VERSION","JNiDFTj.rTvOxQDwLpQWSbTA_eYrw0Kf","true","2026-02-09T11:06:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154023/ec4aa20c-6a69-4b2d-a545-2e0b60783dde","VERSION","aA7qy_0gVgU9faMkUQzJE0DsoCUidcCD","true","2026-02-09T11:06:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154031/6d3834e5-e921-4f21-b6b7-53a23420c675","VERSION","ZDu_4fmljpqmUHbysYUiciUgAef7WgzK","true","2026-02-09T11:06:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154031/85f69471-5bb6-4cf4-94cb-6753c2bf03b0","VERSION","cF1BjqGjVtKns1gBl2N2DQ4KLZoZPOo_","true","2026-02-09T11:06:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154031/af61a317-27da-487d-8ffe-50e97a90fc20","VERSION","TZkonU8mVOI1X_.rFvGkEEsHxl4XY5ZW","true","2026-02-09T11:06:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154031/cd090b2f-daaa-424b-8403-6444f313ebd8","VERSION","m0wzYmgz.PrFCHcOJhN8NlhIbKsf1R8C","true","2026-02-09T11:06:04+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154058/036e81e3-e06e-468d-91fb-f774e0e3eae4","VERSION","9AMyN.cF_hLjQ2RwrmTNr.fRhkYmd9jW","true","2026-02-09T11:06:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154058/0d94f449-b89d-4ecd-9bcd-17e49296329f","VERSION","LmY4lfwH3MQiHUdqOECSTrSk1TdENTLM","true","2026-02-09T11:06:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154058/10ee23e5-267e-42f8-b2d7-7fb60b7e002e","VERSION","tYAO1JxWqmAKTaE82.fnsJcu_uJIchvs","true","2026-02-09T11:06:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154058/798fea6c-4fe2-4e3b-8280-7c362312c5e3","VERSION",".girGgXgRTLzTQhoBF41iOl33jyLq6Nl","true","2026-02-09T11:06:05+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154066/05f2d610-6a79-4e8b-bba9-10cac45c512c","VERSION","rs7RBN.HKaAqkYAUozCYX7R2MuTnddN8","true","2026-02-09T11:06:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154066/5df922e2-bf7c-4a05-8228-a2f39e9a2446","VERSION","f_mhAiR8We4AKq_smNIb.wkbH8F7wO4M","true","2026-02-09T11:06:06+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154066/a4236ff1-934e-4b40-a754-d0a109b8cbc2","VERSION","KaTNn805Ew9.4m_jcxRfDiX0zsIT7yU6","true","2026-02-09T11:06:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154066/cc35af47-b374-4989-95f2-0be80ba7a93d","VERSION","WCflmUqC8yBgt83zZ.axcS1oYy41tS2c","true","2026-02-09T11:06:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154074/853a1061-7d2d-4084-9016-ce4d66478574","VERSION","RswvTwTniChamQgTFpVvH4VTlnlbF5qT","true","2026-02-09T11:06:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154074/ac1c366c-d67f-4d35-8375-c9870b9781b7","VERSION","V.RYF_dnA1ShK6Qj4bUc3oInMi84fw0E","true","2026-02-09T11:06:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154074/ea0125ac-4a72-4213-87bd-d6fd8296ec32","VERSION","jBWDmX447O.2YS1cMTJue6P68FvXxcl6","true","2026-02-09T11:06:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154074/fb1559bd-25a0-4642-aa24-941820b2f8a8","VERSION","bd7DeJAvRIR.X96xuXTqv9QTUBWko0fE","true","2026-02-09T11:06:06+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154082/247bba9a-b79c-4ca7-b88a-8925e961bef0","VERSION","iG8KPVVwX5QTIm8bmzWju7iNgPesKPv9","true","2026-02-09T11:06:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154082/314f12a2-792a-4fef-bd43-fe988dc5a16f","VERSION",".0NQ3gjikDJHQ9c1JePmS0yypeQTtJ6z","true","2026-02-09T11:06:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154082/454e04ac-6c70-43aa-a1cd-a94bf1ed7eb9","VERSION","rlOq3gMMIdlsgxIMyJ6dFXDMjqCcYTk6","true","2026-02-09T11:06:07+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154082/68fa1e17-ddd9-4245-b0a9-f5a6abc39fb5","VERSION","SK.q.oVW4lx52KClg1HnxRVqBQaaMNgB","true","2026-02-09T11:06:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154090/0404de14-489d-4dc7-bca9-d53c196ddb28","VERSION","ssDYDZgtEKnJXHnD1ZVGlpHGbvzxGJEY","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154090/0dfc874d-04dd-4e67-8bb3-e31f1f848820","VERSION","OJvaxYway6q1A1u1v6GIaRhzN6T5vDhe","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154090/adcc0a24-db61-4091-8e4e-108e1255131d","VERSION","b7Pp8JT4Gv3ISdM19C9AoMF8Q2nHnH5e","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154090/d946ad86-5cac-4215-b39b-0942e767a5dd","VERSION","TtI3YyBATLIPPFkcegRW0hw0lLK0uUWt","true","2026-02-09T11:06:08+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154104/06a4e441-c7b5-406c-b7ca-7522ffac6913","VERSION","sPnUvCSXHYa4j8Txf2PPDo.Nik__PqWp","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154104/39f3138d-8a8e-485f-8c34-36d45bb23b59","VERSION","zmIHnd3VOZtHoQ02qg04gv4ijM4NEOmo","true","2026-02-09T11:06:09+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154104/e7b5e8cf-5beb-4357-a3eb-466227f0a146","VERSION","1NIUN7kZaJqJ_6EyD_MR4Dm.VuhOPd21","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154104/f946b6c4-3863-4acb-9d01-945d05fbaebe","VERSION","rqhDvPhZns3NPmfm8_Qh_VahDg.MjeTv","true","2026-02-09T11:06:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154112/1e445a5b-8a0b-4704-86d5-c4d5516d4b76","VERSION","_d6iqksoKdQECxpChJwLc1.zjcwcNWAw","true","2026-02-09T11:06:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154112/aa95426d-7f72-49f2-97cb-c00079558b25","VERSION","b6oszblOFnp4pSlItkAx4sxm10QdBUJX","true","2026-02-09T11:06:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154112/c6c23756-f555-4eed-aaa4-bc41a1cd4720","VERSION","NM4K3.lGWK.4x3hdnv9lawnWIN_8akbh","true","2026-02-09T11:06:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154112/c8025c93-c119-42a4-ac31-3d7ca2b1445b","VERSION","S0_Lbx_wXMNUZ2JtDoAgLH0zOogF7QiU","true","2026-02-09T11:06:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154120/212abdbb-51e3-4e40-be50-68d9fcee919c","VERSION","1Lt9fZlEB_FgcpkzO7x4LYC.Xk9e4kZ.","true","2026-02-09T11:06:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154120/338778b2-093f-465c-a701-aed3175e74a4","VERSION","ckwukvyxbDWQeFjk.OESAiXc6GoCLT5K","true","2026-02-09T11:06:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154120/6225d2d5-3e41-408d-aefb-bdf4583656ae","VERSION","n3HFDIX36jQw9OH0kKNSA4SCFp7E2bn5","true","2026-02-09T11:06:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154120/e6750f49-5517-43df-a165-c364f6351ceb","VERSION","aXlTptMR2CRDKLlK9hTtkDAHNlQA5d4M","true","2026-02-09T11:06:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154139/07d9f91e-53cc-46f6-a7bb-7798437612fa","VERSION","LxQ2objqiqMIze.GvOiPgfKroWruWacO","true","2026-02-09T11:06:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154139/290a2d05-7bd5-4503-b364-b15809da29c0","VERSION","lnLAkydY1upon5buAACAYFje6ZQ6MMaS","true","2026-02-09T11:06:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154139/5d57c0cd-f991-42ce-85cd-5aa3beef59ae","VERSION","OyOF.y57aWfg4uo_GrmaBJDSGAW.hm.Y","true","2026-02-09T11:06:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154139/c27ecb06-33d0-4f98-96a2-3055cbe27b5d","VERSION","ppQObAcTy3L_kya2FZ7YE43p4eOcLNCO","true","2026-02-09T11:06:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154147/6aa382ad-20c9-42a5-ab01-d0a821037711","VERSION","UHLNQuxJiUcIAQZffC.vYNhOKERfnrkg","true","2026-02-09T11:06:12+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154147/94252450-9cad-4dfb-99ba-abaa1733ef0b","VERSION","iTarLkSCOQ4IUOrwLPxkOdyEfz7UdfML","true","2026-02-09T11:06:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154147/946b3ba8-1d0c-425f-947c-68e314ddc803","VERSION","Jfpr3iUOgRQEjrc.Of8ZnBHIE8luOvLR","true","2026-02-09T11:06:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154147/f4890dc7-24d4-4c19-af4b-0ac93945b537","VERSION","2okH9TFnntoLJfAiR9smaPlJ5RW_ItqN","true","2026-02-09T11:06:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154155/4a425555-868a-4a0d-b41e-9419904e8d7d","VERSION","mA1lHSjcsXzr1C6HQhJQbZz1k0gl98mG","true","2026-02-09T11:06:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154155/5f6efa5f-8478-448e-8fcc-79a544fa1624","VERSION","CIduPztwpi5cxaQk037fVi7BgG.A2lxo","true","2026-02-09T11:06:13+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154155/ad62954d-1c08-4cff-9c87-64f6fe5ec86e","VERSION","gSg8iXkfg8r38YgLtpXZ.I9GqxiejjL9","true","2026-02-09T11:06:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154155/e6558b1c-9134-47ed-893c-033d806e4de9","VERSION","1VXMt7KD7Xc1KHLZrcnPdwkICp2hNGBT","true","2026-02-09T11:06:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154163/0d5948b7-25e7-44a5-b373-2853087cb5ad","VERSION","Kl3n6XFkJix3UADOITjKyGsEuOyMrv9O","true","2026-02-09T11:06:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154163/3374365d-c299-4c0b-83e9-d6cc49cf0af8","VERSION","UHFrynlq6REWUtyTW.gBtAxlunHnMdW8","true","2026-02-09T11:06:14+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154163/5185dfb8-cc4b-49d5-85b2-2ccd9ddc5541","VERSION","C8xhlYNk8wxf8Jd4VKBhkwFnKGGzrPTb","true","2026-02-09T11:06:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154163/c6e472b7-eb7b-46ca-8ffa-6fb3c1561f20","VERSION","HazwY5MtuMOoN_BrDpS.WQ36YBGRUn63","true","2026-02-09T11:06:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154171/02ac2c92-8c11-479c-b69d-f6f2267b20ab","VERSION","X6NXtf09qfNUVq3.XbtWAd8YI1iGLnFa","true","2026-02-09T11:06:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154171/8cba5672-ca36-4c7e-afb8-7b372dd91655","VERSION","oCDKPbB7TMjVTBIVFKdPrioggNC.RC53","true","2026-02-09T11:06:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154171/c4fb4195-6d1c-4800-8546-d7bdb1148287","VERSION","qGQpbpm0YOU0bi5347W3mTSYMua1yAlr","true","2026-02-09T11:06:14+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154171/dbc54d8d-db32-4035-adf3-2cc5c5ea543c","VERSION","AXF8o29ROJi50vBtFknku6bMUGS2GG_D","true","2026-02-09T11:06:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154198/470d0e4f-4c7a-4188-ae6e-3ce7aa54a7ed","VERSION","e5O06NpmxpEglRghwBthXha9Gs0WFVOb","true","2026-02-09T11:06:15+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154198/804beae7-42e6-41b1-b42e-5a835a184220","VERSION","Nw_Q6R7BgKicoEe9E5dPNaUXSHwKfdZd","true","2026-02-09T11:06:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154198/88ebd6ff-5c05-4e70-9a2f-8a6018af948e","VERSION","C05v_Lfsj8_marXuZMX1TronuxI4EPva","true","2026-02-09T11:06:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154198/899d799a-34c3-4da9-a970-4ddc2677aedf","VERSION","vdipuWl_njCeuVnZEU8fEAqWKFNY8gyQ","true","2026-02-09T11:06:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154201/1a1ce178-284e-4abe-8378-d3198a7e2581","VERSION","Se2jMspe6v.pTAyK4loR3UmSGS1N0cNo","true","2026-02-09T11:06:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154201/3265b56a-f7f5-4d16-9aee-23c80fe3b35c","VERSION","On_AUF7R8jMn_OmNNFo1vdEn2rIBU5yx","true","2026-02-09T11:06:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154201/652383c1-8e8e-4b83-9775-7e580ab8901b","VERSION",".CBWeG0lvs42C14yJruWCuUflP5JMWvi","true","2026-02-09T11:06:16+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154201/a63b7c5a-3b02-4e36-a724-dd0c458f6b26","VERSION","LOEcb_e3Lr_I.fezyGoCkKOA6kbSNvDB","true","2026-02-09T11:06:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154228/650389aa-97b0-483e-bb99-e70e65313a6d","VERSION","Y3xx6aWGxYLF30Bx3ZfQWGk4UzAd6TQK","true","2026-02-09T11:06:17+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154228/a84478e3-8f54-4b38-8b7e-c0a161c72620","VERSION","fGA6MRc.v76QS6D58hlncvkFHrniR_4B","true","2026-02-09T11:06:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154228/cba6440a-ba12-4b01-af39-1a29d306c0b5","VERSION","QVKMVh.yq6XpQGD6Ayt80Y7ZErBr8_uV","true","2026-02-09T11:06:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154228/f2dc5551-0eb2-4a51-8bf1-df9b6ab2dd90","VERSION","RjCSbaRBgATGJvftC.LO_KX5O7yIsC1A","true","2026-02-09T11:06:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154236/0b8b53ee-daf3-47bc-b804-13162b8c8636","VERSION","zKzjv.3qNW09hyKgkP2WTgDDPpQl8Gap","true","2026-02-09T11:06:18+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154236/173d0ef5-fa38-419d-9f1b-4fe1934e9e5f","VERSION","xhKV5Z7STxJ8yJQb97gH13k8S_Dridhs","true","2026-02-09T11:06:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154236/476b64af-71b7-43d4-b8c0-f6039ccdeed4","VERSION","Ll4E4AOlwixYg4OyQwQkkLBtfcYGeb3u","true","2026-02-09T11:06:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154236/ed39c774-2da7-4c70-bba8-46be5e6c0592","VERSION","icJGfgniPp7f.CHAUWG.xnhoXsR3yS8z","true","2026-02-09T11:06:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154244/092e31f2-40d0-41c1-b4e4-c1f2fd9ce217","VERSION","717whw88jS7eux2M4BHonGMFfxEBrkMO","true","2026-02-09T11:06:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154244/9601c2d0-28cb-4577-a47a-28556e4962b7","VERSION","mDMWHIy1uTtMOvtcGFl40QRyyQvW8vI1","true","2026-02-09T11:06:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154244/bfc91b3c-9457-4258-8fee-799eedffbc69","VERSION","W0Z3FDwZEbqMUYOMGECyzE8lB8tWvcGa","true","2026-02-09T11:06:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154244/fa006771-4075-413a-87e7-715035fb5f51","VERSION","is4vjzMoi9IxjHg0ulalJ.eBpUekFDCe","true","2026-02-09T11:06:19+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154252/8b01670c-4ff9-4b58-9e60-1ae19ad8f522","VERSION","G6kggQJh3hMCkibgCIl.cTTmxgGBuKZ0","true","2026-02-09T11:06:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154252/b46ae31c-e8ad-4ead-bc58-6646b21f37db","VERSION","5f.e9N89QyJCXeyrswbk2M5FnAZEdnJO","true","2026-02-09T11:06:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154252/c648092e-04cf-4a47-8ec5-94a1c2a8a43b","VERSION","AP.sO1o1Dz4tFGhWHumzp90eCAp7hE1W","true","2026-02-09T11:06:19+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154252/f1937957-459d-4234-8dc0-8d4f52db3ae8","VERSION","3EW2fnONmBeBi1wWzSInmCra_3aN.UQk","true","2026-02-09T11:06:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154260/2fad9989-24fc-4be4-bf98-678e61a3e808","VERSION","iOzhtMlMl7bnT7R.b7QH.85em6syMCit","true","2026-02-09T11:06:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154260/d6e689a4-7002-4849-9088-c881649b39c0","VERSION","eAKWhQrbO8l9Qyv_8DnfQYSdGtsnWgLZ","true","2026-02-09T11:06:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154260/e06735a6-c92f-4e9e-9ae7-94e091b80188","VERSION","EjQbGVZJurdYAjyAm5FeFGhDjg552UKl","true","2026-02-09T11:06:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154260/f32c7c8f-84be-4e00-80c0-c26a1e93ad48","VERSION","RSX4QmXH7Dy8IZ3FrpsNTYcjXcmjkHim","true","2026-02-09T11:06:20+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154279/7f93920a-2882-460b-a355-767145031c11","VERSION","xnJx_k0yM1dQYc4DabJ.wqEym8DJB0Uo","true","2026-02-09T11:06:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154279/b43fbe46-f308-4806-9e45-f57328f1409f","VERSION","nj8aj0HmOyKS7X681oNolDNjTXDraeOX","true","2026-02-09T11:06:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154279/f3edf8aa-6de6-4e85-a24b-eb8eea461eb9","VERSION","m_7a0w8WUokhcFWkYH31zUDuY99TEKyw","true","2026-02-09T11:06:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154279/f720c87d-8ba7-4fbb-bc99-70a00f3245c3","VERSION","6SAHS45oUrIGmxNrw4h4VJLfsv5lgQu4","true","2026-02-09T11:06:21+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154287/11e31b44-3902-4984-b0e2-16ca23a86dcc","VERSION",".RnUwsicXziGWiO3PR7tulAeDhKyVvEM","true","2026-02-09T11:06:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154287/4ce5edd0-1fe2-469a-900a-94606024869e","VERSION","2hiwdVRPdvd2wByd19X68YXJInauNoBA","true","2026-02-09T11:06:22+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154287/621eaa5e-3e68-416c-8548-374a318f81ae","VERSION","AMNEinWTAXfYFVLxkvo5x1fCnFDTBwp3","true","2026-02-09T11:06:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154287/bdffb62a-f7d8-4a4c-9e8d-eee4bdd98931","VERSION","rfGVAAqLlqfmstIZn0g84scYrX9cHTPP","true","2026-02-09T11:06:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154295/250d1553-344d-44e6-a17d-8ae56d1a3263","VERSION","nMvdx6Gi_6ADXP5h08DgHfJXvMM9B9ZP","true","2026-02-09T11:06:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154295/474f5515-c814-4885-b741-f9a63549ded0","VERSION","Y9t6esRw2CAL2QDL8QbWVGYggJ1M7cpy","true","2026-02-09T11:06:22+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154295/a36f2a3a-5de9-4ce8-8625-eb6a981bd68a","VERSION","AMHWEdjPAdHwHixL5iVwyG5p44kvXD8M","true","2026-02-09T11:06:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154295/efce60e8-a23b-46e5-81b3-88f1b8634882","VERSION","_UBvPhmRoKiyPkw5tP8AVaLtS9hCYf5F","true","2026-02-09T11:06:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154309/081d179c-54a0-4401-bbe5-7d63eaca49da","VERSION","k8TK2dDg8Rz2A8ETRYLXatAWexv6R7UR","true","2026-02-09T11:06:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154309/7e9d1150-0324-4d6c-a539-72ffae1ff807","VERSION","iYGFTnzR_4ptKxNZlzDNj6jQT_x4_v51","true","2026-02-09T11:06:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154309/90a7645c-418d-43c8-becd-84adbd6861ed","VERSION","q6o.Y5jFgdlliHM8xWaWcwagt8GA_SFs","true","2026-02-09T11:06:23+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154309/d82c0378-abd9-402b-9835-c4da74feadb4","VERSION","RhpNiGluMc8bNFkUWeGHs.F3RqdGmvpF","true","2026-02-09T11:06:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154317/441350fa-9c4d-4e1b-ade5-a05e88767f31","VERSION","53dNG6MBMX6yBnFFr3XLeE.1yx_22MoW","true","2026-02-09T11:06:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154317/4ef76b07-f548-4081-8df9-e1904219dbe1","VERSION","5Zyxvn_Fq7SUNzfHRpHT7RXeqjGiAqxw","true","2026-02-09T11:06:24+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154317/be465f2e-5872-4333-b7df-71770fc86e3d","VERSION","MtdVe68pkasnYx1Hi8N4LhbmyIaJ6syN","true","2026-02-09T11:06:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154317/da8977c1-e38c-4091-9361-b969cd563842","VERSION","q0SgdB3vg15zRZpnIjR2QB97pSN6yFZ4","true","2026-02-09T11:06:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154325/3ab9bbaf-9af2-4a29-862d-fb1b77fb4e76","VERSION","M8s2iPox_upvBKrUrzoFcmim_rVjpg26","true","2026-02-09T11:06:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154325/3af3bc92-2b04-41ae-a3bb-b5873b23a2e5","VERSION","1jB4pmI.RJBBffXrePd5_1.RpajrALjo","true","2026-02-09T11:06:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154325/597d6bc3-0a72-4863-af3f-c7f52d744bc3","VERSION","NDKWIlqCVF8ygXu0ec8C6ejkyt9LN6qC","true","2026-02-09T11:06:25+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154325/7da307d5-8e6c-4e65-b6c5-767aa0bd8e6a","VERSION","44XLIvh.1jV2wun3Vcex8MQ4GckrFo59","true","2026-02-09T11:06:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154333/4ef12109-526d-4da9-9a69-22df3ae5b780","VERSION","rpheQDJhEcMlsxC2f1iRIjwIIWYTsiue","true","2026-02-09T11:06:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154333/8f1058e9-7811-4130-80a0-fa33984d8bda","VERSION","1pOP7nNMZGPLSXCEimqICGix8eYqE3Jq","true","2026-02-09T11:06:26+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154333/a898478b-2c7b-46e2-9a74-65992089cb84","VERSION","0dCKlA.uKVXq9TBPt2Ory.ZYhQ1miKlA","true","2026-02-09T11:06:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154333/c489540a-ce45-4d1e-a39b-d4d540418cd2","VERSION","F2bd5sVMpgKA5jsJMWouiPdIoGNWzO8z","true","2026-02-09T11:06:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154341/220169e3-4084-4cb6-a13b-8aadd1f58fb4","VERSION","RjNhhL7cXcdP.gqPqIM1Dr6jZoC4yFWt","true","2026-02-09T11:06:26+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154341/59b37756-d90a-461a-bbc9-3baa223b352d","VERSION","MNnY2f4jzGLbDCzoFpFoZmg4lFWeMOrE","true","2026-02-09T11:06:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154341/a6533cf9-b7a7-414c-8708-3ea8eaffd7b7","VERSION","9jNZ8jDfIjeQhJkZfsvBEXOtdkSKL7jL","true","2026-02-09T11:06:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154341/aabc4544-dce4-4426-8b05-4fe976e77685","VERSION","ivRPckKHCzfS7hQNKOfTwlAsJbE9DB7z","true","2026-02-09T11:06:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154368/4c175ab2-63a5-4061-91d9-8180786a433e","VERSION","_V0XUf0JqNBUqD0A7ueS8Y02ZKRY5wJz","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154368/8352eed2-2604-4a4a-b08f-5a7a661253ce","VERSION","YV0R2tj0ImVb_s8LV5ORPw0mNRC8xto0","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154368/8574209f-3b26-4711-aa74-27da90e44183","VERSION","NoPNnJnye99Nn84k.8S885sLiSZWRQxB","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154368/ade9b11b-16f9-4412-b930-e65e8c83585d","VERSION","IbDm2C5FUNzahXLpYdsjpXqMUQAraB6q","true","2026-02-09T11:06:27+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154376/19afbcd1-790b-4304-9066-147cd85d8748","VERSION","Dg7SveGQzn6e2vq8WGkdH7kTbRAfVc1h","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154376/4ce7998f-ba87-4b23-b3b1-00472c11280e","VERSION","ui8NnoYuVwn_w_3d3ZYgQfutS_I1VaA4","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154376/76e08ea9-c598-4010-807b-3a14dfa93abc","VERSION","lL5d8wslWU0uMZwy5sd7oaFOqtczKFM.","true","2026-02-09T11:06:28+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154376/982a1081-3db9-4e0d-b9d0-136cd0b535b0","VERSION","yUn9u13Tc0ujnuFfs.gXVvOH0Ir4ur0H","true","2026-02-09T11:06:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154384/476913ae-5e52-4bc2-84e6-6d52969136f8","VERSION","7bAqcQKkeSzrO7W6z0IcBaq8dUfGL6tV","true","2026-02-09T11:06:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154384/512d1452-9869-42f0-8127-9580d75b108c","VERSION","NbrBMeE0Gd6VshFVBNpno.lOuuJgmbgK","true","2026-02-09T11:06:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154384/8f767830-f5c8-4023-90ce-e991a622c6ff","VERSION","zZc047giuJlj6u8bfOoaRqpP2XcWunUB","true","2026-02-09T11:06:29+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154384/904743cd-0c69-4083-892b-9761fc3bb6fa","VERSION","PuiEJfZFBpguIuz4OrqRxSB5yNkqF1mz","true","2026-02-09T11:06:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154392/5249bcb6-3eb9-4b58-84a9-e3f413d8e974","VERSION","qXdP7FdqYXxDVAoWCV5to9RIThYiruY8","true","2026-02-09T11:06:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154392/99039b65-a5b4-4402-947e-34d644592e0c","VERSION","Q195U366xzAYxUcSZk2uvpejm_qy76Mc","true","2026-02-09T11:06:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154392/a9d922a4-a48c-4f1b-832c-21988dab40ec","VERSION","3BbO4.5CVyHZGcAV45c.4NDSxfThTgu6","true","2026-02-09T11:06:29+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154392/d9fcc647-e87c-4187-b145-8a9534b0c852","VERSION","xSv_rnHxIXfGr0gYaXeuh1gYy1G87qpq","true","2026-02-09T11:06:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154406/0900be52-4f84-40b8-9fcb-d9280e8d2352","VERSION","EKdK5nWjYjo8_wJlHN3_qxOKDX2d2vnE","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154406/28a236ce-4d45-4961-8b8f-93451ddaaceb","VERSION","AihRR5c6Pkt2wiTFAGsjif1RlQ3uZp1q","true","2026-02-09T11:06:30+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154406/ee69c710-5073-46e7-984a-9944e1a79d83","VERSION","uU2QP4sbqooQOfmLhZZadakWbGpcE_j6","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154406/ffb665c4-93a0-4898-a2f6-888af657dd86","VERSION","XU6HYxJL5KY7WSUpm7OxSQwcDN9xMhaE","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154414/3da9a9bc-d803-4f4d-a65a-79b7aa2b2f30","VERSION","lzn4ew08lF9Hp7Dbi0thXqv0Mhh9AzdH","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154414/3f99f7c9-d204-445e-b448-eb48ca36d735","VERSION","MpEcRZMCuNJYACYYX8NxCVW40AUaNKXL","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154414/839799d4-aaef-40d7-a768-888a0458f8ab","VERSION","r3Cf9BAWiiE1agiddaT68j05tTGGCfkc","true","2026-02-09T11:06:31+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154414/a7ec1f97-cb35-4dbd-81e0-cf66bb415571","VERSION","x2dOCmTqsYLORAyHbJEF.qIvg_oORFXE","true","2026-02-09T11:06:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154422/7cab5ea0-c33b-4e47-b05d-8c75d37405ca","VERSION","_XN9AHj1vAMFbDSavgjxB.uCz4HsJhcT","true","2026-02-09T11:06:32+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154422/80c2333e-8b98-42bf-8ac9-b9194d9aa927","VERSION","w49ga3e6rZU.RPwileme2XrPMOxEBVzt","true","2026-02-09T11:06:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154422/e90207cb-755e-4a11-af46-c97e5f51df9c","VERSION","MiGTmb3Tqef.tTbGB8m87C2SrUkdXl_P","true","2026-02-09T11:06:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154422/f2830960-87cc-4ef3-9d13-149e4c190453","VERSION","nJUOLmjRrcBu_VySCoBHLd4z7qK2svCY","true","2026-02-09T11:06:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154430/6d2ed8e4-2ce5-4c58-a5a1-5f9f461941dc","VERSION","cljuGqdODGOwlvj03_96o.rlOhPO6rm7","true","2026-02-09T11:06:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154430/837b5c8b-ac16-4d41-b5f7-f3cd6768e3b1","VERSION","DRxXF7.mSGgeF71xaUjv62QtdSUCY57O","true","2026-02-09T11:06:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154430/973d41b9-da58-4cbe-a16d-42ab0e7fd6f6","VERSION","qBPriOevvXvDP2NtDNTU5KEVb2x.GrIy","true","2026-02-09T11:06:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154430/c5f8b790-08aa-44f5-970e-f3d6d4af202e","VERSION","m4HnbgC4b2kXpWBlUTdATqA64B7E5pD_","true","2026-02-09T11:06:32+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154449/89a32373-0470-4359-9ad4-2c273437ac04","VERSION","1AvfG1MWPacT75Ba0Z4.k95kCA3N5qyh","true","2026-02-09T11:06:33+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154449/8df0076e-83f4-40c4-8f0a-c30cead60dac","VERSION","eFaXftU.rzWEug7as5j0eoDSdAUvI5Ef","true","2026-02-09T11:06:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154449/add8353e-7161-43db-89d0-425ba28f63f6","VERSION","IxWzhS5Qy8RIZv_kR_VZOZz1hOe87931","true","2026-02-09T11:06:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154449/ccbf441f-77b4-49d5-a046-dcaea9b40d91","VERSION","GI.eKiQMC9RpG2Sikhh1qbjBECpIWOJd","true","2026-02-09T11:06:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154457/51b1792d-b29b-4909-a259-d29977fc8517","VERSION","ZFtvN3VXYuxllX3cTMa2TR5gv2gs1ykN","true","2026-02-09T11:06:34+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154457/b8752794-5e7c-4161-aead-9a742b9e1cd5","VERSION","xrMk0.6XtfrxDSEZRWfB8y67Sz3iW11V","true","2026-02-09T11:06:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154457/d2327428-7c65-4914-9aa0-18678399eb21","VERSION","OMf4s5oL8CPcmKHAD7IzAC.bfu_XQxRI","true","2026-02-09T11:06:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154457/d78d886c-58ec-4fb1-bd09-70ef718cc918","VERSION","HFx6zbt3S6rBqpTRVy8cwADWLaZUDfK0","true","2026-02-09T11:06:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154465/2f94b006-a433-4a16-9cb4-55bf14db3250","VERSION","R_CNrSVhLuo.flhmqOJhtKRIZqw980UL","true","2026-02-09T11:06:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154465/582f97a8-3de9-4b94-8615-efef6827f002","VERSION","pzF2UpwRrAnsGpQysH.Er8c12YMh7DT9","true","2026-02-09T11:06:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154465/7a292fec-722d-4a26-8449-9f4c9cd437a4","VERSION","eHcKjNJV8.6zFUgWar_GtZrvW2qtF0bY","true","2026-02-09T11:06:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154465/9d2c0df0-ef6d-420a-a56d-e25c49ce1a52","VERSION","30CMH1.nMRXLsTIg5zNKjpXc8hBgF7rS","true","2026-02-09T11:06:35+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154473/01ca039d-8b1e-452e-aede-fbcc31742181","VERSION","53hjM97ufR6BI7Vja.XkA4lCAZS6XyEC","true","2026-02-09T11:06:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154473/053a48fa-4e63-4ca1-b1d3-6c9ff051e9ee","VERSION","sdRnrKhSSBmYeW2qr2cMGDStlfUXPgSL","true","2026-02-09T11:06:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154473/0d801605-cfb8-489e-89bb-70a39c2a225f","VERSION","OiHZWBAVOgyN8TwMFHu01RJmSIZJ4GhB","true","2026-02-09T11:06:36+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154473/6bec7537-9a96-4479-96dc-401726d1e3a4","VERSION","RL45tFIWpVv..6Sp2OOqitXPBHmBVx8F","true","2026-02-09T11:06:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154481/5b7d6dfd-5c96-4d99-811b-9d13e21a9fde","VERSION","vVj2pyGGtl5zs9tQTXbPIARcOU1Y...X","true","2026-02-09T11:06:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154481/76fb88a9-34f1-48bc-b58f-fd01ba605d02","VERSION","J5mtAUwF_w1.uB4Rhh7B3BV2chXgNOoI","true","2026-02-09T11:06:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154481/b514471c-6bd9-4c6c-979b-18a2a85763be","VERSION","7I.1FxtsY8rOZK_0py1VYLf2enp7hV.4","true","2026-02-09T11:06:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154481/c662ec9b-4c06-436c-b41d-925e1a5f2f34","VERSION","noXBYWat47i.j.vE.CI8N9t6MnH0CrdZ","true","2026-02-09T11:06:36+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154503/3f685b3a-01ab-4cee-9d9e-5e7d23919127","VERSION","h0fEbUngAMOH5Vi7uoW_GGIXXjL_0Lym","true","2026-02-09T11:06:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154503/7ba0d082-829b-4609-89ad-42420cb33824","VERSION","gB302DnD0pTyeaWmMHil4QRPLuKHDHIP","true","2026-02-09T11:06:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154503/a7beee65-a492-45a9-a133-762153873445","VERSION","QaSmYBCLelbSsuMIOI9VZWxBopROnT43","true","2026-02-09T11:06:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154503/ca444d74-c652-417e-9657-09144abe3cad","VERSION","MJeKFVJKhUMbnwzv3eNnZ.lKHT905_gI","true","2026-02-09T11:06:37+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154511/4f2c8036-ff74-4553-b758-29ede47a453e","VERSION","bDui1d4kTvNFn.zaPKyO4xl_o7R1rYgX","true","2026-02-09T11:06:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154511/624b9c91-7b00-4cd3-8a56-920aa0691c04","VERSION","mzlSRuYBmnkodtvZu0MuoJWlhcwnXkcX","true","2026-02-09T11:06:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154511/72d18239-3f71-4a36-bce3-f94f75b3e5bb","VERSION","LHNXUIuI20lrNCXk7voHy64GAtzenZjF","true","2026-02-09T11:06:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154511/ff88ea88-cf9e-425e-b484-48cbf00299fa","VERSION","K3oJ_M9lAbF6NSkmkRqR3PoydkXZ3Lrg","true","2026-02-09T11:06:38+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154538/0a3610e6-3c52-46a0-8256-89a1037c7d75","VERSION","QYK29tGlT8FDFdmpgUSBm3okFWnE1.QP","true","2026-02-09T11:06:39+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154538/958313bd-ce78-492f-88a5-c6b9c03e585b","VERSION","40eP1KTKxOLCscWTzAjv9jKkPXt2EsFH","true","2026-02-09T11:06:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154538/a7793089-1f9c-4368-ae43-bcb7368d3959","VERSION","5VCrQl4nEqE1cYKp2wJvjXhA0JD1MQHs","true","2026-02-09T11:06:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154538/ff1852e0-6a85-4249-9797-8953fde9cebf","VERSION","O5ZQKcfQiajG7A2QD4sqJy7ejpZVlxBw","true","2026-02-09T11:06:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154546/0084f9a7-fc45-4174-9445-98c661758fbd","VERSION","blNkt4bpkgZY9H8lAH5.TD3el0N.0ctQ","true","2026-02-09T11:06:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154546/61934b29-e37c-4eef-967e-4b902976acc1","VERSION","4f9tg9zn1oPbKkskO7u4bmiPvmR28TRN","true","2026-02-09T11:06:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154546/df22ef69-7b30-4207-8f21-5fe7b94cfc54","VERSION","oXzsb_KVxuinACPif5AQzkwbk_PUw0FK","true","2026-02-09T11:06:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154546/e3d41e9f-0b08-4bac-a738-5afd5df51b6e","VERSION","gI1ju0VaR1gfTyDuDNOaLx85fgAQTxFS","true","2026-02-09T11:06:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154554/25526a89-5ee7-42ad-a29d-765bbacda3a8","VERSION","UzLQW4FrLWleqkURWs104Sdcd2_7PQH6","true","2026-02-09T11:06:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154554/66362d0f-7de1-465a-995a-f4f2c51336ed","VERSION","GYXp._3V1ClSRuUR5LYHg1Wb57UBSwbN","true","2026-02-09T11:06:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154554/d5fca96a-0e44-4ccf-a4ae-004fb5a624c1","VERSION","vNjvfgQZng0sIkITIXrdmiKTjyq06VdA","true","2026-02-09T11:06:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154554/e9544651-a184-4e08-acb7-6dd102ca1b9c","VERSION","5tLo4cC7XNqbi5VjbRSEdkdiNc1NguDL","true","2026-02-09T11:06:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154562/590ca5fd-b2a1-4daa-82a5-829c15cc22ac","VERSION","PEnwmhFgr5lHdtc0FEJVw1xqHXAvOJXy","true","2026-02-09T11:06:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154562/5a25e6c9-f69a-4163-b139-6b0b7ebe934a","VERSION","XYKB7MEiZQMVdtbqNeUQ3KX9sCR9kZnb","true","2026-02-09T11:06:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154562/5dc18dec-0900-43fb-a6f5-35bb74ca2cab","VERSION","cSPWXFFsBYTEWD4KE053QgfRAiBjC4zs","true","2026-02-09T11:06:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154562/e1758e70-3f91-46f1-917c-d52c789564e7","VERSION","FMSKC3h4tuANPaYo1.AIsQ2z7ZTMO90o","true","2026-02-09T11:06:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154570/1f067eef-357b-4ccd-9196-5cb04506ea27","VERSION","ng_dMHRU19CiPkJrp7T6uzm9mx38UZ50","true","2026-02-09T11:06:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154570/37ace2da-3a76-4580-98ef-935d66198fb5","VERSION","cbET5f5gs6XSjRrkVcrxDtbOfAPFpwnY","true","2026-02-09T11:06:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154570/72941e98-5ab1-4d89-8edb-e913e7aa3304","VERSION","dknURchxkkYO45hGE8JniHJNz7vkKSGV","true","2026-02-09T11:06:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154570/7823511a-43ec-4867-8c11-1e4f14642db6","VERSION","ADvFl135q1MYxpFvTPzpWyswXF7QX6va","true","2026-02-09T11:06:42+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154589/579c5b1a-eae0-40d4-b95e-993e6b964541","VERSION","pu8HFbT0M66Vg1aH8sNKUiMpxoB9UupS","true","2026-02-09T11:06:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154589/b971677f-651a-4197-8c27-b4b9d298eaa7","VERSION","ELOhEnrfa9XLuFt7NgPYrfd5s2u87WMo","true","2026-02-09T11:06:43+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154589/c560d12b-d58b-4c5e-9a9f-8fb34f4078c9","VERSION","oshEiHfGOpOEX9NS0xuIKaRAmHzqRs1G","true","2026-02-09T11:06:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154589/d6e65514-7c2f-4666-a714-fe24c7566adc","VERSION","OyI_ecgC789gpo5glkgnFkzJQrFuNJWS","true","2026-02-09T11:06:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154597/0b3b124c-aa82-4dda-8613-e233681faaaa","VERSION","WgWWMOq1V0XN42A63tCcbb5FFVrSF0l8","true","2026-02-09T11:06:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154597/58d91cf5-95bb-4916-9e48-34ba1de120c9","VERSION","mpcOUtgTQQIwErks6tj5EaPXmeFdHyQE","true","2026-02-09T11:06:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154597/7c1691ed-38a2-4346-9fb1-de62a79537df","VERSION","XGM0k9RegbYCKXjy_YUxzC9NHQ6oyfpR","true","2026-02-09T11:06:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154597/dd1f8a5d-71ff-43c4-a856-0e6b0ab7e282","VERSION","6NqFe4WjHQ0wLmEHbYW9JjCVFlqD2oFH","true","2026-02-09T11:06:44+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154600/78f83851-f63a-4ace-8558-9e362915a001","VERSION","4QcnoYUQU_O2q2ZGRoDKb_V.vJ_Lj7DT","true","2026-02-09T11:06:45+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154600/80398ea6-7623-45b7-bd16-7fe5620c4778","VERSION","foYCBaBh616thrB2fmV5pi2bXTSha1ag","true","2026-02-09T11:06:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154600/a0c0dec4-27f0-4f75-9572-dd54e813a156","VERSION","7x2bYJ.qrWi6DYCNPE99OWplJmfldUdQ","true","2026-02-09T11:06:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154600/e15f2d58-a67c-487c-bde0-4a671fbe075c","VERSION","4tYgACVfq6x_E.qH8ASFxbLTxKkLVsrk","true","2026-02-09T11:06:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154619/72fbff68-bd9d-4d6c-9092-82f2336a6b5f","VERSION","e44SyNrI0lHVri4b1hzBwbCppEGKa.40","true","2026-02-09T11:06:46+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154619/b5fdccb3-c0b2-4390-b3f8-c5a6a21f2398","VERSION","6Zj6ykYpdnG3kXU.AQqG0jLNHcD4B.fV","true","2026-02-09T11:06:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154619/d19ae02f-c026-4cd8-98c1-b7ae2a3ec5d2","VERSION","JEQx.XAFflbNo25wDsf.u7OHnEOTE7wn","true","2026-02-09T11:06:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154619/d733b3c8-0856-4893-920b-7d2d5dca4adf","VERSION","S9ZKapASXr0aSe0CmEk8mhvZUTItE8s9","true","2026-02-09T11:06:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154627/77c01847-25b8-4204-bba1-15b5e83e92db","VERSION","vgb6Pel_UC4sNFmlvC0NFWkhdzuJ4phI","true","2026-02-09T11:06:47+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154627/a4de30ba-7077-4c7e-8ae9-02ca43dca517","VERSION","SqyIpn4iFgqGMOaZ77XJKJ26br_r_8Ij","true","2026-02-09T11:06:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154627/ac20a2c0-fb1a-47c2-bbeb-105707e1a699","VERSION","I__cPuZ7IemxROob.d28n4DVDlPUW7uo","true","2026-02-09T11:06:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154627/f55b328d-afae-4d9e-9476-a850446897bc","VERSION","7A2SuZnafv.edOUnN7h2JbznQPEjuBPD","true","2026-02-09T11:06:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154635/00b4b446-182e-4549-b7b5-525563ce84da","VERSION","33uSRdEw8x0l155AxP9SWrEoU4qg.rDY","true","2026-02-09T11:06:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154635/b5c16e61-3030-47b6-8f50-684f1c408752","VERSION",".Coq997BCEdGgjDqyh.NKZLdwlJk6lGT","true","2026-02-09T11:06:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154635/f09fb279-4e20-4842-ad55-1125145f4783","VERSION","bSZtO0W.gmZdNd9Z6EZGnaOAzjiHHFh0","true","2026-02-09T11:06:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154635/f4a65d64-2d39-4141-8b06-49b888756566","VERSION","16.iJIP.fkeSd3zn78ETiKF8EDjfGF3l","true","2026-02-09T11:06:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154643/150fafc9-0b1c-418e-b5ae-87c96260ce56","VERSION","869FQwUQWAa_QjoUn3OgQeIdEy7miAYK","true","2026-02-09T11:06:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154643/3d77d20b-13ad-4254-89a0-cff63a7bd826","VERSION","zzi_muzLrnDFUGQcCIwtWdA76e_jjM8R","true","2026-02-09T11:06:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154643/8b4ac801-e0c8-482e-b825-241bfa0f2386","VERSION","R.EQT5zZMfow_mnL3NkFj5MkfpYa7Ej5","true","2026-02-09T11:06:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154643/f441b417-6ec3-4898-8a45-2c3732a2b934","VERSION","fO6KioBNIpM_0ivK0u7cikc_UEZ5Uzd9","true","2026-02-09T11:06:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154651/848f3f5a-9be0-4cdf-8dc3-e9b64349726a","VERSION","kC5iIxtpvf6B7Dt0LpvLcoZAr_3B8EVX","true","2026-02-09T11:06:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154651/a2daa4ad-e6ff-4b0e-ab9a-33a00d515365","VERSION","J7EpxH1ogUAjOMlUheBcWvlPAukkY2ru","true","2026-02-09T11:06:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154651/a3b86392-ef2b-4454-a55a-a5297fd026bf","VERSION","E_iyNi.3sNcn7Kgylo2G6IZDeID2Lada","true","2026-02-09T11:06:49+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154651/b49aa794-09c2-437f-b9b4-6b2ebc8f543b","VERSION","3iR7Qqd_L5kL7ClfPAYVanPdirvfMoUl","true","2026-02-09T11:06:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154678/298f617e-3994-4c98-af5f-5d7492fdefda","VERSION","R_4I3HtTufqCl_YsWsPRe1EUZS3c4E34","true","2026-02-09T11:06:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154678/4d3f8810-dd44-4236-94c9-723b3d76bc19","VERSION","678xekmLXKMQo0fAmf2JjyUPn0AeQFK2","true","2026-02-09T11:06:50+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154678/6a6d56fb-4814-42ef-ba47-fa28aa140809","VERSION","ChnAc0A9pK8O3RCIlur.6TBpBeXgE0LF","true","2026-02-09T11:06:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154678/e823ae35-61de-4a7c-abf1-17e10d8c8b4b","VERSION","0sqvJMSS70IalIAh4N2oW6FTiyqyTgeH","true","2026-02-09T11:06:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154686/56c9015f-0be9-4b29-8c19-95a2a80685a0","VERSION","e8iiLBTvzgBXHRkfhy8CqoM3zFWs4Tku","true","2026-02-09T11:06:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154686/6bb2bcda-7ca3-49b3-8796-38b4c3f599c2","VERSION","bqZ4DWJF4pqILUqaHzzrFp6Sxi9gy_RT","true","2026-02-09T11:06:51+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154686/b0b99a4b-6514-4210-9212-2040313117c7","VERSION","laSkVSjHm37SUwrNrss5n0yl2JGjQMlO","true","2026-02-09T11:06:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154686/b8135afb-1f9a-48c0-865e-9ebb45fd4cd3","VERSION","7aCtobR2P3MKiw8rpwlzUP.iHBafWh_W","true","2026-02-09T11:06:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154694/26613888-6a02-4f87-ae7e-642a499bee80","VERSION","qjsElY7tleEOR96lAxWJUHHL8lChmMXc","true","2026-02-09T11:06:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154694/3d93b89c-8366-49c9-89fa-e996c42ffd37","VERSION","ByjFRncTDDtzXFdaZp46C7yASuJZlhx2","true","2026-02-09T11:06:52+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154694/808b6ff2-5dcc-4324-bd06-669eb78adef3","VERSION","2JB5tndPGqusxpTw.8eyEoeOxzy70tua","true","2026-02-09T11:06:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154694/ef93d604-bbd1-4bb8-88ff-3d2617820d39","VERSION","jTOpmW7Uk8no3VWVd06fUM9ZgmE18xVL","true","2026-02-09T11:06:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154708/37a504ed-f7fc-465b-8059-20288a3ed785","VERSION","F_j0TNc_T5o9cNw5QLnNE7u46FpcNDbC","true","2026-02-09T11:06:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154708/7563464f-e3a4-4ebf-b844-e24d42f0a817","VERSION","0dWsSG4_3RWGKUh_8U8EA7Dbt2jNnCKG","true","2026-02-09T11:06:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154708/83ab468a-7f24-4571-9f63-f46db3e197ff","VERSION","m8oZ4miAn3c2bBAj9X69DGTRSVDfYdke","true","2026-02-09T11:06:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154708/ecf3b7eb-e1eb-4208-b182-c6e42b00a09d","VERSION","kZo1RoMN12.JX69EfctTqP54vqOcsTMU","true","2026-02-09T11:06:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154716/22aaaf6b-05e5-490b-9559-5f6f5dd4265f","VERSION","sRnqGHlfqUd0lbyo55gFeQIj8to9TUms","true","2026-02-09T11:06:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154716/345c7bfb-6bb7-48ac-8ee2-de705b585c2e","VERSION","I.03wYN4udPvi4htng89EPGfo3Vr0plS","true","2026-02-09T11:06:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154716/3d5fa9e9-7145-48cc-901f-d6be626174e4","VERSION","7w_ohP7s5BRUxJf6MdVMlUkrbNFU1Gyb","true","2026-02-09T11:06:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154716/941e9586-7ebb-4d57-81ae-a36d72223424","VERSION","DVq9ablsVWhLwS36scqwfPVtl8hlE94K","true","2026-02-09T11:06:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154724/2b188e3c-f64b-4940-93f2-6d3d46ec4b73","VERSION","VplIrTPr1ESClejo4brklVk2u75LE9mn","true","2026-02-09T11:06:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154724/3925be73-2177-4cff-b58e-63a4167458d1","VERSION","6dNuC1dXHpy6px4wPx_pvN1IGL0eooOe","true","2026-02-09T11:06:54+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154724/d561831f-e555-489a-a3f3-698b56b23868","VERSION",".R_8bsPmbq1E6V5oRqh79V686k9UNd0W","true","2026-02-09T11:06:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154724/e17e2a5f-26dd-4a18-a30e-567096e3ef2a","VERSION","Wp.1oYUrc9.B2yYRKPB5DOjQSK2AbQtc","true","2026-02-09T11:06:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154732/6fc463eb-f033-4dd4-986e-ea7ef4c44817","VERSION","jn7BhBwj.05DvyOEHidRxMQPXsT2QUaf","true","2026-02-09T11:06:55+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154732/7e2f93ab-2056-4cdb-b642-c041ffbde745","VERSION","HP3UDwfVzV63HeOAxkAT33oeZCFT2PCn","true","2026-02-09T11:06:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154732/b3740aa5-8030-4cdb-9f5d-d6115ffc40c8","VERSION","yL3gaW_lWo_vbee4v2OGLPf_e43kd4UJ","true","2026-02-09T11:06:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154732/de18b62d-4bf5-4009-821b-f4180ff909a9","VERSION","NnPyFD1JekL91QE_YvT4m.jZC_RqL.p.","true","2026-02-09T11:06:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154740/184629e0-5e0b-4af0-9b14-a5829824c314","VERSION","L.AUtt7UJCGpcnILODCK0ISV_Wm2iXQL","true","2026-02-09T11:06:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154740/6d3857fc-fee5-4ff1-9c09-e8dcaee34c08","VERSION","iIug2z4NKa3a5gxsFfHFQTYmkYSmLcgA","true","2026-02-09T11:06:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154740/8f83cad6-6f6f-4364-8d84-44f2d0874e92","VERSION","JIR9cxeU3yQtfwzF9SI8KpS.Up6bChdc","true","2026-02-09T11:06:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154740/d027d23b-0340-4584-8788-c6287cd6d1e2","VERSION","WbH0Aaspxk8G2Pt.0C_lV4LACN4JMskC","true","2026-02-09T11:06:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154759/35352c08-5142-4e14-bc0f-055ac78ce1a5","VERSION","wBeCEIQXc2b3Ib3Fb78IMT4MhHN9s9VC","true","2026-02-09T11:06:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154759/79a1e127-cc2d-4362-9b5f-96171a5430f9","VERSION","Yz8UkG5pxW5izDLsiR0DXuaM_t72Nx5q","true","2026-02-09T11:06:57+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154759/8f019c99-d9a9-42d1-98ea-1b28158bd969","VERSION","V2t164bkDIUEAg7ztEst1Thlt9weE6J7","true","2026-02-09T11:06:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154759/fb5d9c40-8e30-4233-a72a-961142a3686b","VERSION","20e2Ct3.PZ0ZbmJTrOH8cGnpXXkAsG1W","true","2026-02-09T11:06:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154767/b1c440bc-c153-4708-954d-6c35d8422b50","VERSION","CXGvyfRzgJIAI7413sGULis034z4oqLI","true","2026-02-09T11:06:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154767/da9ea236-cb0e-4388-91c6-7c82a1d52d1d","VERSION","pbQiEFH3BuBrQOXRyK2Iek5l764XPpId","true","2026-02-09T11:06:57+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154767/dd962cd5-10a5-4e9e-84e3-b82d28f82137","VERSION","kABeHHVlVUm7BA37sh.sqei3ZPSPJ6zn","true","2026-02-09T11:06:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154767/ec57d6d8-832b-491c-928d-95d6a49e1c6a","VERSION","FUVgwxHiphdcmMOEKcevLroc1WgneM4.","true","2026-02-09T11:06:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154775/7eed4ee8-d6a8-4bf2-97f3-0868648352eb","VERSION","GLgPd9VvhhC6RAfilf.1K1NEz8Jb3ySL","true","2026-02-09T11:06:58+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154775/9a1df035-2806-4221-8065-41ee78173116","VERSION","2RzJZmMDKSjB6UxZ38RvzsSUuTt5d7xK","true","2026-02-09T11:06:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154775/bb570e87-ea61-47d7-90ea-9015979bb3d9","VERSION","YzVce472n6.S6IaD1wxmQcjb3zOMNhJ_","true","2026-02-09T11:06:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154775/e2986c49-ad2b-408b-a777-8db955bea6c5","VERSION","9tcFNAISwzXEmKZm1UP1tQdtrnprweh9","true","2026-02-09T11:06:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154783/332180fe-2e70-492d-970d-8d1526bb540d","VERSION","nxOWGUPYXR3LHr9OjVB7vXB1REl5yhOP","true","2026-02-09T11:06:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154783/9525deb1-9205-4a45-a95d-c5d2336014a7","VERSION","KWFEXisma3fK9GKn2IuBjtw4FGbhFGaW","true","2026-02-09T11:06:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154783/b329e2e3-f9ee-4f2c-a0c1-e85329f0a17f","VERSION","i308PnnIRcCuFGRD2Otry7.ygMWRMZRJ","true","2026-02-09T11:06:59+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154783/e6838e12-4888-4ddd-b87e-6c74da4f255b","VERSION","1xQYGLtTs8hUnyOFx4O1q4ObF6232hv3","true","2026-02-09T11:06:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154791/2c37b97d-684a-41b4-8f98-0e5b692905c3","VERSION","9XILduvBf7UOXqEJbbcM0HD3t7rNnRj_","true","2026-02-09T11:06:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154791/311b71e5-9ec9-4cf4-8ce8-837a3aa4cd4c","VERSION","eMkOs7ohNyqvvtLo5i0yc5L08RNBSpjB","true","2026-02-09T11:07:00+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154791/93d4b9fd-d7d5-46d1-afac-acb16fe307a3","VERSION","VUzcqd.aip3v7KFrEjToPuH3o_Eb3IlC","true","2026-02-09T11:06:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154791/a8ee45e3-263a-4606-8f8b-283dc4dcccbf","VERSION","jofeAjJcA6ueJ1s3a6nRb913.7RcXKCk","true","2026-02-09T11:06:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154805/442a9291-269a-43c9-834b-e6f64eb5bfef","VERSION","EbolOJVrzJxd.ij0B31YufuKqMeW3a.D","true","2026-02-09T11:07:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154805/5e61e419-1b72-4055-bbb5-79e094c15047","VERSION","BJuxC8NEUghRbpB.qHqZseN_fEIuSc2k","true","2026-02-09T11:07:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154805/7d8c8b14-e97e-455b-b446-1f7e88a9a110","VERSION","tGlWztT0cW0tjpP.375h2GEQUL971WHj","true","2026-02-09T11:07:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154805/c62af10f-2da7-4233-87a3-38cbba520613","VERSION","iVRjeZqg..kXneuPczy6K1WFFSfT5D1K","true","2026-02-09T11:07:00+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154813/0add6727-e8e4-4625-80c5-6063c92a3c1e","VERSION","zDa0P9xyofhH_zqTmC4J74OyO2zCc9aa","true","2026-02-09T11:07:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154813/266e0b05-a8fa-4302-a288-15f985a6145c","VERSION","mcHTqoIWH82GvKbgZnaKXmpm4vHY2hxq","true","2026-02-09T11:07:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154813/6d70b48d-4ffe-404f-ac42-03ef253ecc76","VERSION","U_RO3udDa26aagxEQuhnu1GL1Fv3D.Mr","true","2026-02-09T11:07:01+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154813/9c677c2b-2deb-4607-bbab-49896f2bb9aa","VERSION","OGVPz_0OW0bIG2Ud6979B3xp60h258xu","true","2026-02-09T11:07:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154821/1f6de683-6ccc-4142-8bd7-b73dccb30866","VERSION","m6wnI7NVMEwaCVOrw8TkaZOXd5G83Oyw","true","2026-02-09T11:07:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154821/67d9f1c9-e4e5-477c-bb42-706286eb231a","VERSION","Aa4rI.hbot.A0FpsUTX.rkgJbrwNkoBO","true","2026-02-09T11:07:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154821/778dbfa9-afb0-4dab-bf42-e437bcdd49cd","VERSION","fOlKkMuLY15CpvanQo4BuLHk80OD1auF","true","2026-02-09T11:07:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154821/7c28e8e1-b5be-4de9-a7be-1c50cb41fa50","VERSION","t1s3vEwVseBlBkWO0awPxtysZ2TfHiII","true","2026-02-09T11:07:02+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730154848/6dbcf4e8-4c23-47a3-91fa-a15e0f3589af","VERSION","IZ71XcyDiLRqSXuaUYxswgDjDpLcftNs","true","2026-02-09T11:07:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154848/6f1a8525-9bf5-4819-81ac-859d136956e8","VERSION","uQLHRp3ekJ7.GCnb_NHkEkpdXn_SXbok","true","2026-02-09T11:07:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154848/8eb864e3-f9f7-452e-8d1e-6a272c780bf3","VERSION","DGAkWpubs74isKXseXp8y0uV_LMeD8dw","true","2026-02-09T11:07:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730154848/f6dc51c8-2e35-48ad-b341-d8f2af9a788e","VERSION","tuX2UtKFggaw5GthZet3brgJ6a3H22Jx","true","2026-02-09T11:07:03+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730256705/0a2c6de1-a4de-4d3f-ad92-aec0210cbfb0","VERSION","u1tkLVbw3AbJixmVytxYH__Hq7V5Limm","true","2026-02-09T11:05:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730256705/3b390aa0-ca34-4221-84dc-17130d8287c0","VERSION","lKeyQ0adGnQwGpTi62V7etcCx12HC3w1","true","2026-02-09T11:05:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730256705/78f80492-e13f-4e21-b05c-349f9612b032","VERSION","DGKB4JID34QcJDNbssLgCYR272G8VWdl","true","2026-02-09T11:05:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730256705/e6743802-037a-4662-97cf-7e72b993aa6c","VERSION","DcUBzH7VN1jVywlpfyJu.GL49i0u0iCq","true","2026-02-09T11:05:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730326924/0a2b4cbb-05ba-4206-a881-4e4c63e824cf","VERSION","D6TI1R7tJ2_wkiLehUcaT2aZrTYQ.gsk","true","2026-02-09T11:07:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326924/0f8c6133-39ab-4936-9424-140979daaf2f","VERSION","fpcA4.40fmhRO8rhrOv5aXaEnUikHfQf","true","2026-02-09T11:07:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326924/8cdfb688-d647-4ae1-b2f1-c3c0b8ec2261","VERSION","FpP73l89D4m5kbx4hNldU8wn5OD2tu0t","true","2026-02-09T11:07:04+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730326924/b34f2f57-dd7a-462f-8850-8414e7d94204","VERSION","xeuzp9OBmUzV4m7ixXSDkzVmORGbiCMc","true","2026-02-09T11:07:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326932/06ec5006-e98c-4cbb-a437-6059c15bfde6","VERSION","wkVGi6_PApeWDokm8NWgzST77Rg8JyCj","true","2026-02-09T11:07:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326932/7f9ad213-4398-4659-8485-34f9f0b9d074","VERSION","BsRkfwRyHabdg5G2VdnMRDEmSqAndgOh","true","2026-02-09T11:07:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326932/edd80d6e-3b6e-4f55-a93b-863c713eab39","VERSION","NhRKB2QT5dDf.9D1Zi2GaYPZ2iRP3kYY","true","2026-02-09T11:07:05+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730326932/f16cc9d5-4879-47b7-a6b9-8be7c7a147f5","VERSION","zKazUkyfZZJpHVu3WnYs68bw44Q40xKq","true","2026-02-09T11:07:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326940/07c7faf7-1b86-4831-811d-b51eb23c0989","VERSION","NLb84oDWB3xCcwdhAyMyjPvjvaM8NxAc","true","2026-02-09T11:07:05+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730326940/6e9f90ac-e583-4a09-a483-54dbaf3a7511","VERSION","0ZDR0UjxTOusjV8IU3EIIwf7FnOuDFyZ","true","2026-02-09T11:07:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326940/8e4450d3-80d8-4bfe-bee1-04f8035b4a95","VERSION","PmQoBwLl.ZJKGgJaVOhtXu.U6AumZucy","true","2026-02-09T11:07:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326940/ba410733-bd98-4522-97d4-57961e5897fb","VERSION","wWt8xdESsT3SQBufquFlfIBkqsy7szel","true","2026-02-09T11:07:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326959/367a296d-a4ac-4d6e-a9c1-94fcf81d3b2a","VERSION","V0szN5_Km7Sq_JwcB4wf0jOL_QZHuzRW","true","2026-02-09T11:07:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326959/3b5c3f8f-f1db-46a6-8f7f-97498871851b","VERSION","WFXBI716yDFMTvvoTunEfu.Q7BtrwASa","true","2026-02-09T11:07:07+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730326959/e58de8aa-ef97-4f97-b1d1-a732c1190890","VERSION","I.HBFP7bjKRwdpAl8auz.ekaogSAO6wB","true","2026-02-09T11:07:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326959/fa136c09-6092-44be-9507-4f4914c3a77a","VERSION","jgzTQ3caPkfwPc_.WHx2vNcweSeD03Jf","true","2026-02-09T11:07:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326967/b7001f1c-5857-44a6-bc2d-e1e71500e77a","VERSION","587peAPiH8nPGi5aP1gHIvcH9VxwPE0t","true","2026-02-09T11:07:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326967/d3eeb15d-147a-41f6-90d3-41f0489ee6b1","VERSION",".KLV_AKy4jz2DsUNccgARpM7cTG7zfmY","true","2026-02-09T11:07:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326967/ee1f8eb8-e541-4cfc-8433-ecc0efd9b862","VERSION","cOgCJmI0zFcPjx6CKePVHtL8jioOBJRA","true","2026-02-09T11:07:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326967/ee8ccf47-9037-4983-a309-00cf1237bb75","VERSION","O6gLQsaBjE0XkSeEgt4Fjo8JBXmmnmvu","true","2026-02-09T11:07:08+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730326975/1ca2a685-e15c-46c9-9788-3d8a9cd720b8","VERSION","LGC_67.BXmId9ZAxN1MaJqHtK75i9PaX","true","2026-02-09T11:07:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326975/27ce7387-a976-46a6-b366-7a04258b5871","VERSION","UyTsL7.d0FB4ybsPiYVuMZ8PiW3EcAiE","true","2026-02-09T11:07:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326975/4864c461-029c-4df8-ba83-9ccb7b20b38b","VERSION","LM65N6iOnjVJ732d5D.TIetO0QZLL7R8","true","2026-02-09T11:07:09+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730326975/8e9122ed-ee0b-4a60-bad0-a039393de5fa","VERSION","QprF5XiVKQoRuDhvALjDTNt0zx_LE9LE","true","2026-02-09T11:07:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326983/6f84adc5-012e-424a-9f29-cfd2b9bc6dda","VERSION","aY9F9vUhrWDyoBDftAn9ZKVEK2CH5Ldq","true","2026-02-09T11:07:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326983/8eabcb7e-7e9d-46cb-b65e-8ebbfd4782ff","VERSION","ExQ8nJdSqJGV.9bjTa47vlo7UTU39Aas","true","2026-02-09T11:07:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326983/b59ccf2f-0a8f-445b-9835-ef4ba91937fa","VERSION","fs4RMJvmBPTWpFtwLBIjYimscf07v8kH","true","2026-02-09T11:07:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326983/bc57271a-25e7-40c8-b459-bdaa1314b876","VERSION","jJ6vDaaPLve4miLAlE5cDr4ZsJTrKlyL","true","2026-02-09T11:07:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730326991/1fb67162-9ddb-49af-82b4-357d055fcaaa","VERSION","laaIyJz9BaOEVgo80c9dFPqblaeTXv0i","true","2026-02-09T11:07:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326991/4aeb52c9-0679-4a9f-bd92-acb16821204f","VERSION","sELlwyYobeXmqhDOrjGrcuzjIVsV1exr","true","2026-02-09T11:07:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730326991/661b7078-d5a8-4c18-a149-f405a742b4b8","VERSION","x9QtPthfbAUXwOhWFIBsBSTWbIPZXwtw","true","2026-02-09T11:07:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730326991/b55c5d5f-a0cc-4605-bd3f-dd685aecb3ec","VERSION","BvC_zWwW9SXEoxwPjxtX24sjtU2BriN0","true","2026-02-09T11:07:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730327009/2ac31698-6c6c-4f06-976b-c9239a3c0f77","VERSION","UdfmmIHw5F53GZ83D4ERDCK6FRwy1QH6","true","2026-02-09T11:07:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730327009/d6a6c756-3e59-4751-b28f-7b1679dfd645","VERSION","VYkBNc.nzy0cWvV1gcV8tUf0OuIefhpt","true","2026-02-09T11:07:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730327009/dac0e7d5-839c-4689-9bdf-1edba24e65bb","VERSION","qjyZwovPE9fpnDtwH23hEjtGBY.AHnH3","true","2026-02-09T11:07:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730327009/f6a19db8-982f-4c76-8c3f-b89fb72a2e3c","VERSION","vevwavaersn_RxjMlql84bP3cDHMZxB8","true","2026-02-09T11:07:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730327017/05df7e36-d70d-4aeb-ac58-8a814a6f2958","VERSION","SB4JAiiG571u9K9C5PKT9BovZjWBsIuS","true","2026-02-09T11:07:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730327017/2eb129b7-47da-459e-90e2-d6a4c25eecfb","VERSION","Qvd2KklRXAQ.mFZRd.4tcq7eBG60e0Ao","true","2026-02-09T11:07:12+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730327017/d7ed2a33-5727-4046-8fe9-cfa574aa7556","VERSION","QhzfGmvDIxXAeHO6Jp0DhhlYcCIoxJEl","true","2026-02-09T11:07:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730327017/d90121f6-5251-45ff-9ae9-fccf0e6dc04a","VERSION","WBROfnz8.GeMzwmYNQ6aXNSSLg7J5BU3","true","2026-02-09T11:07:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786917/450b66e3-026c-4c7a-ba90-b629a76d1a95","VERSION","87_wuJ.n9aV9v9ZGOOaYaFeKj6QGHYHV","true","2026-02-09T11:03:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786917/788f0515-9c1c-45cd-aafe-f12c548d91f5","VERSION","nNYZFHzCIr8a19aA1wrmKdT9co8hCRS6","true","2026-02-09T11:03:39+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730786917/a26bed07-447f-4968-9392-f45f2203bb12","VERSION","mGQ3wwVNySDDvR4rLbAayxW_SwlawhBl","true","2026-02-09T11:03:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786917/b2851a48-fbe6-4f83-be8c-7a44d27bd947","VERSION","4_NOWtWSUE4vX.EbKM17xwbkFSql34Up","true","2026-02-09T11:03:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786933/3071ef4b-dc63-4c60-804c-91854a392ce6","VERSION","rRm0C3.5Ga1IX2QHQqfv1tzk3UxvHqp7","true","2026-02-09T11:03:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786933/50213d42-0af1-4288-a49d-94afda601b28","VERSION","J05ItrCsJunLWC0D2bnjL8ZXfmHI82Q1","true","2026-02-09T11:03:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786933/580c8bd8-9093-4a88-95c0-4f20b0e6607a","VERSION","TdeOv1GTqIEc2CbX6H54afHlHwt77En0","true","2026-02-09T11:03:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786933/eccd3d9a-081e-4836-9714-572c301f0e20","VERSION","eD50Au08P49aARiuSmJ6OqJO_8QYkTHc","true","2026-02-09T11:03:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730786941/7a675142-b57c-4666-88d5-eef81b1c20b6","VERSION","bOIbqFrM7xoGpXg64vxIAZ1WZE20.yHA","true","2026-02-09T11:03:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786941/a5b9ffcf-5c9c-41f0-ad8d-227256ee3ac8","VERSION","yWyqxl6AKIkEBIc2UGgrUyqPnO22V1F9","true","2026-02-09T11:03:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786941/ccce6e43-6cfb-4e5e-b73b-5182a065d978","VERSION","HFC2AKeK3A2Khb4zqxCBuLnxQzSpcj2G","true","2026-02-09T11:03:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730786941/dce473f6-fc42-4ff8-89f5-a2f4ee3383ff","VERSION","tPJ3zfIZeHSAndDW.N.ANx33ZFdnv4OU","true","2026-02-09T11:03:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786976/61269381-2419-4cb1-bb6e-3cc72d31aae3","VERSION","a0nwW_fFsHBD50LTvszeeNMVF8GR1GOB","true","2026-02-09T11:03:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730786976/67d884e4-b7f1-441e-b5c1-ff731439a376","VERSION","iTw.EVUpbniu3GWBe7nvf5FOPbAW9F3O","true","2026-02-09T11:03:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786976/7061f7f3-9dfb-4d8e-b5c9-5b008e98116d","VERSION","EWDICE3qlfrTourzmcs0wmb4XcVuSeCd","true","2026-02-09T11:03:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786976/a74fd3f9-18df-49cd-ba69-222663dc811b","VERSION","bhHoOkDJmjHgKfQ23UEUyB6FmQoo2fK5","true","2026-02-09T11:03:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786984/4f34d9b2-6f48-420b-b307-a0defcd3b9b4","VERSION","UyP_CAwDyaoMfAt3yEN3B6uq1mqFq7dD","true","2026-02-09T11:03:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786984/581ce269-b551-44a4-9476-0932bdcbb3d9","VERSION","aZvyGSOKeliPxpDKPnlDBmcxhwaBcbJ1","true","2026-02-09T11:03:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786984/67712390-7ab4-4cee-b400-0aa44ed8ecb0","VERSION","ftgHyAS0he8Hr.VMin6jmAyi8buGQu9p","true","2026-02-09T11:03:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730786984/9a611a34-aeed-4e15-9c0e-0066fd60efed","VERSION","xdksNtYIRk8rTc93G.qMYpkU.SoOvEYP","true","2026-02-09T11:03:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786992/7dfaa92f-7b73-49e7-abc5-bfdc7ee9be95","VERSION","Qihxn8cf_8A2s_vek4V5AUF2qOvcuFB.","true","2026-02-09T11:03:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786992/b48bda64-c792-4109-bda1-813d522bc65b","VERSION","7hOmpiDz80aVowHK.p3s8ZmJO38NWqdK","true","2026-02-09T11:03:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786992/d3799f2a-c1d7-42fc-92b5-288251b83e3c","VERSION","V6AfcdmvYcjJj2DBb7pkq57owN6gdUdy","true","2026-02-09T11:03:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730786992/feb8692e-caa4-47dd-9951-02c35eb32723","VERSION","IL08qdzDkte9.Rm0.THqrU7CZ8x2Ps.h","true","2026-02-09T11:03:42+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787018/00940e32-aee0-4598-b07d-3e1b445bc4ba","VERSION","HC_NY6MGjqNoPwESFY7y3pO2bs5tcevS","true","2026-02-09T11:03:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787018/165f30c7-f221-4dbf-b953-2247cd98c154","VERSION","MoInuL2f.k31OnLw64UspN51.Z3KDPZh","true","2026-02-09T11:03:43+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787018/6ddce189-33b5-415f-a2e0-dbe42b4ea3cf","VERSION","6m.AHV8Xoz4yvTcBr5fP12OWF2_Q2m84","true","2026-02-09T11:03:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787018/982f6a98-f631-4e46-a48e-a7d489fcc3a9","VERSION","0bAw5elrUflHVZYoBvXm7slhEjrvZDiY","true","2026-02-09T11:03:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787026/04a3c99f-4250-48f7-b820-98e74d690511","VERSION","VSGVWj8BSqlDcYc.t375fU1wfyqvTpo0","true","2026-02-09T11:03:44+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787026/8ecd6b58-5d98-44f8-964c-fce744918a17","VERSION","AcR17q0zjRoX6mFzXvFgJkxSLBeFO8d7","true","2026-02-09T11:03:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787026/d5d7ee02-7156-449e-ba45-dbee2f6a66db","VERSION","mQnI0dW6Og6HZQx1qdzmjJm3if5KNTP3","true","2026-02-09T11:03:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787026/e597e3fc-3c94-451c-8e65-dde2d75caa8d","VERSION","7yOrXSVjW0CxfpYH.6r0AoujIkhQnQoD","true","2026-02-09T11:03:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787034/98e9e023-f452-4c86-a1e9-144eba0890d2","VERSION","0CqjG9Y6jpuP8P1o75tkHsetbjXKGs7A","true","2026-02-09T11:03:44+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787034/9b3a7d6e-c1fd-4b9f-b648-52842ac27846","VERSION","YCaB4H4gT.w6PDW0sZ.KO94NmAWX6wZ9","true","2026-02-09T11:03:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787034/9d076584-7c04-4b15-944d-82bed6ae67f1","VERSION","7t2PHzrk30TWhZ.p24AGfJsCVGLytcGo","true","2026-02-09T11:03:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787034/e5b9499b-7601-466c-89a8-d61b936e956b","VERSION","sv.fIEYeFM.P2CB1KpapTuQuS26bTutz","true","2026-02-09T11:03:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787042/395f2da7-a0d4-4c09-8d2a-61d9b6b63b7d","VERSION","o31odPoqA0cfCfAe6FkxC5F.EocsfsNI","true","2026-02-09T11:03:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787042/55b53a14-5a77-488c-9b5b-93d0aa975a58","VERSION","zsY7U34mc8fJpX8jghs9MJRsAsyk92R3","true","2026-02-09T11:03:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787042/a9d530ed-4815-401b-93a9-7efad4284b9f","VERSION","ZVZQ7JSKppxlmbpJYYnyypVRbWnmBL8R","true","2026-02-09T11:03:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787042/aac970b0-0ce1-4f6f-b466-812543a1b10a","VERSION","F.xU.C.lHMXk.6iqEWV_PSIWZjvoY1oY","true","2026-02-09T11:03:45+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787050/25be0652-7445-4910-8c94-6ee4554d5777","VERSION","NrmqsPSrPdGe2CztTuvxKEhMGQPYlRdV","true","2026-02-09T11:03:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787050/62d24fac-5141-4c7e-a21b-39a5f119dd8f","VERSION","M_8l0FPMS_hMzwowXwIdBJVvOd6oNURs","true","2026-02-09T11:03:46+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787050/d40db5bb-36fe-41ba-9c7f-39d24b85d8e4","VERSION","dkrzDi6__9.393k.nW3C4BKxXxJQWWCV","true","2026-02-09T11:03:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787050/ed761c22-4dae-4175-865e-e594ff9ace20","VERSION","1_EVZzmjnvoO5YATv1pysL3g86kMbL_0","true","2026-02-09T11:03:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787069/1e25b3ab-fbb2-4937-ab1c-1f5e0713472c","VERSION","W3um6_L_8S1w5efoHQZEWdmqD34HeXr6","true","2026-02-09T11:03:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787069/3a8388cd-ac51-496c-a8ce-35ba30a7bbfe","VERSION","5kVp.lvAmlGGmOBYR0o.ZQzdOfAXgLpp","true","2026-02-09T11:03:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787069/6653bbfc-a646-4b5e-a36b-17095cb7e55f","VERSION","ueScYzef2sky9DYqh70r3lgBzfi9v41d","true","2026-02-09T11:03:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787069/b6bee025-68b3-476c-a656-9b4eea1985f9","VERSION","bsm.8qboHbswXagGA1llkrbMglVtBtZU","true","2026-02-09T11:03:47+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787077/420ff59f-886f-45f8-93ad-4aa006254038","VERSION","AVjE541KA_2ZCoC5OiJGbfW5b4mTSND9","true","2026-02-09T11:03:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787077/85a1f285-c341-4c6c-890f-15ed42fead92","VERSION","Y79LROPvtr4bRTeWFgze5Ux8GdMqMWlq","true","2026-02-09T11:03:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787077/99945306-3ce4-4e5f-b5ec-693bfcedce9f","VERSION","s251lmd1MtNCTIGHRRi2.DbZwlgT.8c2","true","2026-02-09T11:03:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787077/d3cc13e5-e369-4bf8-bfa2-5ae95b53289e","VERSION","nv8IXQZI30PXUqcOrd3Zr2MEu0Rty9Qh","true","2026-02-09T11:03:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787085/2e23ae54-5383-4691-bd4c-70dac495bd37","VERSION","O6t6MPZbw821BKCJwhEgTTIBU4Bf1RR1","true","2026-02-09T11:03:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787085/64298c1b-7952-4d95-ab84-04b73b522984","VERSION","OFuPMSAo_pxOKA2Lp_Vn9zC24a8aOG7R","true","2026-02-09T11:03:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787085/c36ff844-c2f9-4074-8600-eea046a78d56","VERSION","grSZAZuHALtgtxcF5eNIsDyUGgQCfeok","true","2026-02-09T11:03:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787085/d14ca48e-10fe-4490-b8ec-8c48b7f71beb","VERSION","0abkH_eLWiwNJ.rWZRHklhPMz21co.Dx","true","2026-02-09T11:03:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787093/267a1c8d-56bb-41e5-9d3e-3882903a49e8","VERSION","zVpI56iJ.KONL9fLpgPsJnUyzKt6KakA","true","2026-02-09T11:03:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787093/61a70c9d-7910-4877-ab92-55ae44ccb41a","VERSION","JYKMgGdyJN6_Lgz0j7eeDsp6DwWp.LGb","true","2026-02-09T11:03:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787093/c157a734-bfd5-4127-888a-104bfa1eedf3","VERSION","Sd_o5SQ8gdqH_qQ7Gu1EblH6r6kKqqDq","true","2026-02-09T11:03:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787093/d8edd7bb-c8cd-4d0d-bd17-27f72b356cfc","VERSION","v23NJQIHAt9G77vqbTjz43jWGaPhJUya","true","2026-02-09T11:03:49+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787107/3c0545b2-1ce5-40ec-8f9d-9458ffc4eee7","VERSION","ztRqcEVmyaYTvXvKq2x4sn1S9N1xwfc1","true","2026-02-09T11:05:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787107/4b66fcc9-198b-488b-826f-ee6f5dd58b6c","VERSION","wleqfpE6Aw0lz8ceEh8pg5TZfH9axyNu","true","2026-02-09T11:05:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787107/64071553-548d-426d-a45b-ce2b78f7260a","VERSION","TT8BF5Gq7Kvp5EiDRE.pbdPdWAD3ebhL","true","2026-02-09T11:05:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787107/73732713-e001-4ef3-92c5-5756eab752c4","VERSION","jgrapsWmunJA3rcTDnDVJi3m0VCwYdnO","true","2026-02-09T11:05:39+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787115/182ae986-291b-467c-80f0-06a94896c5ca","VERSION","viscw.YvLmuozDCi_xOVQGycpXkWvhWa","true","2026-02-09T11:03:50+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787115/9b29f041-0ddb-4677-9be8-709522a2285a","VERSION","753JfZS2X_srUtIiGVtgc2B67VBmp9q6","true","2026-02-09T11:03:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787115/db0dfabd-c621-49f1-aa6e-7f54dc8cbb0b","VERSION","JSKEP6KSP7cD.rILd2_bpF3EfX0kNwgM","true","2026-02-09T11:03:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787115/ee955f96-e72a-4383-b668-1c0bfc9b175f","VERSION","UaOIa2zfLcDwHKF2D_3f_C7Q4JSuzwlB","true","2026-02-09T11:03:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787123/1fb16c75-f598-4b45-8302-ce355709a8ed","VERSION","orZwrl9186XQ9NqtBmMTiGRjRjSK172z","true","2026-02-09T11:03:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787123/59c25251-e2ea-4558-a353-53a6a403542d","VERSION","RovePNZN3q9xj.iyt3ervrSfzTnNHTst","true","2026-02-09T11:03:51+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787123/a60eea50-4c0a-482e-9fe2-f427274bf661","VERSION","dQfo5A6EFfmdKA.uvS40Eg5GhC6WsO3x","true","2026-02-09T11:03:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787123/e104d8d6-298c-4120-991e-935244bc1720","VERSION","lAXhewCwMKqxrkpStnYVTfuKn75DymLC","true","2026-02-09T11:03:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787131/b3b37d99-db12-4c92-9228-faa0c183fdb4","VERSION","5NtPlIR70_uXKtRi.5sYEb88VcsD3O4z","true","2026-02-09T11:03:52+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787131/b5bbb67f-9c45-428c-babb-7038167f919e","VERSION","sGx0b9gDIB3Oq0D4mcL5_8ROEQbxpa3R","true","2026-02-09T11:03:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787131/eff69e9c-ef9a-4b51-834d-d1e47bb3a442","VERSION","qwPUl0zjW81xqq3dXvckkh98u3hS5o3d","true","2026-02-09T11:03:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787131/f11ba74a-a661-40d3-8a82-7e0a5677c74b","VERSION","Y6fzKhd9VHqoMFpsLy9FOrtFfMt8bgVi","true","2026-02-09T11:03:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787158/2c167af8-c04d-47e2-9c92-a6bafbea5b52","VERSION","ze0u8xqdvqcFdBnzZkiFlH2eSnKoOif4","true","2026-02-09T11:03:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787158/4994d473-71b1-45f5-8400-1ce2782b7996","VERSION","DSn4x5_TbgNEHqMa1c4NKDiuubWZ3pH1","true","2026-02-09T11:03:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787158/bfc5ccd3-1042-4f6e-ab8f-4a99a8200283","VERSION","wprrQMhCNOmzi_BTXEmD7JkWdEpSmyFd","true","2026-02-09T11:03:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787158/d5d517c3-2d93-41f1-86fe-4dc87b94fc46","VERSION","YLhLxGMievMY9XBLdklGtdPS2cAzeZRB","true","2026-02-09T11:03:52+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787166/3f8e00bf-3a25-4601-b5b8-8084e3024a7b","VERSION","oJOKHc3rVaFQ3hIxaGDzGeaChOWnzpPL","true","2026-02-09T11:03:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787166/7bbfb965-1ae8-407c-a200-43c342768ee3","VERSION","yhCATpePj_y71drRLIAVELa95kALfzMu","true","2026-02-09T11:03:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787166/b61a45e7-d2ca-4b34-bc5c-8bc62a0e45e3","VERSION","EODapifgS.KxP3oeoEA0eK4rAxnb65Qv","true","2026-02-09T11:03:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787166/c5d6f874-ecec-484b-b219-bc72a0ede022","VERSION","CVBNwpcdeTc1ioXFzWj.urvAN3FxAQqT","true","2026-02-09T11:03:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787174/3b909e85-1726-48f1-aa4e-fa356810c556","VERSION","gp_UUL9eeBabrFS0jqVQAZ3dL34T63Hf","true","2026-02-09T11:03:54+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787174/59cc32ed-9726-4a3b-a816-fdbbd937a671","VERSION","WiEGvn_4x0MMina9siZlB6miCiTIaLlu","true","2026-02-09T11:03:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787174/ae40fcf3-4dc6-439e-adfd-cd0352ad885d","VERSION","M3mgKw6nwsW0EXDIyfWz_B_muuDg1h68","true","2026-02-09T11:03:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787174/b40c80d3-4154-4ce9-a05c-60e9312a75cf","VERSION","0iv4WqlGXmkaQ0LRCnn30uS4k9Hakjis","true","2026-02-09T11:03:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787182/5b73ec0c-44d2-489e-9a9b-664f6e88a80a","VERSION","T4WonGb8akiOtdwgLyw5yg08YEfVNGvS","true","2026-02-09T11:03:55+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787182/8bbd7314-4b9d-47ef-89ff-80ded865f09b","VERSION","0V0ltDP2J7nLSIVOzKkxZgIYqouL9mAk","true","2026-02-09T11:03:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787182/b55a7cc0-c7e4-4bed-8665-eed539ff0cd9","VERSION","6O2ArVhaAYwLCE0GrgGu09foXGPR0y4R","true","2026-02-09T11:03:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787182/f5d767e2-c6ff-453e-8fb5-1e863a7f6a6b","VERSION","OuO7L_nD.h6M.wX55kzSvhiClWhgssz7","true","2026-02-09T11:03:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787190/3e3f4cf5-5b7e-46d2-8c69-b8c80ea0444d","VERSION","TQ0c2TnNkj_yuywVUYK0vFZnRnAjqbRt","true","2026-02-09T11:03:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787190/4a71acc2-a8e1-4e0a-94ca-77c254372ab4","VERSION","bAb.Q8VQh8guulIhcyJyOhVFX_M4auIW","true","2026-02-09T11:03:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787190/aedbea47-63b9-400b-b3d2-c59671920361","VERSION","ez8cbdbYz8_QZhsvUTq8KO2PPs1cTaJE","true","2026-02-09T11:03:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787190/bdbc5921-0edc-4622-b6f0-80328053cd00","VERSION","6bttypdgnAJVpuW6evqIpSrSPYBnqF5R","true","2026-02-09T11:03:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787204/146b9106-04ef-4ec6-b707-4e1081333b0b","VERSION","aL4.cxcVme5ASjtrlxdN.pipzDJmyHNO","true","2026-02-09T11:03:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787204/26cf25dd-bfa1-4bce-8c80-27beb45a5fcb","VERSION","q9mxzNKU_OjTLTzrg5oi0gpifOT16N7V","true","2026-02-09T11:03:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787204/38a6f454-0137-4d31-a7d4-73a3599a1a4a","VERSION","J.2hpcYzfpq5S0FLvyyw1UgpnBepEPck","true","2026-02-09T11:03:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787204/5cec417c-60ac-4517-a2db-a85cc237d969","VERSION","2PklMFXnWFKA0zLF43bb5hsx3ovLdNmP","true","2026-02-09T11:03:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787212/7a9d9bf5-57db-4981-8c2e-e4ebae06367d","VERSION","OAds2ZZlFzTSMksZXuoprdY6pzQQwd44","true","2026-02-09T11:03:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787212/900768de-1bf4-4e2d-adc6-a1d86f5ccd05","VERSION","9r_n6PEiHxHPw8qisRxBpBd8Rt3xL99T","true","2026-02-09T11:03:57+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787212/a018f958-5b38-4e3f-ac8d-01432f961086","VERSION","0XE3vZ1Jq5ylOuVnzDlXmllk5RZxxDXP","true","2026-02-09T11:03:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787212/da5bfc82-4e6b-4230-ae33-58b523c1ecdd","VERSION","mBKBNT9vlcHlgfwtnV8vS9bdDZ1QPJH.","true","2026-02-09T11:03:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787220/3603c1ec-8b3f-4ce0-a305-291b483aa3f0","VERSION","Atp.ny7yYWC6xmSv6TRxOjHaWcsOjDyF","true","2026-02-09T11:03:58+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787220/36640fd5-182a-443a-8949-d17c0af6ce2a","VERSION","ju4K6CQHKaKUhZE3c88U1LJuYTy1xg0J","true","2026-02-09T11:03:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787220/61d630c4-4336-43d7-b8d5-74aa3cc0fa32","VERSION","OktOSv80H4uW4iIIkjfZGijhnAYtTqn9","true","2026-02-09T11:03:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787220/da78d496-1d9f-4d9e-8c4b-af636128fce6","VERSION","8Twf5Jp79e4qJoEeGZIyMymjDytQjU8E","true","2026-02-09T11:03:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787239/0d0a217a-507e-491a-afa3-c9f68f56efc9","VERSION","DVOF9NavbXlZNWKEFVVD1azCoSSJn8T8","true","2026-02-09T11:03:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787239/0e4ea8ef-2a0c-4501-9bbd-9de292dc918d","VERSION","fExZCmcnMSVZu.jgpQ3Ai2DYhDIbizaf","true","2026-02-09T11:03:59+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787239/80d75f53-f952-4c1a-8dd7-ede93715b77d","VERSION","LG.cGGfsyYI4EWlJwYaolvV.fg325Wd0","true","2026-02-09T11:03:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787239/c5be0c00-ebeb-42d1-bebe-24f4fd6c52ad","VERSION",".PhU.erOxAn0j2awMHHeKKDA2crcGkRs","true","2026-02-09T11:03:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787247/17791677-e2db-4b68-9c29-988c0daf53ca","VERSION","PThsb6pnAZRhRiMFccVKeZa3TZNNkPTt","true","2026-02-09T11:03:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787247/1bdeb547-a077-493c-8c53-1341d50bdce1","VERSION","LQYHXmyWRKAe_1scyjitUmblo7o83KMD","true","2026-02-09T11:04:00+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787247/2855ca16-e5f5-49bf-a875-d791a633c9ed","VERSION","k7MQmw0DfGQBfVyjyICK5LJ_mNqYP3DH","true","2026-02-09T11:03:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787247/29f5946f-f361-49d8-bdc1-495401f87f5b","VERSION","Xw3DZNr0ORqx589nlQ2gt6ysppBr3U.G","true","2026-02-09T11:03:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787255/3313ccc9-3fa9-4951-8c1c-0eadb24d124a","VERSION","RT0KgvKMwZHnDTCJEpCCKV1sb7Y4StR5","true","2026-02-09T11:04:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787255/367d8bb4-4c43-4ac1-a92b-cb4b34c319d6","VERSION","j1aZ10Rndo0PNaexGiImLqJiWnz4uhBo","true","2026-02-09T11:04:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787255/7563f017-d8e0-41ae-a46a-4110f7fcf470","VERSION","1z7vzgluNAkarW74RwR1f8TDUgDJ_vk_","true","2026-02-09T11:04:01+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787255/ec7b921a-da56-47c9-8e44-414c7c376261","VERSION","ZKZ_QdkuFp.vRfTF3CjEGEf4fx_Z_aH1","true","2026-02-09T11:04:00+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787263/11db1ee8-cdcb-4ae8-9c1e-febaf6b46c6f","VERSION","8dZcL3UQDizpx3OH1cDy2doQ7uP_pXCz","true","2026-02-09T11:04:01+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787263/55386408-9063-4214-b1b5-d3227c26c33a","VERSION","4X2OdQ6E5x_L5s..4ddEPVJwutu.y0wo","true","2026-02-09T11:04:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787263/8fbfdaa6-8f0b-45a4-b3a9-bfd92ad7b10e","VERSION","jJuobbTx6OmTpa3edD0uZXx1iA4YqKlh","true","2026-02-09T11:04:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787263/e9c64dfc-c210-4113-b707-310e0bf170d1","VERSION","xFob.RGfFThN5VfH.62NBwjdet91_qPd","true","2026-02-09T11:04:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787271/9d5e86ea-80bb-4682-aecb-b3585ae1caaa","VERSION","ZbLSvcvfzLZeGxxc2aFUL3GqffXPCwEh","true","2026-02-09T11:04:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787271/bcea33ec-c982-4b53-8620-73b0ab8bbe62","VERSION","iSIgYNWNX8fYHw49IGHsoiMYKwzlAbdm","true","2026-02-09T11:04:02+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787271/d275a34c-14fe-47e9-be34-dcdd222a55ee","VERSION","CXWP8bvOxzIDEmDkZRc0DnI05REo1b3V","true","2026-02-09T11:04:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787271/fcddd4bd-feaa-490b-b4a4-8c339202957c","VERSION","rVJWgsbuWQxBggIXF4ddxsWo8y9vsZdN","true","2026-02-09T11:04:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787298/14debf5f-a004-4082-a46b-ffe190354a89","VERSION","codZNGYrPHdmxbJs990TkW5tAqa2PFxD","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787298/219e15a8-11bf-4969-823f-b72ecd2e99e8","VERSION","cd3LsjlHjSMhHXtDtYrNjRzQ9AYLycyr","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787298/28a85fca-1a29-429c-88ed-ddcda727f080","VERSION","FDzbZwjQZ7cThKv3F1ZiHSH4FQZKoUfo","true","2026-02-09T11:04:03+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787298/48262a51-dcd3-4184-872d-3feee97d12e6","VERSION","Gt4ogCAeEnkfeCftXJdWvDqq42bRSMso","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787301/5614da09-5ed7-416d-9eaf-f4f9ddb529d7","VERSION","eQFOEqeiQBAVbMZIZmiKdnQv_CGIM4ND","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787301/a8f449dd-e8ae-425f-8ab5-fcadb71eb547","VERSION","Vx42qdVY7AWQ8Dnf_wlgnECTiyjDxRbK","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787301/b84ef83c-bfa7-4823-b7a0-cb403b51b445","VERSION","A1wyVLs2IzmpHGTrUAkqKDy7QISDejiw","true","2026-02-09T11:04:04+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787301/c1eba79d-da26-467c-af20-a86cc8cfcd40","VERSION","i_5n12asiinNRibZ_1jt1pErB6fomsSN","true","2026-02-09T11:04:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787328/015d7dd3-74dc-4b1b-b5d9-fa84ba4dffa9","VERSION","DPmLRJum3YPArLJ09Pq3Z3HgPzQMbUeL","true","2026-02-09T11:04:05+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787328/06082d7f-f9de-41fe-97a4-a03a019aa305","VERSION","kaL6KzRI_Spm0pNUK2E0T6J5AFsf3I74","true","2026-02-09T11:04:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787328/5d0e8e1a-09ed-4ffc-9f7d-860114d281bc","VERSION","GAAmUT3fELgxFrxoIXid.je4IB6UdF7S","true","2026-02-09T11:04:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787328/a79b7c66-f8be-44a1-90ae-cf78df0f9cf0","VERSION","JugMKfuB1TtifAMtHWK7Zc82zs0YaeZw","true","2026-02-09T11:04:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787336/4fbb033a-9d31-4d3e-9a7b-6339ebfe5547","VERSION","9egYxLhauJapmzPM5ugyvP1iXmdn1dVm","true","2026-02-09T11:04:06+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787336/7c18a855-fc20-4855-b243-ff64957c5d4a","VERSION","N41ldQX3WG9mcvQclLHo6gPFiTz6Bxms","true","2026-02-09T11:04:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787336/ca8f01c4-fbf7-448a-944e-981f2ea160f4","VERSION","SOzX_kKn1o8xYtV86cM_GpWy.pNbgF1K","true","2026-02-09T11:04:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787336/cde55e3a-9013-4696-8745-1f82650bb1ae","VERSION","dLqA0nxXS3r5m51I0xzxwpFT0ncWOFxa","true","2026-02-09T11:04:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787344/8c83e40e-1c82-4c17-837c-0b6e1c5b29c5","VERSION","hZmdGbXd6EgDzr_kUG2osh3iucEiQVSW","true","2026-02-09T11:04:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787344/ab1d0b5e-947a-4270-b1cf-0a66a6bff191","VERSION","8D4vk.xz8c4Cye3XwLaVBAqyE4xouoCI","true","2026-02-09T11:04:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787344/b4621120-8f2f-44a5-924e-8ad3ee100128","VERSION","zsmCTK47UdI4CoOzGuRzZ54PNY_j_4hI","true","2026-02-09T11:04:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787344/f7d53096-5593-4542-a9a2-f70dbc8ea695","VERSION","bF8uwVlhoPs6QKW82e0CiMpPn0fSdzZg","true","2026-02-09T11:04:06+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787352/b355e677-7a10-4f96-af48-b35da71e5107","VERSION","U8HQO_83Uh7J8c2_fV682pOb__HvoAOX","true","2026-02-09T11:04:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787352/b8393e37-e474-4c61-98b2-4ca59dc9c4d0","VERSION","LMcK4RszX4sHdrgzyHb8lyRG03GfVbsW","true","2026-02-09T11:04:07+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787352/be8cdf42-d6c6-4c01-a828-590b8a887b22","VERSION","IZJTCMAINuM1OMPrsLHswEcF3qBexE6b","true","2026-02-09T11:04:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787352/f014f558-1148-4995-b559-13689e4d709c","VERSION","HS5.IduCNmCXrJ_bY2UWLB7D0VHtcr.T","true","2026-02-09T11:04:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787360/0938f82a-9cf5-4043-988b-540142958ada","VERSION","..47jejCCt57.19RS8OI1_u.B5_jnWpK","true","2026-02-09T11:04:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787360/58a6b859-0e7d-4df9-9540-337b118bc33e","VERSION","T84s3UUvROTtw_7avvebObxuCtG_ktc5","true","2026-02-09T11:04:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787360/768afac3-4372-4b5c-9e20-b8917b863f5f","VERSION","hwKB97HJxpieGYf8.hxPS0wMjx_bMYtU","true","2026-02-09T11:04:08+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787360/b15b5eb8-e3ca-4cda-b53a-6a2dc36e41b9","VERSION","lJNRxknxU1Z98WwHhV1U_oAEKIio3rX_","true","2026-02-09T11:04:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787379/34df6020-70b4-407b-a16f-260becbc2d63","VERSION","6jyzAmZyrj0y740BTrpa.jJ7yJvO5MLP","true","2026-02-09T11:04:09+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787379/51d5479a-30e9-4f92-b657-79a49adba2d2","VERSION","5rZy12AedZROuohVkOL9d9fQXpxx31H5","true","2026-02-09T11:04:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787379/f32e991d-4b61-4f76-8090-20dbe7d00fc2","VERSION","7bYJVkIyl9p2T2R84sDLVyLXwSVHz3a7","true","2026-02-09T11:04:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787379/f44c464e-8997-4893-87b7-f2cf439898c3","VERSION","AeKOznp1cJzcIONRxKQQAbU1RG0dWXYc","true","2026-02-09T11:04:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787387/3ede482f-c9c8-4ccd-b0f5-a1d984ea43d6","VERSION","7wQbPh42MAgh2Gb00Aj7p0Szl1vWaGiu","true","2026-02-09T11:04:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787387/7035cdd4-cbd6-4853-89b4-bd7016db25a7","VERSION","iueZ7eH8L5Bz6qc20wBI0J2xYreWeqJK","true","2026-02-09T11:04:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787387/b110fd8a-c5a0-4a66-9c23-a6b2ff55a9e0","VERSION","lBq4uOpRvStncekNR1HddP1EggMyDPaD","true","2026-02-09T11:04:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787387/b7f0fb93-e5a0-498f-a255-7e4cf89358c1","VERSION","zUF0U3rEczrk7F1Z9OrpIv0YELVG5xh2","true","2026-02-09T11:04:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787395/00369675-b771-4a18-b7de-0b53a64a96de","VERSION","8kYDCUD7iHvh_9xd7MotwhXee_eotAe6","true","2026-02-09T11:04:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787395/1c1f2c67-25de-4ff9-855c-65a3bafa31eb","VERSION","j8cFLNwu93l9tXoxb6KITg4jXVS28BWy","true","2026-02-09T11:04:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787395/88eb036f-8ec6-4f43-9cf3-cf67c9ab59ba","VERSION","xACPYxzMKmunRpKL4tfk60opGfRGq2sJ","true","2026-02-09T11:04:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787395/d82e2dfd-90b5-438f-9003-ed264f1f19f9","VERSION","VAQVX.P4UlBvnW9vuYgiS5vvuVo8IfnP","true","2026-02-09T11:04:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787409/1dd66c96-cb8e-49f2-87ba-858fabce6dc5","VERSION","w0b3XlXRJpmc0Gh8PjQ_IMaN_xMgpFIU","true","2026-02-09T11:04:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787409/20ff72ef-a279-47d7-b8dd-78cd2b744efa","VERSION","s8dGYp3lZ64tccKp7WM8OQ1735hpA8Vq","true","2026-02-09T11:04:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787409/27f050be-5c8a-4ecc-a477-81f0af920fbc","VERSION","8mT5SeLcj03Su8Qq3aV8smkiKZEZskI6","true","2026-02-09T11:04:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787409/3b8a0e5f-5b8a-4678-881a-ebe2789434f2","VERSION","A74Kh643CwLvtoFi8PJocQXbW8oyEtWe","true","2026-02-09T11:04:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787417/73216057-cb75-422b-aaf6-9deceed4ba92","VERSION","mxFhdnV32vTSpTaqrBs_7kcTfnc0dxR3","true","2026-02-09T11:04:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787417/766c7237-d7c5-47cc-9766-7c0737474c80","VERSION","16rvwxDy1MIRg9axkK87KrCRHR7m99Qg","true","2026-02-09T11:04:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787417/e771fa41-cea8-4162-9547-bc2032aee8a7","VERSION",".fLFHP6sEk59uG9CWg.tTdm8A4gPHwyL","true","2026-02-09T11:04:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787417/f884cded-8ba0-4920-b28a-fd2799ba1bdd","VERSION","mihif2OU5B2NjXu0INVJmi_KftBm456y","true","2026-02-09T11:04:12+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787425/340a12bb-5ba1-42c6-9de4-2a3412ae8ea4","VERSION","A68NUxZ6Pm_pDKIx.DvUsyN6EBCwJMVN","true","2026-02-09T11:04:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787425/6631a035-8b4b-4e69-a5b8-0d2443de5a7b","VERSION","fO50KUijCrX_dhGSOBzLHFGjZyulfR_Y","true","2026-02-09T11:04:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787425/cde619f1-540f-4b8a-9ce9-a197790db846","VERSION","2r0HgnkOuYar1NOJN8XJxdlvDNyU8T7V","true","2026-02-09T11:04:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787425/f17bf39e-f938-4ea4-82a9-8eb28d454540","VERSION","CBBba.f_5bQiIuy9.hwtTS2aaow_bTG8","true","2026-02-09T11:04:13+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787433/22d700e7-0329-499e-9343-a2416f78a4ec","VERSION","YZtikIAuQlLNegab5XW0u.6WNSBUN67w","true","2026-02-09T11:04:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787433/737c3916-f4be-4fed-a8c7-f105e9533c2a","VERSION","6QPjVaoQbnfXuKNVxCkijUj6mGbUKciO","true","2026-02-09T11:04:14+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787433/afb41ba5-8ec2-4995-85a1-3ed7df88a8c2","VERSION","SwMtrAClfmVQlpm.G9tFiWVBc4mhp7jv","true","2026-02-09T11:04:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787433/f7d8abb9-726f-43d3-bb21-e320588bfe3c","VERSION","HshW_ID8ngKk1WMYWhrxnF_GDSKmNcc7","true","2026-02-09T11:04:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787441/1ed270b8-f8c3-4f5c-9fc7-e880d7a4a509","VERSION","CeTdbhhkQrjSLJ_tQOJ18HIL8nVFY88d","true","2026-02-09T11:04:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787441/880fdca3-d91e-4209-882c-5046472ccc0f","VERSION","Yu6hnzwUkeumMVfOycT_CY6kqL.v8Bb0","true","2026-02-09T11:04:14+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787441/a207fde7-cda6-4c95-9473-9525f8b1d73b","VERSION",".EYKOOZNd8PxrZylEup.BkqmFNdHYe1l","true","2026-02-09T11:04:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787441/de32e9f1-7c30-4d27-83cc-1c0db4052ae5","VERSION","kWm972dm4sNK4uNJFDQl5iRQihi6o4SM","true","2026-02-09T11:04:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787468/35ce536c-2ea4-4282-96ec-41f507337baf","VERSION","XlquVZDTMposgZS7hAdJtHD2t5pu4zvr","true","2026-02-09T11:04:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787468/3ef8dff2-f205-4e05-8405-3623f7d42e1b","VERSION","W8DhUUvvkKcng0rsuaR6B0tO8xW_4ZH2","true","2026-02-09T11:04:15+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787468/4ea43c2f-2248-4d36-8afe-fbc58ad38484","VERSION","OGULCL3PgCbYTeBlCvvNDSkqHaNx.ACg","true","2026-02-09T11:04:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787468/6d686a3f-41fa-41a1-a4ba-a9d362192345","VERSION","3Sj.CRnvkINaJP0Q8F48GvGIVLsnJTKW","true","2026-02-09T11:04:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787476/89c76f32-099f-47a0-8b60-8ae1c77bf164","VERSION","LTqdQF88V_rj4T9Uo0VqKb9nlZIp.jrq","true","2026-02-09T11:04:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787476/aa01a935-3353-4184-9976-90cad3e5e2df","VERSION","7pnCLtu7L.Gkxh161SNie8rWgtjL8mLk","true","2026-02-09T11:04:16+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787476/b9f7f267-ca8d-405b-9b9d-84a7d4c29088","VERSION","E0tsWSDNV2NnJnQAqsoLmq8GbX0FGGOI","true","2026-02-09T11:04:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787476/f9a093da-0720-47ef-bc0c-d5fca467e55e","VERSION","QWfQysVR9tIlY1A3c3OIxFm9FScaqHtK","true","2026-02-09T11:04:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787484/43e5688c-b56f-49e7-b28b-793c7de01a04","VERSION","H4rM3wqamOZa8hacdhA1MON0wbmLhA4B","true","2026-02-09T11:04:17+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787484/5dcc0e5e-fa31-4d98-b0e0-ba4e59842b66","VERSION","aUyCr_AAkPjaiNiXuKYm3rAlw_oQXVhv","true","2026-02-09T11:04:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787484/6495e15f-b4af-4d65-9c7b-a810b43d2225","VERSION","T4szx0jueVrMTaBFfCVIIfbRA2iL3Lqs","true","2026-02-09T11:04:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787484/7a2d3296-4d2e-4e69-ba04-2959c202db34","VERSION","SXYP.kStFdKz1DvmAkbLEhQ3Eij2LpwW","true","2026-02-09T11:04:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787492/3967023b-3762-4f80-9f41-1830e74e20ab","VERSION","kNRq5YhCCkMy.IW3vfQbi4QVGdeIMiWS","true","2026-02-09T11:04:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787492/43ea4b0f-fd31-4a11-9491-dc150a533e4d","VERSION","w.mbJqceAzs0jiC_KAwx7PXIxgvUI2Jk","true","2026-02-09T11:04:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787492/d5026249-098a-4c5c-8b0c-edc27045234f","VERSION","5N6PDWkBVY7XZBXh_LmTbQ71D4rNtf1.","true","2026-02-09T11:04:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787492/ea690e3c-f705-4ea9-a35b-b6ebd625e2cb","VERSION","agCIfTjNe4CZoo0c9HO5F5XJcro.d83l","true","2026-02-09T11:04:17+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787506/2e727b4d-e36b-4319-b477-2ec8ea937f06","VERSION","x18RBwB7ry8DxkC7R_gVn5XeiM0ZjWJp","true","2026-02-09T11:04:18+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787506/5cbf3150-d22b-46e4-9e54-5213ea41a1ec","VERSION","UIDEa2MFPVkcUuXDaSmdR.NtfbN_JX74","true","2026-02-09T11:04:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787506/d0b67fa3-6c7c-47bc-b306-ead982603b08","VERSION","rGQJ17aD5O1rDzhQ4D6bf309fJDEv_hi","true","2026-02-09T11:04:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787506/e28a3e98-2f97-47c8-9379-50e72d6090ed","VERSION","ZXFzWjQna9YO6cUbMxWfFpu1IDyBJmb8","true","2026-02-09T11:04:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787514/4725bd0b-3e17-4444-ad73-e381ecdbed21","VERSION","6IbX7JqTTL8dSEdDjGj1lAm8xGC1o264","true","2026-02-09T11:04:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787514/73420715-85ef-477f-9c76-2933c112ed28","VERSION","bOAYBoCisG7jWjXRGhm5U0F23QZzlJ9r","true","2026-02-09T11:04:19+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787514/a20604bc-755a-4025-94b6-3a5b832dcdf8","VERSION","COoc7s6c7hDCJAMM_y039apiLDkYcJCj","true","2026-02-09T11:04:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787514/c013ff98-6ef4-4edc-b0a5-39687b3e15c1","VERSION","x24XGO.ZKp6FAbJ3SIK3fVnY1PUq6Yf.","true","2026-02-09T11:04:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787522/54080ac7-6350-47f4-93c7-5fb27c34f74e","VERSION","xOT9hegK5CYwf0Ra5l_ANQdKSHGtq8n6","true","2026-02-09T11:04:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787522/8badc026-a3ea-4c5c-864f-c26d8472eeb6","VERSION","5mC3vF6uwkd2rrBwObQccbzKuC19WXPl","true","2026-02-09T11:04:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787522/afa73d9d-f061-44be-ab6e-c822f183cc76","VERSION","JdTwYIkRnE7aJ7BywT0ZBaANpE_K77nk","true","2026-02-09T11:04:20+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787522/e0893221-d6e6-45c0-9458-4833e7f50c3b","VERSION","Sv_vDP6PtFv4icf1ncgMCRuJVThyJxy3","true","2026-02-09T11:04:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787530/17237db9-96d8-4f8b-9d8b-e1e1879e7bb1","VERSION","E5AZnultC7BGwyGKP.0ztfydOGVyi4uT","true","2026-02-09T11:04:21+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787530/25c1e7d1-6e7b-4ec5-8c86-dc210576a329","VERSION","kXU_gNkErYuDEd0g6hlYWeIT3pGqROKI","true","2026-02-09T11:04:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787530/9c771f53-c628-4ede-a910-3535f0459228","VERSION","OnESFJXEodbeyQhYn7opqV9dzrTPSQu_","true","2026-02-09T11:04:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787530/a024ae22-bba0-4bbc-b8f8-5b7b0b611a95","VERSION","BWX14E.2sGqFpyXalML6i.J5405vN2N3","true","2026-02-09T11:04:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787549/006c1358-87a7-493a-bace-ee8f79009770","VERSION","cHlXqXdgZK90dqFcZlVdmvhf1fjDd5l7","true","2026-02-09T11:04:22+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787549/a568f20e-0af9-46d3-a5e4-007aa29a0f70","VERSION","iVPWnRjD7oE.QBgz9ASwnzjFtpXG78Tc","true","2026-02-09T11:04:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787549/b5d66d2c-35e5-42c2-98ec-727df9331099","VERSION","w7nBOmb2tJAWGd0RmeqRSh9lCaZH0Gyb","true","2026-02-09T11:04:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787549/c11a0598-ddce-4792-b6a7-b25925b861e6","VERSION","3XHhDwASQhz0.OyJdblUL5sIYYjw.8j9","true","2026-02-09T11:04:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787557/232a6d83-3ec3-4f82-9758-b18047d7c600","VERSION","4r_vk3asNrDlwHyF5a_9SUTuW91.7bwC","true","2026-02-09T11:04:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787557/2a5bef95-1338-44a0-b45a-6f3c0dc01ea3","VERSION","RX1j.alhNixLd2JyUNp8Ej2QNWcAwTk4","true","2026-02-09T11:04:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787557/72b9a7dd-f0c6-4835-8f49-738f63fc0838","VERSION","gN8R7tzMhNFGFPjGuUgpvIaBlj1R_PC2","true","2026-02-09T11:04:22+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787557/ec3d3239-2be4-4aa7-b17e-1c55d65ad412","VERSION","38lUWBlkIeAtDrltdfDUYDVMtKL4._kV","true","2026-02-09T11:04:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787565/0aad7f0b-195d-4ef5-a550-39ff437da0c2","VERSION","lfLI9bdaDxZLQriHRxhlhb.t7_ZH9EQb","true","2026-02-09T11:04:23+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787565/892b2712-1d84-4f5d-9dab-1fe323ff99ff","VERSION","Y9ycnOfNlUiSbh7aQhfS.zA4.O2EeUz8","true","2026-02-09T11:04:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787565/8baacad1-57a4-4b74-855d-3f6838b7bed7","VERSION","TNIK.VYlAOymxLurzQ.lYZILENuFcqTA","true","2026-02-09T11:04:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787565/b92db62c-a537-45e3-8827-5f04459a60ea","VERSION","_47_onKif58SPcSrbUOVHHZcmRPoMS6P","true","2026-02-09T11:04:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787573/34386dfa-349f-4b78-b015-0d3bf6f134cd","VERSION","ey5mfn0ONbWHF4qOQcqDTP79p9kbudsI","true","2026-02-09T11:04:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787573/3a88a2f1-2483-4c6b-9fc5-9cab6af4dadd","VERSION","U.4oP1dk9SyT..vqEy6XmyviFGhuXxf9","true","2026-02-09T11:04:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787573/68829f94-7b01-4178-b321-c879a3d7edd0","VERSION","yJzxOJ6zuG1FRxzZ9LmLCMDrJOcMRXWt","true","2026-02-09T11:04:24+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787573/d3290ca1-11b7-4153-9952-c18fc61d2b05","VERSION","LxLRaO76tB4.qUZ.hjZMKDMinmhiQGfQ","true","2026-02-09T11:04:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787581/15d66788-a653-4c46-971e-bb4d9aa1cde7","VERSION","45C5hqfSOS7FrTCgfigFHwn8v2h5nCkl","true","2026-02-09T11:04:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787581/6c123a82-fac3-4bd6-9e87-45d361527ef3","VERSION","yBJdtr0tyyF1o42bWdNPUxzI.ln.JuMZ","true","2026-02-09T11:04:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787581/729ad02e-1f06-4465-9d1e-f5d699615837","VERSION","nQmeZAb7vtHcdX6b2cGbKVppuwxIO2R0","true","2026-02-09T11:04:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787581/961db7a0-f472-48df-86c2-9a05e1a92d91","VERSION","HyX9H_1wt2q3if4qFd21A3eHnyU9TksQ","true","2026-02-09T11:04:25+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787603/4bab2ff0-c0a3-4e20-b049-1f1baab6f69e","VERSION","ADhFjcMC1.STqrU9jnlD6RsW4N8mheqR","true","2026-02-09T11:04:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787603/508683fa-a8c5-4cfb-9d40-24fa34e8caaf","VERSION","UOuGW8tQcYsBazfKSNT.CMbJMuJSvAdH","true","2026-02-09T11:04:26+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787603/e0d94df7-e249-4ff9-84f5-a3489c35ed85","VERSION","jngI6YaZq.chJWH3SXFoQhsP4o2eDHuk","true","2026-02-09T11:04:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787603/ff01b4ca-6dbf-4d93-9097-4d7e62100325","VERSION","X2WqTrIsTq9bW3UjpL7TyBQZW5iTqxPm","true","2026-02-09T11:04:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787611/33ec82f7-310c-49f3-a078-e83b860f7dd7","VERSION","rehDFSBdcVK0jb99mt6VqrrPkGxbJNqq","true","2026-02-09T11:04:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787611/ab43c953-9deb-48f9-bd8a-0501ced99acf","VERSION","SRUPupoOI0lOPDW28l3gpaLJJrqgUkMm","true","2026-02-09T11:04:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787611/d7e5c7ea-2c0d-4b71-8feb-703ae35afd77","VERSION","bNassaZJndMOt9aHb6wD6dVGfpfNQFF9","true","2026-02-09T11:04:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787611/f40f8408-ec4a-4cd4-9414-68086c07c882","VERSION","FeDSxeY91anKGF4VoSDIRX6okQzeO5Oz","true","2026-02-09T11:04:26+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787638/5f119bd4-a1a8-451c-802a-dc9a4df81cd8","VERSION","BzOISdz4mzCYJX.jdB3L7F_nrQsfC7Oy","true","2026-02-09T11:04:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787638/9b626639-8e76-4b8c-90c0-ce8c5f5a3c1f","VERSION","AmeeihdvrvB2vsbjhPX1u6goKLN45Z7S","true","2026-02-09T11:04:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787638/d92e1183-4d4f-45a3-91aa-6b4648b1ae4d","VERSION","WAM5zCQmm0xiglwNBxpCWCU47og1jfSu","true","2026-02-09T11:04:27+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787638/f1d472ea-df6b-4bda-af81-65aa5012db61","VERSION","9wrjPSHFvmG3ka6VPLpKKYv73R6t7glS","true","2026-02-09T11:04:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787646/0022d3ca-81b7-4846-a896-5d051d831f90","VERSION","yqHDxAYw_ka198MQIRVAJQ3PrnB61aR1","true","2026-02-09T11:04:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787646/71624ac9-4b33-41c4-a16c-f856b5cd1e81","VERSION","zZD.AZr_4pUS.pWa3QwQcaTfFdEBkgi5","true","2026-02-09T11:04:28+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787646/7e07b9ee-0a80-4dfe-9e1a-0fcebbd69ff9","VERSION","ycwKcWq6jYNgPUwTg8jYaVNYZHrqS1CE","true","2026-02-09T11:04:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787646/c9147a85-1d0d-492d-8c87-ec613df0ac1b","VERSION","3KSZGRGQbhxWYbKnlJllxxjGKy5FCLGo","true","2026-02-09T11:04:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787654/1291e185-b2ce-4294-9c5f-6fd47ee77178","VERSION","mBB8o1341Y2rrK2XCDDEZwo_RDRcBEn2","true","2026-02-09T11:04:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787654/2887de0f-a1e4-4f92-97dd-2aeddef910ce","VERSION","M.ylnvkLO_OXCwh96zCijji.JNYD0Sf5","true","2026-02-09T11:04:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787654/497ca7db-43fd-48ff-bf0c-679772ee1757","VERSION","jWbNjdvuxuCLtywcOX0f_Q_XUcSx2e_Y","true","2026-02-09T11:04:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787654/ae72a221-b3ae-477f-b4c3-f219239718b6","VERSION","YbET2Mu0eQ7btZw6bVsEKCTsU9azzVIP","true","2026-02-09T11:04:29+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787662/338752dd-d8b2-4920-87ae-7d38e31fc4cf","VERSION","NZZUPVM5ppK.31sdpbN6NFk7naZzVKf4","true","2026-02-09T11:04:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787662/663714d6-9116-4949-bb91-afb0bea52ac8","VERSION","I56VRND_8oFI_4fXzH0IW1K_nAnXrQrX","true","2026-02-09T11:04:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787662/85d58ba4-6072-46d7-942e-45ab4d5863be","VERSION","RzW9pgWgqBQxpt0r84b0jinMZs87S72i","true","2026-02-09T11:04:30+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787662/d60c3b7e-2463-4a0a-b9a9-319bbd5872a6","VERSION","NAlAY24FDP_9wriFuiNEO319.m1sHE8B","true","2026-02-09T11:04:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787670/2610eaa9-0607-4ee3-a0aa-ca7f4bd36c80","VERSION","pgs6_e3aF2zSy_lZejgP7G3TEFP235GN","true","2026-02-09T11:04:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787670/3d863e50-1065-4870-bee1-12fb16273915","VERSION","i5HORf5E02G04XYi1sfCNwsutTtTrp8o","true","2026-02-09T11:04:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787670/45477684-08ae-40f0-be04-b070c275e1b1","VERSION","reyWMgsqGwLfRvVUVayzAMpPwun2xykn","true","2026-02-09T11:04:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787670/897c25d2-1ae8-4974-91a3-fcaf488da03e","VERSION","ybJZJLLEtg4gRq3FJBWJ6zZiMk6MbRxH","true","2026-02-09T11:04:31+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787689/5a48e4bf-f9fa-4295-b7b7-609d5483d679","VERSION","YJ2Afecja_VRJGBs246Y7yZR8Dyr8AaD","true","2026-02-09T11:04:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787689/99d93316-c4ec-4b5f-b80e-80b41f3d2cfb","VERSION","q4DNErwZkc0V1Zpg5.UkC0G8RRqoFp3B","true","2026-02-09T11:04:32+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787689/c41a7f1b-71ee-45b0-826c-c405ece336c5","VERSION","E.pMyU1OcxVpKU52apzOvQOQOLOtdqBV","true","2026-02-09T11:04:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787689/c54ba598-745b-4552-9056-5a3e05b4e6e4","VERSION","oIS0pABlFlc0lcwfMyGNQd7hYpnAfBMk","true","2026-02-09T11:04:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787697/45aaa698-7bc3-4a16-a327-3095598900ba","VERSION","p7LTSziGwriNDo7w53Bo6uMIQFEo5NZX","true","2026-02-09T11:04:33+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787697/46ba6c69-ca7e-4892-b110-6f565202d5de","VERSION","LiZCYpgdMWumJnZqNYvoV8JFBsaxMNwV","true","2026-02-09T11:04:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787697/ad726d60-07cf-4586-9b1a-1737c82cda64","VERSION","tymV7BehHVVSuXb_.foG9CFAImh8EgY2","true","2026-02-09T11:04:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787697/e02fbe4e-e01d-482b-932d-6e8ad44236c4","VERSION","KmBRTYIo3njmtUuJcMNM86dRuuqhq.iT","true","2026-02-09T11:04:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787700/1727e345-a8eb-4baa-b140-f8fb3b96451d","VERSION","Kb6IK3J1IOUTzYCy_8p0JjW3EmDa6Dvp","true","2026-02-09T11:04:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787700/51ff7457-6f67-4f4f-b382-a5ba46d5e773","VERSION","zTlWZQ.rEdZMFmnA7fHXZqre8fjS0Z35","true","2026-02-09T11:04:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787700/c14e779d-2c52-4532-9566-98155a85e853","VERSION","t55ZxjSwhIHrDvcQkC7XdiaNO7uoo0mt","true","2026-02-09T11:04:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787700/c56a03f7-947f-42c8-b080-187075ab651c","VERSION","f1y7xstzGkK.4kk_v2EdtciJA72hoOqj","true","2026-02-09T11:04:34+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787719/4b88f251-a4ae-49c5-a67f-b2b5653c73f0","VERSION","5danmD7I1AEcM5UIHMFuCW37jMl5Ubn2","true","2026-02-09T11:04:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787719/7f5cf099-7e80-41ac-93e3-667a798361ea","VERSION","TNUfevXVanplyyz4VCWWh8SfJ17Ec1qL","true","2026-02-09T11:04:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787719/d56fc4ae-27f2-41cd-95d8-bb95e61acb55","VERSION","xL3vOl2ERDHL7FrYgvcISmJ49nAyCjl.","true","2026-02-09T11:04:35+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787719/f1ddbd59-9b45-415e-b88d-f2fdcc786e87","VERSION","xCxV.dZ5V8eDmm7tPaSxANdoU.JsQQq1","true","2026-02-09T11:04:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787727/0cf5ebad-82a0-4593-a12c-0a90639d4a58","VERSION","gVcXVcSL3WsBVqbnMPwv6wNt.RA.pHJA","true","2026-02-09T11:04:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787727/300a526e-5d80-44c9-8673-29a5c6f3a49d","VERSION","Tq25LDnEZGILeN4LxwzA38AbFaWQfCpa","true","2026-02-09T11:04:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787727/85dd38a8-89bb-40dc-ad84-e8c7b120a6b2","VERSION","ByjggVQseyqZActxavst6nh6xjWXsc29","true","2026-02-09T11:04:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787727/f7013c5d-b1e4-421d-ad85-0bf5f25a2a2a","VERSION","4DRo5L9YyI0wZ2xp.VIYEkJapNAQ_7jZ","true","2026-02-09T11:04:35+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787735/6613579f-19d8-48ed-8f54-973eab63a4a3","VERSION","S46Qo2dQdRSA1qB4McI0Uhe49vXvCPAG","true","2026-02-09T11:04:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787735/6c3c3128-367c-4031-a48c-cd1242ffa35e","VERSION","Z4LW6OBf8dENpT._X4lo8sgUnP0J3LxG","true","2026-02-09T11:04:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787735/753e25ff-bf63-4745-abf4-96c3ebefda8d","VERSION","1HdvcSLYtk3IxG_UbvGqVG8EKX5BiiLE","true","2026-02-09T11:04:36+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787735/ba6ff9b6-0cdd-4dd3-a080-793b7049d7c2","VERSION","0tPSGGlt5Xrzv5x4NGjC7lEJQGA_ZWAS","true","2026-02-09T11:04:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787743/1cc522b0-f554-4207-bd52-73ddf2d9a699","VERSION","rFczbpxA7d1QSYvGGeU6whxu4sQaiiNJ","true","2026-02-09T11:04:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787743/378b7c63-c1f0-4ae2-a16d-36db4a401c1b","VERSION","KOE4O3cjt6x3WtfCfDe5VttHgtEfaqJM","true","2026-02-09T11:04:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787743/6cbe2772-bc1b-47c5-82fc-1b9f2accd458","VERSION","iRxzTY_XAZEEHgwmbJQgozlKJYUAu2Gj","true","2026-02-09T11:04:37+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787743/bd389783-bb93-497b-aa5b-7c8ed914774d","VERSION","jnw47MjvtKnLm7i2n.z_YNlwuUqqgHQz","true","2026-02-09T11:04:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787751/2ac848f5-b7cb-4536-ae4a-1510168c1a35","VERSION","HjvrjzrWOVCDkFg73LPYlqYKEuFNVHy9","true","2026-02-09T11:04:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787751/6700bf53-baea-417e-a324-a4e2166deb28","VERSION","MnyW2Iv.OYTSlbieYdZbiAZdqhDCpyF.","true","2026-02-09T11:04:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787751/91397d07-de55-4418-b1aa-03cbbe7fc02c","VERSION","69vjYcghm04b4adBGoo352utCz58eH5y","true","2026-02-09T11:04:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787751/92ad22ac-0f1b-493b-8416-17838725f202","VERSION","nryeCamwr1kFFoNOItJlevZhLLSmgX7J","true","2026-02-09T11:04:38+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787778/196429cc-a7e9-4fee-ac9b-73501ab185d0","VERSION","WHKu.I.Ms5AGZ0cwppcZsSynqy5UkbZV","true","2026-02-09T11:04:39+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787778/6a69d510-2d64-45b1-b988-9cf7bf5a703f","VERSION","TFsW3rTb7Sk6dFFrjJkbsqXsExKrfISC","true","2026-02-09T11:04:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787778/808d4fda-5cb3-463c-8ebb-cd70ed16b11b","VERSION","wIiB8YuaGWRjaXn5Ng500XN6wJa3geMI","true","2026-02-09T11:04:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787778/d56858e1-fec1-4745-b4d3-454ec1cb18ab","VERSION","D__vLdGucDqTeHxfRy8q6a20cPT8FFN4","true","2026-02-09T11:04:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787786/16e59f51-d62a-4b5d-a18e-bfeb8b163e41","VERSION","YzYGENwCJGja2TB1bzY8KaY_VcuHQ7fo","true","2026-02-09T11:04:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787786/35959497-2880-4b6a-8945-30e1068d5ad2","VERSION","aq7RUHx59nqHy6OFpHrwF.mT.10oJ9c7","true","2026-02-09T11:04:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787786/6fbb3c60-343b-44a4-b8fe-f97e2bb06e12","VERSION","rOey6hG61PqSJc8DOC8GHQaT_hWPgxOv","true","2026-02-09T11:04:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787786/e3c603e6-408b-42f3-be71-34ea9a8a0a7e","VERSION","QzV3ximl_rj9zqrr3eP8OQ9NeY1xwAu3","true","2026-02-09T11:04:39+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787794/2a132f02-53e9-46d1-8f05-f12580529e0d","VERSION","fyxeerRB_Ovhev5xMHjWXH8BLIkDR6OI","true","2026-02-09T11:04:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787794/5f239eab-fdd3-4896-b423-8d860b15e762","VERSION","boQtXy6_JJw_xat_sgUdaCZNqmrvwR8r","true","2026-02-09T11:04:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787794/71473aca-1cf1-4128-98ed-9b49417374a5","VERSION","Q2qQPJ12mpQeyRHxAPmN90LowPBDRBx3","true","2026-02-09T11:04:40+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787794/8e7ab022-d2d1-4e34-ba55-79f897017daf","VERSION","WDSUzjcBakIt6puD8krG4ra7F7n6hklB","true","2026-02-09T11:04:40+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787808/0fb1003e-deba-4d21-9736-1e9a3d6323fb","VERSION","7Cq15CG5aTybXlbSv2vBWHzfoNmr7UJR","true","2026-02-09T11:04:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787808/21846a95-dc11-482d-b656-89116d8f4bd1","VERSION","sazZptqnaHBXh6E59OCakLIySWf2i.4O","true","2026-02-09T11:04:41+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787808/39b881e4-ca59-4eb1-92fa-17cc7028dab6","VERSION","pzPxdpjWZxcKQ7wk0UmrAcxcDtrDJst6","true","2026-02-09T11:04:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787808/c261fdb4-556a-4c2f-b343-64e7607b43cd","VERSION","9P2BkUpzDMfRWTs7p9YYR0uke5snF_Jd","true","2026-02-09T11:04:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787816/6366a769-2941-4a0c-aa8a-c97e541d5024","VERSION","Tdec3MnmTHRaX4jFSjulKWsg8jXZ9wno","true","2026-02-09T11:04:41+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787816/8cf8dfec-6ab3-4fba-a828-d583e2e13bb0","VERSION","uOHqTNG23UpmOpqHTqfvoZXGdAL8Bdq2","true","2026-02-09T11:04:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787816/c245ecf2-54e9-4835-8ac3-176f43643d79","VERSION","_KUMvkgXVoBQY0oweoqaruanG.ZSEAT_","true","2026-02-09T11:04:42+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787816/eb01f7ca-b10a-4864-8344-d663820ef876","VERSION","._dBg12nJfkzf8jILyFVk2J5wOAh5Ufb","true","2026-02-09T11:04:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787824/3278a8e0-daf5-4e9c-94d1-fcd93ea008f5","VERSION","2pgGWmNcQpaAOLXA2xI8ZrjFZhS4uDn0","true","2026-02-09T11:04:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787824/5764c314-66f5-4a71-ab29-886a87bca627","VERSION","tKvgVQBo6UGsPCoqnAsPsynpyshkT.qT","true","2026-02-09T11:04:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787824/5ba0fbb7-0f97-4534-b3b5-330504ff4dca","VERSION","JrEDWZJMQjNuHOzdNyBwpTxXJXFjIh_d","true","2026-02-09T11:04:43+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787824/9dd8f57a-22e0-4826-a5b6-390acc3d1f99","VERSION","PmDUcjy1DJiWy_ycQfhGD0Kd2PcvWX3f","true","2026-02-09T11:04:42+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787832/2675699a-09a4-4ee3-8414-8c46ee381688","VERSION","dhDMq10dqAG70T9xJR2Bc3_0peofqVHc","true","2026-02-09T11:04:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787832/49d0dcc2-7ab2-4cb9-b220-e8d7f44c23e1","VERSION","G5QnWrniUyvvF6MTlHF.LrbZNDpMQxes","true","2026-02-09T11:04:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787832/54987673-d27b-46ed-9fcb-3c69381e309c","VERSION","Z_GO0StCBPrqBxzulrIeYSTLvQO.rLEy","true","2026-02-09T11:04:44+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787832/f7e4fe7c-7681-4772-8952-b6f1bc46e767","VERSION","EoKI6CBX8HJbzrEyfUsmIle.yYr3Lwbs","true","2026-02-09T11:04:43+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787840/10887898-661f-4b15-9728-0661c8f3522f","VERSION","T0s7cu3WbNMV49x7s5SM4k6kRswqpKiV","true","2026-02-09T11:04:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787840/40b7fbec-02d3-4803-be52-71a064c35154","VERSION","o3f4p3RaoxNf1l1KV96jSTtj8qG6q_Y0","true","2026-02-09T11:04:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787840/473169df-61a4-4cbc-b365-83e96cdb840b","VERSION","bGeWlZopHYSK2GppUcGEe_HPkMazbF45","true","2026-02-09T11:04:44+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787840/c37a6dd2-f119-47b8-a60e-bba0146a7644","VERSION","M8FxJvaGK1O8vK.9wtti0aOVhHGieo1R","true","2026-02-09T11:04:45+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787859/59083f22-a63a-456f-a9df-e6a5fae22244","VERSION","jw.YUV_ixs4LPeDfW9KdhyOcuGM5wQw1","true","2026-02-09T11:04:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787859/a032340c-11b3-4f8b-8f83-2b21f364155b","VERSION","4Jgip1Tel6Te43F5CctMOp9EebDTaaSS","true","2026-02-09T11:04:45+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787859/c8832544-bf99-44a4-ac28-eb3a7ec79704","VERSION","yJFLwdxMyUU.54DqrJR04jwKMJBreU4z","true","2026-02-09T11:04:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787859/f5e52899-14dd-469f-bb16-c2cbbd036b7f","VERSION","uuQe8JnAIP0c.jwxoQIPGcv5O6iU8AJp","true","2026-02-09T11:04:45+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787867/17b48988-8cd6-4c2a-8661-8a9ce36d130d","VERSION","TxiUNF1WQx2324UB_ei4s9PGCb6NBalB","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787867/30d3e036-c074-49fe-9ade-eaba04ca30c6","VERSION","viq5zMzX7SstC5uyMq.wsNAH4Auhekps","true","2026-02-09T11:04:46+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787867/48cf9e28-9329-421b-889e-682ba684b0cb","VERSION","LpKCpdu6biz.FPxt9.F.F.cJVQATtPDJ","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787867/edadc080-a4b7-4cc0-a3a5-05abc9b2f4d2","VERSION","z15bNSgIA9..6CH7CPuMYjAJe_Usy7mo","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787875/0f31abfd-e373-4c48-9082-3362cd6e01ff","VERSION","b_zVNcQrzIxHxafRezU0NiDqAk9EvIjO","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787875/3ca8fe72-12c7-4cd4-ad05-25da8d6f2cec","VERSION","dPJUMSz6hKsJPyf_ErDbXEWg7b6GT1WD","true","2026-02-09T11:04:47+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787875/f0436581-d8c7-45b9-a2b9-8b3518c65367","VERSION","QFeIJS6E_tLkNcoQdlkV.FWmKN95YdMt","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787875/f97a5af9-d797-4072-95d3-3c68fb14443f","VERSION","4het9HtekJGPAym20OHtyZXFX18Hpex6","true","2026-02-09T11:04:46+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787883/0fd7cd68-f46b-4091-b13d-124fcfcd9d0f","VERSION","zJqzPyPoOOlS0LjQOKH0KshLakNVaoT0","true","2026-02-09T11:04:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787883/29943a71-a17e-4b7d-a834-59dbed3c3a81","VERSION","gTqRAxte7D.VHcggPpjOTtgYflO5IWZJ","true","2026-02-09T11:04:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787883/5218557c-b40c-4a6d-8cff-17abf50bcb1a","VERSION","vioubYoKbg1kEtfjN8.ZbyrV6PSv8rZ3","true","2026-02-09T11:04:47+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787883/c725bede-de13-43ef-b77d-f816aebddb78","VERSION","WKkYfZtd3xZOy2gy4UsO2szjmBhr.2Wa","true","2026-02-09T11:04:48+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787891/29d59165-2a71-4050-a8f3-7e4959def454","VERSION","8pVBlscEvs_3UFlGZ8h4X0WwjgBk6VFv","true","2026-02-09T11:04:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787891/588babfe-62a2-48eb-9da1-a6d1eccedfef","VERSION","r5NZ2ku6WM_LFJWy5Sv2JrZ38uialhVp","true","2026-02-09T11:04:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787891/8961725e-66c1-4e07-a86e-d1ee64cb4b99","VERSION","18JAka9aNsgNS7nV6ggcRW7UW06bkDIB","true","2026-02-09T11:04:49+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787891/e8c90504-da8b-4d5d-ad86-82629ac5e633","VERSION","wdc.z3qLQuZ4s0D4FhlPP50Hvq8IZ2ai","true","2026-02-09T11:04:48+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787905/1555a43f-52d7-475c-bd28-006fd1e50ce7","VERSION","pKH._S.H_xeIDAX6dzCNzj6.h9rKiqsD","true","2026-02-09T11:04:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787905/472d263c-11d6-47fc-8c25-056343eb1165","VERSION","3hkqoaiCkRdf02MyrOO9k57pTHhcl7ZV","true","2026-02-09T11:04:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787905/9779891b-4d06-47de-86ed-2098fdd7058e","VERSION","6qbiGRVomhPzFFLiAoFN4vU46rEKx0KJ","true","2026-02-09T11:04:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787905/ca72d9e1-7f4f-4d79-973f-dac0e6eee763","VERSION","M7A3XZo2StIfcLVClaUw1N5I_O1YXUpc","true","2026-02-09T11:04:49+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787913/03e7053b-01f4-4ffb-9259-be92e68fbaed","VERSION","XnVstQkiV_ezEl0kTSp_DU_k7coPSYRx","true","2026-02-09T11:04:50+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787913/04c2d02a-c32a-4f0d-bf07-73354de411c5","VERSION","eAgBeTMhrrJXFwILVLhQxd1OTH1HUJAV","true","2026-02-09T11:04:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787913/32624c63-d6e3-4770-9e54-5e919d5c23ee","VERSION","t.J1b8eWaIm5VZp4K1AA5cEWez_bezot","true","2026-02-09T11:04:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787913/cb6e1aa9-884a-470f-b879-d40572b69bdc","VERSION",".lTfFdZG5ixStQruNxOqSLrlVV5p77Eh","true","2026-02-09T11:04:49+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787921/0cc6f2b6-1491-40e3-a39c-5654dcb0ceae","VERSION","W.wY9CvfCHD.o3EYhCsRUEedIov5RPJz","true","2026-02-09T11:04:51+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787921/3bdd56fa-5acb-4e13-acb6-e90a1e57c888","VERSION","PwSA3_81JAqiJyFNTnIv3eciktaKuoOU","true","2026-02-09T11:04:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787921/de009a1e-e056-4c47-b181-8df3d1f28ad7","VERSION","6ASx7Ly0r_ZrchsIj5UanOQU8a0HcXEU","true","2026-02-09T11:04:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787921/fcf85e46-fe15-4a52-bcb2-45c755bd7e13","VERSION","oaDjvNe5U_Fcno7RhPXYjhws91smtP0D","true","2026-02-09T11:04:50+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787948/00c2123b-487d-4cdf-80b9-67fffa64b0d2","VERSION","twLYvZEVLqndnuLAQ4Piki3kq2Fu1ZZK","true","2026-02-09T11:04:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787948/78170cef-953e-4336-b2f7-c27268e26e03","VERSION","6HTOWJi_oB3TD45qgmH_5pqvfeJIY6lh","true","2026-02-09T11:04:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787948/90444c89-8488-4649-a54b-455db61ef0dc","VERSION","qSrU54.xAwuQRWWWEv3SV.iCrxS3Tc2_","true","2026-02-09T11:04:52+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787948/d449be20-a185-4f9d-940d-3cc7a07c8c1c","VERSION","jV09I9.Oo47oOLYGozztnirc4VLjOBx_","true","2026-02-09T11:04:51+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787956/6b0b62ea-4e78-4a0a-b6b7-e7269fd67313","VERSION","OARlc041QSoJT6MAom0yr.UDecAHp2zG","true","2026-02-09T11:04:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787956/6bb56123-1d4c-49f7-a1cf-ac25eca38942","VERSION","x.wI9UZmN.UANCKJ8m3AgjLDe91s5krX","true","2026-02-09T11:04:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787956/9944d9b5-cb3e-4d15-8518-885a1aa2b4d9","VERSION","jLT.1d568eDiizLCsVf6N98fUoNGI_M8","true","2026-02-09T11:04:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787956/a4d54975-07c1-491b-99b9-cd5a8da461bc","VERSION","QaPbf.nMB_5DANhawETQO3W762F06iz_","true","2026-02-09T11:04:52+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787964/d37136e4-1a1e-4897-8b0a-05a739ad90d1","VERSION","HldShr9xY_edzmYN2WCDN73w.skkMldd","true","2026-02-09T11:04:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787964/dc4dde95-1c8f-4db0-9402-0b1639e2a164","VERSION","syZ9SDunjAhuKX8WgOmb58NZvpfaCnBc","true","2026-02-09T11:04:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787964/e5670e45-b6f7-4596-8b03-ad91cec1fd71","VERSION","IExgTOlFJyJiRoh1iv7WOQlOc1VZBgTK","true","2026-02-09T11:04:53+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787964/f3ea92a4-33ea-4aad-8721-541339c188a0","VERSION","OIp3GzMcy8poJ4HcXQFsAk4nJlJdjEm8","true","2026-02-09T11:04:53+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787972/2da66636-600f-4f9b-9388-a1ed736ee0a0","VERSION","gEQjytTaTiXmI_uLhipmLuVUF0HRRxVd","true","2026-02-09T11:04:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787972/8f714c18-283d-4579-b4c7-5faeb8bd3c5d","VERSION","I.1oMD8R7z6g2pFmcb.uMPd4Nt.Y14mB","true","2026-02-09T11:04:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787972/b19e5859-c057-4e42-b142-a555dc5419b0","VERSION","dmcMyF1QLM.0a3V443_oasiaEuaCBSZO","true","2026-02-09T11:04:54+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787972/f035331f-6b75-42a5-a1aa-7b095352320a","VERSION","jFJrnoefzUP27Kg4i8m7piaVabfIek1d","true","2026-02-09T11:04:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787980/18b92f89-71f7-45ab-a6f2-83f6c3008c73","VERSION","xzvA1nGqEu2OrWx22hECaxiswfN2yN5Z","true","2026-02-09T11:04:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787980/4a48c760-6f78-473d-a9e8-a8a05d973553","VERSION","9gjYxsWX6ZwnBjIr3fykJxvVTxmZaRmH","true","2026-02-09T11:04:54+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787980/613fa1b7-484a-446b-bf31-daf7d93060cd","VERSION","UNxO97cxaBmsmWJqk5xLVUfQP4QTAJ9u","true","2026-02-09T11:04:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787980/a0c78e37-83eb-453c-b413-357a661a01c7","VERSION","7po9FaukN8t4uJUz1pyNPxDBzvx.QepH","true","2026-02-09T11:04:55+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787999/52f3c434-6d37-41fe-9f9b-6bfd691e2039","VERSION","lDSM4lk4lD6OTgkmrAm7ZbG5EdW1FoHJ","true","2026-02-09T11:04:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787999/ac5ef3d9-feff-487a-8a98-f872baef5db0","VERSION","jjd0tyZ90842_Gc1Vl9Mhl4HnBZRNQ9T","true","2026-02-09T11:04:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730787999/cd14eed1-0aba-4986-94b6-1e59c23c6fc0","VERSION","mXYnl.yk4coyYz8QfgNe.g0P2KxRQegr","true","2026-02-09T11:04:56+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730787999/f331965c-394a-4bf3-abe3-7cadfc59aa2b","VERSION","mEeTMMzgD3CNgkY2XbV_zVyHaRwd2ZeI","true","2026-02-09T11:04:55+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788006/52a03a4d-1fd5-4bcc-a94f-53900c952014","VERSION","Skrtx28vVOmRaJO1A_CZRPWPMcGuVuMM","true","2026-02-09T11:04:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788006/6d0c3a64-867c-4d7f-8af2-3f9835300969","VERSION","JMQtIjTH2xmT.ktaUDdEI6LJpLeBjzdq","true","2026-02-09T11:04:57+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788006/892f05ab-75e2-41b4-a24b-54b9ee822e5f","VERSION","GNF829mca6nGJxlh1vb0TOdyZ3D9U8kN","true","2026-02-09T11:04:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788006/9f94e70e-81dc-4968-b9f6-1189e900f1f8","VERSION","4sUlPZQm6yLMj5TXwJSPztRUlusyxo0o","true","2026-02-09T11:04:56+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788014/378d4a81-494c-4845-8206-d6640430d0da","VERSION","0RnTJQ39zdsb8n3Ud0gcMAtRZ0ewi3c4","true","2026-02-09T11:04:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788014/70272662-e611-4a71-b6fc-1d3ce6d2fe89","VERSION","ApSmW1n0dEXP1gWz5FM_HZ1_Xh4zEqpl","true","2026-02-09T11:04:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788014/e028916c-1c5b-4097-abd1-d1cea17f785d","VERSION","ivaaA_W4G6Er4Necit9BX8thW_yztOg_","true","2026-02-09T11:04:58+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788014/fc6906e3-a15d-4be1-9ae9-bfa4eecb9695","VERSION","HmA2ha4pGFHb9OcMfGlzxVqumORas9kD","true","2026-02-09T11:04:57+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788022/0d588958-1906-4ba2-baf9-8cab41b263fd","VERSION","AOyA5cOcQQT6kZLnMzSX.jwjvYYd.uhF","true","2026-02-09T11:04:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788022/591063c4-221b-4f85-83d2-b59581892b45","VERSION","z8u_THkRkHEGm5prZM87mFzvHgarFdby","true","2026-02-09T11:04:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788022/8d947b74-f0b9-4d37-9d4e-2373870843b5","VERSION","eMPaxBgDE8GgZq25saeo9jxxkfWxiDSv","true","2026-02-09T11:04:58+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788022/bc40bac2-d3fd-4378-aad3-8d953c488d83","VERSION","4nhGqaahNJMy7TRz71KEzrbuW3EL7rQ5","true","2026-02-09T11:04:58+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788030/a180f722-1ffa-418a-860f-ec3e2269b135","VERSION","v.Di_QKcMZwQzEj0d7EYiDZgQoVTkN_6","true","2026-02-09T11:04:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788030/e1ccb62b-e3ec-4383-8c5a-6fc334b1566b","VERSION","sW0h2cOkGR8HX_6E9c5rQ6xDzf0l0rJh","true","2026-02-09T11:04:59+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788030/e330843a-a9dd-4f35-8e31-a51e54812834","VERSION","1EDip8wWVf2ofT2AlMm0PgnKqzq31UXW","true","2026-02-09T11:04:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788030/e91c43c3-c5e2-40b2-82dd-e0933e51fe69","VERSION","U3mwaH4o4CSQKswYLgv2aQrqrlXqN02H","true","2026-02-09T11:04:59+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788049/380617fe-fe7c-471b-9414-047dc2228ae5","VERSION","25I1WezHi1xVoddAnvetQ8Fm.hQWSWCM","true","2026-02-09T11:05:01+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788049/97e1a3a4-78c9-41e7-9b03-3407bf1f768c","VERSION","meMIvdNTkiQr.73p_Q6TCdOvznmPo9Ij","true","2026-02-09T11:05:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788049/cae4ed7b-80cb-42f5-add7-f6a12ba67920","VERSION","r1Q_rexDZ1CrlozXDIrbPB9vVxCfc6vf","true","2026-02-09T11:05:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788049/e2a7e431-d653-46ff-a70a-7ed9a7c6946b","VERSION","m3nSIRon8.JojOARfQgqEkV3sRWiqUTj","true","2026-02-09T11:05:01+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788065/3bf3ea12-768a-44ca-b21b-43d40c3b0281","VERSION","oQ3EY.LKCfKp_05Np0z20U39DvSX2IBl","true","2026-02-09T11:05:02+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788065/6ada6cc6-b41d-482c-8702-9cdbbd78ef4f","VERSION","30WyihB0HrgMk2f4q43GGnn7aq8eqQPC","true","2026-02-09T11:05:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788065/a2c09c55-3a03-45a1-9e0f-e3d7c691d7ca","VERSION","gM9zfmdOBiuZ8f1eL6N1sP_KQaCQHTQI","true","2026-02-09T11:05:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788065/adcc553e-0891-4f6e-9e58-e563c29dbbe2","VERSION","T32HMfFDodEwgT6Iw_gEUEjFueYo3V2p","true","2026-02-09T11:05:02+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788073/0c2414dd-84c2-4dea-8961-c72db466b4b5","VERSION","y5vrjAiAkH5K7cw9MSJLh2BlSxaoVbh0","true","2026-02-09T11:05:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788073/2566d6d1-05e6-4abe-8b82-05831addb0cf","VERSION","G3lO0bL4HNucUU_OyEV9IL78Z64Wa0BT","true","2026-02-09T11:05:03+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788073/3ec3b32a-f79b-482c-b5bf-422c48684dcf","VERSION","PfEj8IfIhpDUdcuTVpt5PL6Bue4.BM4T","true","2026-02-09T11:05:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788073/f9c63c75-14ad-4d28-85d6-ec35bfec1046","VERSION","76si65FHrRyRTjXJDRDDhZuuglgFHOFn","true","2026-02-09T11:05:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788081/06412780-1c59-45ee-a4f6-8b0ddcd72fab","VERSION","SKF5LQRhY39L26g4wTmFpXDFGIzIgWYx","true","2026-02-09T11:05:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788081/b75e37c8-b4ce-41dc-9e33-ec87d40a7f93","VERSION","HOIsTIoHg6YVUbvEh1ij_ymVLN8WMb7y","true","2026-02-09T11:05:04+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788081/e072a87c-627c-4297-8177-c30ac21e77c6","VERSION","pmppNkP.DdxpvDDwLqCsCEg2j_0BxZW0","true","2026-02-09T11:05:03+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788081/e2180ab7-0720-411d-9043-42f49f255fa3","VERSION","TZHS_E_JMa4WGXtURvAiBINt8EXsv3qV","true","2026-02-09T11:05:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788103/03c2c6e0-921c-4fcc-aaf0-308427d2c60f","VERSION","XnrG_jdaZqWVg8p3SA7VWsnTSnphgDOI","true","2026-02-09T11:05:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788103/3db180f9-6835-48d9-b38a-fb38aa40b8cf","VERSION","13.TyQ8xiafdlB4iyK448jTa7NFhMbpY","true","2026-02-09T11:05:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788103/787c893c-e131-49df-ba15-a491d93ec363","VERSION","975mQkjm.jjxzR1aVhpcYmo4WjPSWnaC","true","2026-02-09T11:05:04+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788103/fdae22c9-256c-4f96-8d00-346691b2cd68","VERSION","2BnwaRzLqrL.nK5vFq4V7qhx68TtP8h5","true","2026-02-09T11:05:05+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788111/21970e23-2674-4706-a732-89548517765f","VERSION","t02GaGn2Ucb_BQ5Q9oDhqs76TqeB4A5t","true","2026-02-09T11:05:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788111/27f01613-236f-4ea5-9083-104d58148566","VERSION","kCSNH4OInilxV2UiRd0HkT7vRZdYRQGz","true","2026-02-09T11:05:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788111/b0750656-15b3-4d55-9819-d8e9a692e716","VERSION","4L.yhV5LM8lInu00Zan9yJYg7rFtyqpN","true","2026-02-09T11:05:06+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788111/ba6b0133-7bf4-43a1-99d5-386a8a2c45ae","VERSION","LJz95809ItWIW4WyM_F3wNSOCr2hDFNA","true","2026-02-09T11:05:05+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788138/0bf9bfb3-44a3-4acc-8c06-2136f9235671","VERSION","Dms157G6Aa3DcFCcr2lj3QZ0gVigOWWM","true","2026-02-09T11:05:07+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788138/b216c474-df43-4a54-800b-d33c6f2c4687","VERSION","0mKe0sDZZSZEzADI_FOMYZ5FSdiuAs_n","true","2026-02-09T11:05:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788138/be31d167-5690-4c6d-aefc-4d06da2adc1e","VERSION","Jw_16sAXsFvPibmUq4mSM58klM4GPIq5","true","2026-02-09T11:05:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788138/fe90b35f-1b96-4c47-8fd5-2959d6630387","VERSION","1Gaa74cv_owlokOOCV4eH.i5M.iSwCvE","true","2026-02-09T11:05:06+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788146/14d9a2a9-10f5-49d2-9565-8ca95c6960fb","VERSION","whcPxKWbQGYHRSh18I7IUoPaG.yIaum8","true","2026-02-09T11:05:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788146/8783e02a-4389-4f0d-b415-5eba1280b730","VERSION","qOWmj0rCwV0RQZwNlszlI3xJywjp3D4x","true","2026-02-09T11:05:07+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788146/a8e66ac0-9a06-4602-8f9f-b10e19b7f185","VERSION","P0fwGq2eOLiODcZklTmLaWjuREODhgN4","true","2026-02-09T11:05:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788146/ec2ebad2-1526-4013-9ff5-3bc338f22027","VERSION","WE.4.qViIV_ARkwa0muKebSkJQ.8PNRe","true","2026-02-09T11:05:07+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788154/003ff292-1c33-4968-90b5-4ce2d49fd815","VERSION","k7LqytNUyIiGLdPMYIg6V2jNIXoE01uq","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788154/484a327c-90de-439b-9750-09a97b4580c0","VERSION","0xGqR63RNYdqRCaLDD5T8kUVQ3tqvSL2","true","2026-02-09T11:05:08+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788154/6a8c240c-e9c3-4688-83d3-1091d0cac023","VERSION","C3.bjyd0a1BOY0olg8flmIPTdAtZchHc","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788154/7cd9c074-d8d7-4e6f-a629-0d26e7e3b5ac","VERSION","QyrvlvQTRdP9kGkzmC45HIbyCD4S_4u9","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788162/19a9c179-68b0-4b2b-ba2f-db48d4bd0b52","VERSION","Uvz7GygwnRnJJSA0YDTJRg_evtux3pke","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788162/7f2add37-64cf-410d-9eca-7f7328323aa0","VERSION","CcvZ.mm8wV3KdDRbmbBaUp1i8dbW7Pbn","true","2026-02-09T11:05:09+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788162/81a2dc13-d1da-429f-ac6a-c258f9b79392","VERSION","GTcSatzISD_L49b.C0bBgkCUCMljSzPj","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788162/85c81263-5436-4581-8575-5bc578cf9545","VERSION","HVTjlIQ.5v1gN7l5ov_2lN4EQ0kojqSD","true","2026-02-09T11:05:08+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788170/0c4d4a47-2db9-425d-a1c9-5214d56a70cf","VERSION","lHImqyyjQ_4uY9OsF0QLJfI4A6eUsCmS","true","2026-02-09T11:05:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788170/45cb66d8-f445-474e-b172-8f462eee6b94","VERSION","D34m3dOcF9ETqVOTC2TdwN8emg2TLtnm","true","2026-02-09T11:05:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788170/6383ecb9-b188-47be-b2d0-663910f68f4e","VERSION","DSY0Bu8h6MpZFWlXo4lRizP54knp00Iv","true","2026-02-09T11:05:10+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788170/eb0fb9c3-3565-4ef5-ac82-5584d480357f","VERSION","EX_uYQNXjxIxUGuybgs9uSqZCTG1sFEh","true","2026-02-09T11:05:09+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788189/3d93054b-15e7-4b7d-99c5-7b36c8814414","VERSION","GX0dL2P3qjfXBwuefYM_JLGyg.cjCI0w","true","2026-02-09T11:05:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788189/6c9b7e7c-9bb9-411c-b062-516af22054b3","VERSION","QhupvdHs5W8MuUmbe4QvELn8B.7SLsgt","true","2026-02-09T11:05:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788189/cbade354-438d-471a-979d-28b0c7c8b67b","VERSION","DoHFGjlkKjJ2fMcgRz5da1OebeJLWxnW","true","2026-02-09T11:05:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788189/e08d8cbe-cdba-49f7-9a88-849e190c2986","VERSION","Y34MzzXr2Edbo9_L3RZvY2dLLIEM1hez","true","2026-02-09T11:05:10+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788197/2ab07d09-50fb-4764-b463-2ee619256fe6","VERSION","stj3SwAXAZTzMB9SoWhcjhCtlE38k6K5","true","2026-02-09T11:05:11+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788197/89b328ea-d60b-4ae0-b335-d4ca95a06e5a","VERSION","tYnU530dLOXvzto8g.xgc8ZqHPQ_QXUA","true","2026-02-09T11:05:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788197/a1cb33db-608f-4a0f-a6e9-ac381cb52046","VERSION","qJbtKcSNO26ZbgndYrJdyP3m5KB8Aw2u","true","2026-02-09T11:05:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788197/e489a480-b279-43bd-b5e4-b26ac01c71f2","VERSION","2vIVvPqGg1a_v_nRhhKI5RFvSqYjst5x","true","2026-02-09T11:05:11+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788219/3933d2da-6546-4e0b-9450-8062bbdfe2a1","VERSION","9Lf1BSX6344LW_.8tBkoPzACCVHxaJqF","true","2026-02-09T11:05:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788219/66c4471b-7b8e-4d26-a4b4-c20b6120954f","VERSION","577TQNObfLhkKyyYHxDB04aY9kHc0Ff3","true","2026-02-09T11:05:12+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788219/8f6f462b-0b9e-446d-9c03-e2b3bac82584","VERSION","21pnT_0GvZJ_AZ8BKyWhBYzhxLvje28p","true","2026-02-09T11:05:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788219/b83bf1c1-d788-4f2c-aa7e-0e0ba59d7367","VERSION","TrAzaYPk9XwrqATjzPCJu0eOjTXeT_5N","true","2026-02-09T11:05:12+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788227/34f840f8-d541-4ba1-90d7-4e169305c081","VERSION","QP6B1LvpP5F2pipjgBCNmlMsvimh6xRH","true","2026-02-09T11:05:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788227/50cb808f-fc70-48b4-8020-bceb8ca311bb","VERSION","lQnwDCc5c4vbzwMu6lLugIy29kLTZZE.","true","2026-02-09T11:05:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788227/62fc1306-623b-459a-85c7-e6f03e074001","VERSION","f7rpJi6TIzVvdDwUKEYorLqyC6iqmPVG","true","2026-02-09T11:05:13+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788227/e389999a-3158-44b6-99d6-a7e7e50a6857","VERSION","pVJJrIJqk_EUCzCcTojnk35A7tFZo5Ti","true","2026-02-09T11:05:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788235/46851f89-d93c-47bf-a5eb-e3a9263df1f8","VERSION","GAhym2PS3C3UjM8vOAjlfmuou5mv9qPA","true","2026-02-09T11:05:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788235/8a4e1311-cae4-4844-b585-75d357f15c6b","VERSION","eIEGAjv61UhvFB9KinXn0jVVYXmxhxfg","true","2026-02-09T11:05:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788235/b549d52e-f3a6-4d41-be29-63fbd2c417ef","VERSION","BtcPS8YL3cXtkvTzhn1Y2S5brQfGvFYT","true","2026-02-09T11:05:13+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788235/e29b6c13-e872-44fd-ac4f-5b120822c56b","VERSION","7K5W7z2WbVtsqEepFRwMI36E_DKFhHH9","true","2026-02-09T11:05:14+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788243/087817b7-749d-475e-90ea-42de3578ff9d","VERSION","KIhWLqni1WFAmZNUVPWNewWf5PApsXSZ","true","2026-02-09T11:05:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788243/632c9d5f-4b18-4ed5-b6f5-ce6dcf4c58db","VERSION","lEARXxSiCyRW5gEWo92kcCsAUXotips0","true","2026-02-09T11:05:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788243/8a8162e9-d0e9-4125-bf11-4559b7633fda","VERSION","SDIsHicegT7fbdwtOZr67Ssr6faq3fo4","true","2026-02-09T11:05:14+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788243/cad93be5-2f2b-4d68-81cb-aff1981afbcd","VERSION","uWXZkp7BhLq_TSNUZ2Lo7dLyhi2pEBEn","true","2026-02-09T11:05:15+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788251/2a6ac9d8-d071-4c92-89e9-5c8cec20e0de","VERSION","LFlqhXcCCMcp2IwIeEwuLxINtIxSm90v","true","2026-02-09T11:05:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788251/35c2e5d0-c61a-40d6-ba6a-ebd8a1eca95e","VERSION","GaQl0ezpmWJhf0lnSiIsLPREVGvXhLMC","true","2026-02-09T11:05:16+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788251/8cb45214-95b6-465a-84a4-9453fe5d52ba","VERSION","BOzSdEW9CX4IYUAUGK4TFFIYIWhrlkjC","true","2026-02-09T11:05:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788251/bc49e6eb-ba0e-460d-8f79-a3d8caf0e6ca","VERSION","HQYQUFZU4JepD_I99o3zSbAYp_NesXCW","true","2026-02-09T11:05:15+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788278/2682d918-5694-4a46-8b57-ea0cdb2dbda3","VERSION","OF4GV6riYk9b.wdkVTA9jsSKYV6eCEg0","true","2026-02-09T11:05:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788278/a6537dfe-251b-4b5f-8fb4-77fcc9668d74","VERSION","ayabzIF7bGcCyZKJriFaeA5e0Hy_9DVw","true","2026-02-09T11:05:16+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788278/e303d2dc-00e4-4fff-b9b2-88c94714f8d8","VERSION","v3Ch5Hy9NfiGid_q4KbHhOvOvsL9vabR","true","2026-02-09T11:05:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788278/f76f4fb1-0c96-46cb-895c-be6633249eae","VERSION",".280.bbYVwQabK1GVaOrYuJ74U6ngE8m","true","2026-02-09T11:05:16+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788286/1bd30f6a-c496-49b7-b042-87c80b29b4d4","VERSION","KPCii6SWAP17DghD2ytTo3ArIteEySs0","true","2026-02-09T11:05:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788286/4fc70f87-013a-45e7-852c-58e5b144b83c","VERSION","skFpiCV_AWgtcSUATXkUmpkM6C_UAJKP","true","2026-02-09T11:05:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788286/a4f3f549-36b7-48a1-aaab-793f2e4feb03","VERSION","9W7WPWRnjT5u6FuCoo5CkJ5n2RCxd7NX","true","2026-02-09T11:05:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788286/eaf25696-f932-4945-a358-be1b0a019b0a","VERSION","blJwmXED9mh43lDfw14ST3pevZetnHGZ","true","2026-02-09T11:05:17+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788294/36747770-c9e6-44b4-ba3f-3dc27d14112f","VERSION","cnvdhpDS2ja7vWZNh74t0Z.al5HGWT75","true","2026-02-09T11:05:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788294/3a5aeedf-54bb-480c-bbf4-218c0d15daa4","VERSION","OiJMg1a0QAwzl0_ytED91zTOoaNdTKFV","true","2026-02-09T11:05:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788294/4383ee85-92dc-4de2-9174-f69b597b736d","VERSION","lgFlkBHz2NtboQyxuiaEq6tb6Tvftj_1","true","2026-02-09T11:05:17+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788294/6b84b930-36dc-4b77-898e-e85b16c440e0","VERSION","P54X2hrvNIejhONCVaiY_ygTYb3i66Qj","true","2026-02-09T11:05:18+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788308/69be3538-d187-4682-8bbc-9b63ec6342f9","VERSION","Vm8Es62lmVctgB_.u.y4XPij3nlSrH6u","true","2026-02-09T11:05:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788308/78fa46a6-4707-436d-8acf-437d51ba16bf","VERSION","juL2Qcf8H0OS6vCv5gaWxlullbK9705n","true","2026-02-09T11:05:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788308/aa71f297-3004-48c4-8240-3b6d4ab1a81d","VERSION","jH8T.MsVAX4vsfEahBroTjhCAijmEmY_","true","2026-02-09T11:05:19+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788308/b0a2fbf0-83bb-4d3c-9c41-60476656a627","VERSION","oqrVQUVdm5Ia.lpdidtmxP6TUMHfAgea","true","2026-02-09T11:05:18+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788316/09c3f573-222b-45db-af9b-75e0bcc3e5b5","VERSION","yinBc0ZpzkWuz_Htplg91zarF3u15jFe","true","2026-02-09T11:05:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788316/6d89d318-bcda-411e-b592-d3d4a5e86f7b","VERSION","FV5rEyAYsykU6tp2sjdWv_JS8MZXlwUy","true","2026-02-09T11:05:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788316/dce28bd3-0f05-4e4a-9cfc-2b73b4306d97","VERSION","j8T9ssD6JKKqUUmZzUknLd1T6fyFbbw5","true","2026-02-09T11:05:19+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788316/f7019d1c-49b9-4189-a5ff-5b1392968e01","VERSION","IM4jlXVReeUC_If3XNoaWPEPpnDTfovh","true","2026-02-09T11:05:20+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788340/6edbfdcf-ad6f-47b2-bebe-b55fca2b44b8","VERSION","VFiRywEfEk.dIbvBhykAfhdnfuJ5PkOC","true","2026-02-09T11:05:20+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788340/8bfdcc20-945d-485b-b8a7-763222ef7ced","VERSION","l_Ai8t.ksC6fzSIjqtf6OrGpl49IereN","true","2026-02-09T11:05:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788340/aab26a1d-8d0a-4616-8da2-d1932af3685e","VERSION","OL4qjj1vu9_gZCJtwxM8IG2PtsxSw2Ky","true","2026-02-09T11:05:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788340/d7b8eb2d-3e1a-45b5-a4d6-6af7c450af3d","VERSION","lsjxLMypfbB3lTxigw3pmUI_RJVsBji2","true","2026-02-09T11:05:21+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788359/3ec25110-d9b2-461c-966d-eec1114cd334","VERSION","JFNbFQeWbKAiCn20vJBJhakhbTGWkmwq","true","2026-02-09T11:05:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788359/b2fcb807-83c3-4d82-b55e-0169ee66fd57","VERSION","lRX5UfHy1RrrLSNfk8.MGD9E0w53jLKK","true","2026-02-09T11:05:22+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788359/f236208d-12af-4577-bafb-1b99dc0cd297","VERSION","SEyOlGnRXxvhvTh1HbieOkvsEx7kQZvK","true","2026-02-09T11:05:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788359/f8ff0e29-afa3-4279-b5bb-012888ad829f","VERSION","kGiIw2TaCX.uf6JVOPyHF4.XkovE8QXk","true","2026-02-09T11:05:21+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788367/58e55810-eb83-424c-a290-a3f79d28b875","VERSION","1xdB3jDOUOxkogmijZNmy3LXOD3azck5","true","2026-02-09T11:05:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788367/63025d5a-007d-4340-ae58-f3b3e6114428","VERSION","ElH60i37OxDDob1YRKGixhbzmWHAEV.b","true","2026-02-09T11:05:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788367/8ed35943-e6c0-48ab-8196-056e31609520","VERSION","GLIn9iy_VOiOO18qTrYjHMF7Cit.5aWx","true","2026-02-09T11:05:23+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788367/d2975b4f-e891-4966-8f1f-191ce670a98e","VERSION","QiUKMR._lMEUuYvgT9rzrbsXo000gGA8","true","2026-02-09T11:05:22+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788375/7ba4c4dc-2b6a-4fa1-ba01-05c4f939148f","VERSION","CpAF8veQFSQF8yX8ZrzW.fKPPOAXQxhA","true","2026-02-09T11:05:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788375/90f1a686-02bf-4d19-b2a6-895d0ddde8d6","VERSION","VkoRdhkkjKnoPlL2UiA5xAKDkiAQpk3G","true","2026-02-09T11:05:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788375/9d216c99-5fd3-4770-8d34-b2a6ad7c499d","VERSION","1vA9GpsI6UJb0duuM3qGp3nxtDkhFzQ7","true","2026-02-09T11:05:23+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788375/d8e9c7c7-0b77-4a7f-b4c8-093e68dccf02","VERSION","QiouXn.J4GPkHEbP5mKXSDYmrfmPVNnT","true","2026-02-09T11:05:23+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788383/45c100fa-ebf6-4336-9784-5f9938e14654","VERSION","SJ8dUO5o9M5MqABUOfQuifRiu741Ehw4","true","2026-02-09T11:05:24+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788383/847e66a1-99ff-48a6-aff1-3798586d721a","VERSION","AvCdOkbeFTvkoaq4aUjHPlbmP2l7phu4","true","2026-02-09T11:05:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788383/a66d1eff-06fe-451d-b094-6b75815d304e","VERSION","APtvJ0MCoehFg4E4LqOTK8Ph9ZQnnvyz","true","2026-02-09T11:05:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788383/a882b076-6cdb-4b4b-8cd2-077148690005","VERSION","Gz9oa4Q4w9.4iyIaonmnh9qcVYOBvqNy","true","2026-02-09T11:05:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788391/19b227ad-1a1f-4733-8b59-b404147f314c","VERSION","H_S9FxvYW_E1Dm1AhaqHeDwQ8H8Jx5F2","true","2026-02-09T11:05:25+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788391/9af29ea3-3544-4326-bafc-5a4da50d02ab","VERSION","WUnFydEZyAGXMi8PfpZvFh3k94TbcnhI","true","2026-02-09T11:05:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788391/9cc635dd-4b70-421b-a432-32d460ef7ad2","VERSION","OOphl78n8hhiTQsxzf4E0eg7gBRTmeQR","true","2026-02-09T11:05:24+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788391/b0f1242e-9669-4535-b0c0-653c3b9f6d41","VERSION","VJC8sDXD8CbjrtY2Nb1HOmZE0IsrL1AJ","true","2026-02-09T11:05:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788405/0c08b83b-e495-49cc-9969-6c9d01e7e0d4","VERSION","lAPi05UyTM6DdAHgqhmO5J_ySSEMhzKU","true","2026-02-09T11:05:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788405/1ed277ea-33a8-4041-b8c7-a51b00ef5ef8","VERSION","lnSfbSgvGSCtaPzgti.Ze_awqBqaPish","true","2026-02-09T11:05:26+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788405/83a008e2-217e-4bc2-a4b3-16bf9898abc2","VERSION","NFT7d_lply.Qe._QBDRPxusUZKYb5byv","true","2026-02-09T11:05:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788405/fcde8ada-36a9-45ee-bd0f-14224a77c7fe","VERSION","aIEeCBDfdgrMRxt3o99kyP6ZonsD0PrQ","true","2026-02-09T11:05:25+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788413/4e19de25-140d-46cd-b8ec-7c83989de573","VERSION","QqM2tAsDBOZ.MCgwqKwdv2.84Jski4Ik","true","2026-02-09T11:05:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788413/6ad7039a-9a4b-4da8-b67f-5f1c41a78bbd","VERSION","LT5s4YIsc4i.PUKDLHDZN7H8cG7JNt5L","true","2026-02-09T11:05:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788413/79655978-6ba6-477f-aff6-25d90843921b","VERSION","1OgEc99jSzzXMJYuFdWr.tHyRY2UgcW3","true","2026-02-09T11:05:27+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788413/bf92f717-df27-4082-9636-19a48e8491b5","VERSION","9Bzk7Sgr3OPUiIylCrmT8TN.nglUk0w1","true","2026-02-09T11:05:26+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788421/49f5d451-afb5-4f50-9243-84dfc9c00386","VERSION","O2ICFKlL9FeiV9zzaeEfo0ojjX.WT.vM","true","2026-02-09T11:05:27+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788421/7e4b1711-0365-4166-881d-7b17774c0dc9","VERSION","TiiON_3B4HG16.zo5tEopYNOg70w6NoV","true","2026-02-09T11:05:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788421/92114185-afe3-4d9b-9b8b-79f3c6ebb00d","VERSION","3pqu_8FMIuHvfxq.FfObI4zs2HlRB.DY","true","2026-02-09T11:05:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788421/e6469780-c529-4406-ac0d-1ac34f9596f5","VERSION","bu6ppA3c8NCOS9C2fBCK9V8DGLxsFSTk","true","2026-02-09T11:05:27+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788448/173a695d-67ed-445d-b8bf-33b816c147e5","VERSION","t0V5Z1CbX4t3waRni_.6QZj8_c_DSiBl","true","2026-02-09T11:05:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788448/1a509a81-6e68-4081-a23f-ed78d1fbdeb2","VERSION","JiW7V7IECZIvVX1viu5D2alR2MzygQ4e","true","2026-02-09T11:05:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788448/91f7dff6-a61d-4d7f-90a9-1e77dd624337","VERSION","BJyaaDlRUTWZJDoWNExPFbFYh_bIVLVh","true","2026-02-09T11:05:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788448/b3294319-e5dc-4aa8-8c63-04d08f6f93d4","VERSION","JQdOsHkaXZBbpFhpBuqEFKxVkCcq7RxD","true","2026-02-09T11:05:28+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788456/19c2a4a1-95da-404b-b8d1-db2213cf1d20","VERSION","Mx33QRL5xQ4Pr4utN_fRmlqQBbbYx1RB","true","2026-02-09T11:05:28+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788456/772ec8c1-2842-44b1-8cd2-b8dc0ef30d9f","VERSION","nzead7oqVkEnBh6R02.xRoGjYPSnIPkA","true","2026-02-09T11:05:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788456/867309a6-c68c-4357-afae-588b2b097ed3","VERSION","FF5YSzgEtxznQ_R.CJfJwBAlvx37Jd8y","true","2026-02-09T11:05:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788456/94352bbc-7ce0-4c50-821c-41067ba87e50","VERSION","RBrI.N8LniMugGJaRLAOyL4WO4d1O09h","true","2026-02-09T11:05:29+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788464/32e8a955-c608-4bc5-9a71-89c6d37ee750","VERSION","3dqpPm0nbJBcOFYtZp3s7qJgqKYNoQx_","true","2026-02-09T11:05:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788464/6589cc96-b2e1-4cb8-a782-46eb4d9ea27d","VERSION","m1N0sVetSdliQzDyWxdWu1HLCik6b9xT","true","2026-02-09T11:05:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788464/805cdd0c-ac7b-419e-907b-150e36d3e828","VERSION","zluuxiYphsM2NZ3I.howzxtArw0PxJMj","true","2026-02-09T11:05:30+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788464/a1e6e081-3b95-4848-b36b-bd14951b2337","VERSION","I6Dqy6wiBxOWEoaTTGvlClBbIgqoOr2l","true","2026-02-09T11:05:29+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788472/1c150753-68af-43af-9b66-662b0eee1dd2","VERSION","oJNhduZxiP4MW.ZpE7iJAqfU.r9JpWit","true","2026-02-09T11:05:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788472/44114133-45bb-44c2-8bf7-64aefab22d68","VERSION","Xqk6Ko19ucBUkYe5mF6wARAgXXx6WmgB","true","2026-02-09T11:05:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788472/89e81e93-0a24-4c69-a036-cc9b16ea9181","VERSION","SFNxWSSGSOEw2XrWV7sAhwr6gp1POtly","true","2026-02-09T11:05:31+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788472/b548231c-2835-4e91-993b-12ab69871ca0","VERSION","F8veP3oGBVvrIUkAvnn930dvx9RYLtoQ","true","2026-02-09T11:05:30+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788480/49caceba-d0da-4967-a25e-f80f45772a56","VERSION","0B8Pn0Ob9ZMykTiJcHrMbrkyVxWm8Dyy","true","2026-02-09T11:05:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788480/525a5dbf-2f35-48c1-a879-50e6a61aea13","VERSION","FrdRf2eYun3dPRYx_LFK99rc1qvui7RC","true","2026-02-09T11:05:32+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788480/792e76b9-70fe-4ebb-a675-83d8002cbe2e","VERSION","Z7omakSMEFYKPcKmAsWaEjhybOGK.VWl","true","2026-02-09T11:05:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788480/b295a74d-4ea4-4770-9cfe-cb0a99fd9cb8","VERSION","3T2RYIJl015aP4DLniHs1PHLUSZM9VUd","true","2026-02-09T11:05:31+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788499/245f073d-6848-4a6b-b7c7-ad475875e3a4","VERSION","hvzUSti1WTaEsOWO7XzSEMKh4zgSDa8L","true","2026-02-09T11:05:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788499/45faacac-8796-4d52-950e-148042dd63db","VERSION","L1J8pTUmtcxpDGAL.p4npU4sMTH6dhpp","true","2026-02-09T11:05:32+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788499/a0243a75-4845-4eb6-bb5a-10b94c60b5f6","VERSION","lMjJ4HPfsnXQGDTQSvwOa.Fy.XVijE89","true","2026-02-09T11:05:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788499/d025684d-aee9-4e86-8ff5-d3ca126f2b6d","VERSION","rcUmFJjP4zq7uU.6Fulc7ZA_nIyfdO7w","true","2026-02-09T11:05:32+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788502/6d383160-b6ba-4d45-ae5e-9877ba916fe0","VERSION","jjZShzGmL6L7TXgmGkLThtrDkupcFMYb","true","2026-02-09T11:05:33+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788502/9019772a-3bac-4aeb-8db2-770cf7d1d7a8","VERSION","eifW0e6qI9RzUCkk5I9cMWzXPgmBWi8z","true","2026-02-09T11:05:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788502/911a1765-4bba-47b6-9b5f-b4201a67fe01","VERSION","lG2heZH6x3c97cNSyx_V1ylhUc6j8QuW","true","2026-02-09T11:05:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788502/e51b98da-70a3-4c75-92a7-c25bcfbf87cb","VERSION","_.WSetW4iM6FSCBZP7_9kZSdi4v33WoO","true","2026-02-09T11:05:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788510/958720bb-7c57-4930-b6bd-0290e8596b22","VERSION","2_eHTJRbjSNv6syoy0afq3koCO4.JYQ6","true","2026-02-09T11:05:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788510/a0e82c47-29c0-47e4-8dc4-65af8e41350c","VERSION","dNP5t2Zr8jB2vrJHuNeoNLE6AghN1sPu","true","2026-02-09T11:05:33+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788510/b48ade2b-7a9c-4df7-8798-997483a89973","VERSION","hGGoLgPtTqxPfnRG66cuwLqIs0NFmniV","true","2026-02-09T11:05:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788510/d38e7eec-0466-4453-a43b-6793aabb24fc","VERSION","2Uym0OI81VgZnY5XEDZNJaWlkVvX8CLm","true","2026-02-09T11:05:34+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788529/0a1effb4-54d0-4cb6-9119-d4d7247dee12","VERSION","EMsABpc.7dhwmbhL7DuLWKkEU7wlCgNq","true","2026-02-09T11:05:35+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788529/52cc12a8-15b5-4113-b2b4-41966ee7f3c3","VERSION","hVGUWPtb.0AIa2neT4Y0V37IKKVc082K","true","2026-02-09T11:05:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788529/6ee1f3fc-b2a3-4a64-81ac-b5ed06188435","VERSION","dRM_QuTnXxUvQKzattcBr6fxEh3jXslb","true","2026-02-09T11:05:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788529/a6664ed7-cad3-4d11-b5a3-b2116fdb7700","VERSION","VIVDmLeZLJLoK7RMMHX9Hyf1ikV8Oz46","true","2026-02-09T11:05:34+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788537/61040766-8883-478e-8f78-57680cb8aeaa","VERSION","4_hojs2NFmoBe10HbFXX0kOSS4PyCOp4","true","2026-02-09T11:05:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788537/7100a4ea-43f0-41ba-aae9-eea2f042896e","VERSION","OkTQPZ2zouqTpsRrib.mHZIftr8wAk0b","true","2026-02-09T11:05:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788537/b0acf380-2efa-4ae5-9592-8d4d1295195a","VERSION",".jVYVbLORd2OrJeuAUHR8pXfaVw_7uqA","true","2026-02-09T11:05:35+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788537/b1cb887f-5e59-471e-a3a0-1dfeeb2a7904","VERSION","HQE9DafO3PprGwzFRdPMvnriicPAlBAQ","true","2026-02-09T11:05:35+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788545/0af3f3f8-3230-44c7-b723-f6221b86ba81","VERSION","8RFAtyjlzD6aYYUElZbA.6cTGVQxN8fD","true","2026-02-09T11:05:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788545/1c8a8a21-e1f0-4086-99e9-9aa2e2429bd2","VERSION","Ou5w5zAe3WrZnGENt6LMvtT.E8UaoBVl","true","2026-02-09T11:05:36+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788545/d7d0264c-eecd-44cf-86a2-b44dbeabd420","VERSION","zfl7_Ada0H5TlBL0onyWPt9rkSif2zPB","true","2026-02-09T11:05:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788545/e4c39f9e-4e56-4563-849e-3c78342dc393","VERSION","mwenIn2TjVlU_sNCaUsLs3PKICvR9h2p","true","2026-02-09T11:05:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788553/5f75332c-64ee-4469-80ff-a5b8334236ee","VERSION","m7h1Xq4yAi0mZYOCL3wLXjYyTnWiEovN","true","2026-02-09T11:05:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788553/8faa65f0-6be3-427f-97d0-6b47d380d522","VERSION","yshGtdblgOUSveTW8tBZY9ZOE8BsJKXZ","true","2026-02-09T11:05:37+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788553/96d83730-1fc2-439d-ac5e-bf29f3a9a995","VERSION","DlMlqfWiiiiFfBJPZsYbJeEs0DbT9Gv5","true","2026-02-09T11:05:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788553/bdc45251-e1d9-45c3-99fa-f6eafa64fc11","VERSION","T5f2_Adi7XMD6erIlVSAK0yFCZOQG6BB","true","2026-02-09T11:05:36+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788561/28bfc062-49c9-4f89-b050-7c813465d86b","VERSION","29eYUtzZxW5b_gU5n9JUPVuxTWe18Sci","true","2026-02-09T11:05:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788561/3afdd181-2c98-4472-8c39-b41e3c02a338","VERSION","VPYmTbZxMw1pzAKIH18l274iCTI0liJO","true","2026-02-09T11:05:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788561/cebe1236-0043-4b5a-8f96-11bb0812fdd6","VERSION","zpifaKBnaRtWwqRgHKdkkH6HO4SNp.Xd","true","2026-02-09T11:05:37+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788561/f5d09480-44de-449f-8716-697485e6a5ea","VERSION","EYyEAGrK8NtUP.oqlp8LWln5IUfxXVRQ","true","2026-02-09T11:05:38+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788588/1df71e85-88d6-449a-8653-bc5d7caa17f7","VERSION","AX7i6c8VMWAtR2rfDdC4UGdGhPhRRG7S","true","2026-02-09T11:05:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788588/3f5cfa62-ddca-4993-a78b-6d11f3a7fa77","VERSION","uPgP1wwgGp4eDPWAZAWzk6DVeupdApGl","true","2026-02-09T11:05:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" -"p1058-lloyd-george-store","9730788588/569a91f4-e49b-4b28-9050-f621f382c46e","VERSION","_SKqO_TsW0aMQttCEm25DnQnSsIdwswn","true","2026-02-09T11:05:38+00:00","173760","""c3a8510dd8f680f03d369b9712d56723""","STANDARD","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","" -"p1058-lloyd-george-store","9730788588/bfef3570-c159-4276-a0c4-8f71f2546dbb","VERSION","nwSrjayxX64urytGIc2XklViGdhu3i4T","true","2026-02-09T11:05:38+00:00","59315","""b7e907c3f1baa63f1e61be3704149b5a""","INTELLIGENT_TIERING","5eda919b684ff9939ff7b06d9c243fa40eabc7929fd7b8d06d5e70e50dccf6b7","scan-result=Clean;date-scanned=2023-11-14T21:10:33Z" diff --git a/s3_inventory_versions_with_tags.sh b/s3_inventory_versions_with_tags.sh deleted file mode 100755 index 54aae3c845..0000000000 --- a/s3_inventory_versions_with_tags.sh +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -REGION="${REGION:-eu-west-2}" -BUCKET="${BUCKET:-p1058-lloyd-george-store}" -PREFIX="${PREFIX:-}" # optional -OUT="${OUT:-s3_export.csv}" -PAGE_SIZE="${PAGE_SIZE:-1000}" # AWS max per page for versions -TAG_SCOPE="${TAG_SCOPE:-latest}" # latest | none | all (all is expensive) -PARALLEL="${PARALLEL:-8}" - -export REGION BUCKET TAG_SCOPE - -# CSV header -echo "bucket,key,entry_type,version_id,is_latest,last_modified,size,etag,storage_class,owner_id,tags" > "$OUT" - -# Convert TagSet json -> "k=v;k2=v2" (empty if none) -tags_to_string=' - if (.TagSet|length)==0 then "" else - (.TagSet | map("\(.Key)=\(.Value)") | join(";")) - end -' - -get_tags() { - local key="$1" - local version_id="$2" - - # If TAG_SCOPE=none, never call tagging API - if [[ "$TAG_SCOPE" == "none" ]]; then - echo "" - return - fi - - aws s3api get-object-tagging \ - --bucket "$BUCKET" \ - --key "$key" \ - --version-id "$version_id" \ - --region "$REGION" \ - --output json 2>/dev/null \ - | jq -r "$tags_to_string" || echo "" -} -export -f get_tags - -emit_version_rows() { - local json="$1" - - # VERSIONS - jq -c '.Versions[]? | { - bucket: $bucket, - key: .Key, - entry_type: "VERSION", - version_id: .VersionId, - is_latest: (.IsLatest|tostring), - last_modified: .LastModified, - size: (.Size // 0), - etag: (.ETag // ""), - storage_class: (.StorageClass // ""), - owner_id: (.Owner.ID // "") - }' --arg bucket "$BUCKET" <<<"$json" -} - -emit_delete_marker_rows() { - local json="$1" - - # DELETE MARKERS - jq -c '.DeleteMarkers[]? | { - bucket: $bucket, - key: .Key, - entry_type: "DELETE_MARKER", - version_id: .VersionId, - is_latest: (.IsLatest|tostring), - last_modified: .LastModified, - size: 0, - etag: "", - storage_class: "", - owner_id: (.Owner.ID // "") - }' --arg bucket "$BUCKET" <<<"$json" -} - -row_to_csv() { - jq -r '[ - .bucket, .key, .entry_type, .version_id, .is_latest, .last_modified, - (.size|tostring), .etag, .storage_class, .owner_id, (.tags // "") - ] | @csv' -} - -# Fetch a page via AWS CLI pagination token -TOKEN="" -while :; do - if [[ -n "$TOKEN" ]]; then - PAGE_JSON="$(aws s3api list-object-versions \ - --bucket "$BUCKET" \ - --prefix "$PREFIX" \ - --page-size "$PAGE_SIZE" \ - --starting-token "$TOKEN" \ - --region "$REGION" \ - --output json)" - else - PAGE_JSON="$(aws s3api list-object-versions \ - --bucket "$BUCKET" \ - --prefix "$PREFIX" \ - --page-size "$PAGE_SIZE" \ - --region "$REGION" \ - --output json)" - fi - - # Build rows (json lines) for versions + delete markers - { - emit_version_rows "$PAGE_JSON" - emit_delete_marker_rows "$PAGE_JSON" - } | while read -r row; do - # Add tags conditionally: - # - VERSION rows: tags depending on TAG_SCOPE - # - DELETE_MARKER rows: tags always empty - entry_type="$(jq -r '.entry_type' <<<"$row")" - - if [[ "$entry_type" == "VERSION" ]]; then - is_latest="$(jq -r '.is_latest' <<<"$row")" - key="$(jq -r '.key' <<<"$row")" - version_id="$(jq -r '.version_id' <<<"$row")" - - tags="" - if [[ "$TAG_SCOPE" == "all" ]]; then - tags="$(get_tags "$key" "$version_id")" - elif [[ "$TAG_SCOPE" == "latest" && "$is_latest" == "true" ]]; then - tags="$(get_tags "$key" "$version_id")" - fi - - jq -c --arg tags "$tags" '.tags=$tags' <<<"$row" | row_to_csv >> "$OUT" - else - jq -c '.tags=""' <<<"$row" | row_to_csv >> "$OUT" - fi - done - - # NextToken (AWS CLI pagination) - NEXT_TOKEN="$(jq -r '.NextToken // empty' <<<"$PAGE_JSON")" - if [[ -z "$NEXT_TOKEN" ]]; then - break - fi - TOKEN="$NEXT_TOKEN" -done - -echo "Wrote: $OUT" From 4d987b16b684297d5cd54b2d30943cfd25ffbfc6 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 10:14:52 +0000 Subject: [PATCH 39/43] [PRMP-939] for now listing all objects --- lambdas/services/reporting/report_s3_content_service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index a5d01b0eba..241b23b011 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -28,8 +28,8 @@ def _fetch_tags(self, bucket, version): def process_s3_content(self): for bucket in [self.lloyd_george_bucket, self.bulk_staging_store]: logger.info(f"Listing versions for bucket {bucket}") - # versions, delete_markers = self.s3_service.list_all_object_versions(bucket) - versions = self.s3_service.list_all_objects(bucket) + versions, delete_markers = self.s3_service.list_all_object_versions(bucket) + # versions = self.s3_service.list_all_objects(bucket) delete_markers = [] if len(versions) > self.max_objects: logger.warning(f"Limiting versions from {len(versions)} to {self.max_objects}") From b055eecec386a60a2689f2ea2df68d3c1b437668 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 11:53:27 +0000 Subject: [PATCH 40/43] [PRMP-939] Updated s3 content service to fetch only the latest version of objects --- lambdas/handlers/report_s3_content_handler.py | 1 - .../reporting/csv_report_generator_service.py | 32 +++++++++-------- .../reporting/report_s3_content_service.py | 34 ++++++------------- 3 files changed, 29 insertions(+), 38 deletions(-) diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py index 70de3ffbc9..2509e3ad0c 100644 --- a/lambdas/handlers/report_s3_content_handler.py +++ b/lambdas/handlers/report_s3_content_handler.py @@ -7,7 +7,6 @@ logger = LoggingService(__name__) -@ensure_environment_variables(names=["LLOYD_GEORGE_BUCKET_NAME"]) @ensure_environment_variables(names=["BULK_STAGING_BUCKET_NAME"]) @ensure_environment_variables(names=["STATISTICAL_REPORTS_BUCKET"]) @override_error_check diff --git a/lambdas/services/reporting/csv_report_generator_service.py b/lambdas/services/reporting/csv_report_generator_service.py index 683ede526e..4853d1787f 100644 --- a/lambdas/services/reporting/csv_report_generator_service.py +++ b/lambdas/services/reporting/csv_report_generator_service.py @@ -1,12 +1,16 @@ import csv from io import StringIO + from utils.audit_logging_setup import LoggingService logger = LoggingService(__name__) class CsvReportGenerator: - def generate_s3_inventory_csv(self, bucket, versions, delete_markers) -> str: + def generate_s3_inventory_csv(self, bucket, objects, delete_markers) -> str: + """ + Generates a CSV report for current objects (list_objects_v2 shape). + """ logger.info(f"Generating S3 inventory CSV for bucket {bucket}") output = StringIO() @@ -27,33 +31,33 @@ def generate_s3_inventory_csv(self, bucket, versions, delete_markers) -> str: ] ) - for version in versions: - tags = version.get("Tags", []) + for obj in objects: + tags = obj.get("Tags", []) tag_str = ";".join(f"{t['Key']}={t['Value']}" for t in tags) writer.writerow( [ bucket, - version["Key"], - "VERSION", - version["VersionId"], - version["IsLatest"], - version["LastModified"].isoformat(), - version.get("Size"), - version.get("ETag"), - version.get("StorageClass"), + obj["Key"], + "OBJECT", + None, + True, + obj["LastModified"].isoformat(), + obj.get("Size"), + obj.get("ETag"), + obj.get("StorageClass"), tag_str, ] ) - for marker in delete_markers: + for marker in delete_markers or []: writer.writerow( [ bucket, marker["Key"], "DELETE_MARKER", - marker["VersionId"], - marker["IsLatest"], + marker.get("VersionId"), + marker.get("IsLatest"), marker["LastModified"].isoformat(), None, None, diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 241b23b011..0f76ffaacb 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -11,45 +11,33 @@ class ReportS3ContentService: def __init__(self): - self.lloyd_george_bucket = os.getenv("LLOYD_GEORGE_BUCKET_NAME") self.bulk_staging_store = os.getenv("BULK_STAGING_BUCKET_NAME") self.statistic_reports_bucket = os.getenv("STATISTICAL_REPORTS_BUCKET") self.s3_service = S3Service() self.csv_generator = CsvReportGenerator() - self.max_objects = 4500000 #To avoid prod from melting - def _fetch_tags(self, bucket, version): - tags = self.s3_service.get_object_tags_versioned( - bucket, version["Key"], version["VersionId"] - ) - version["Tags"] = tags - return version + def _fetch_tags(self, bucket: str, obj: dict) -> dict: + tags = self.s3_service.get_object_tags_versioned(bucket, obj["Key"], None) + obj["Tags"] = tags + return obj def process_s3_content(self): - for bucket in [self.lloyd_george_bucket, self.bulk_staging_store]: - logger.info(f"Listing versions for bucket {bucket}") - versions, delete_markers = self.s3_service.list_all_object_versions(bucket) - # versions = self.s3_service.list_all_objects(bucket) - delete_markers = [] - if len(versions) > self.max_objects: - logger.warning(f"Limiting versions from {len(versions)} to {self.max_objects}") - versions = versions[: self.max_objects] - # versions = [ - # v for v in versions - # if v["IsLatest"] - # ] - logger.info(f"Fetching tags in parallel for {len(versions)} versions") + for bucket in [self.bulk_staging_store]: + logger.info(f"Listing current objects for bucket {bucket}") + + objects = self.s3_service.list_all_objects(bucket) + delete_markers: list[dict] = [] with ThreadPoolExecutor(max_workers=20) as executor: futures = [ - executor.submit(self._fetch_tags, bucket, v) for v in versions + executor.submit(self._fetch_tags, bucket, obj) for obj in objects ] for _ in as_completed(futures): pass logger.info(f"Generating CSV for bucket {bucket}") csv_content = self.csv_generator.generate_s3_inventory_csv( - bucket, versions, delete_markers + bucket, objects, delete_markers ) logger.info(f"Uploading report for bucket {bucket}") From 39906f7deb312bf192a1a896b7f3381e513e7697 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 12:25:04 +0000 Subject: [PATCH 41/43] [PRMP-939] Updated report generator service to not show version Id, or is Latest column --- .../reporting/csv_report_generator_service.py | 26 ++----------------- .../reporting/report_s3_content_service.py | 3 +-- 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/lambdas/services/reporting/csv_report_generator_service.py b/lambdas/services/reporting/csv_report_generator_service.py index 4853d1787f..52adc831fd 100644 --- a/lambdas/services/reporting/csv_report_generator_service.py +++ b/lambdas/services/reporting/csv_report_generator_service.py @@ -7,9 +7,9 @@ class CsvReportGenerator: - def generate_s3_inventory_csv(self, bucket, objects, delete_markers) -> str: + def generate_s3_inventory_csv(self, bucket, objects) -> str: """ - Generates a CSV report for current objects (list_objects_v2 shape). + Generates a CSV report for current S3 objects only (list_objects_v2). """ logger.info(f"Generating S3 inventory CSV for bucket {bucket}") @@ -20,9 +20,6 @@ def generate_s3_inventory_csv(self, bucket, objects, delete_markers) -> str: [ "bucket", "key", - "entry_type", - "version_id", - "is_latest", "last_modified", "size", "etag", @@ -39,9 +36,6 @@ def generate_s3_inventory_csv(self, bucket, objects, delete_markers) -> str: [ bucket, obj["Key"], - "OBJECT", - None, - True, obj["LastModified"].isoformat(), obj.get("Size"), obj.get("ETag"), @@ -50,21 +44,5 @@ def generate_s3_inventory_csv(self, bucket, objects, delete_markers) -> str: ] ) - for marker in delete_markers or []: - writer.writerow( - [ - bucket, - marker["Key"], - "DELETE_MARKER", - marker.get("VersionId"), - marker.get("IsLatest"), - marker["LastModified"].isoformat(), - None, - None, - None, - "", - ] - ) - logger.info(f"Finished CSV generation for {bucket}") return output.getvalue() diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 0f76ffaacb..5b74105dbb 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -26,7 +26,6 @@ def process_s3_content(self): logger.info(f"Listing current objects for bucket {bucket}") objects = self.s3_service.list_all_objects(bucket) - delete_markers: list[dict] = [] with ThreadPoolExecutor(max_workers=20) as executor: futures = [ @@ -37,7 +36,7 @@ def process_s3_content(self): logger.info(f"Generating CSV for bucket {bucket}") csv_content = self.csv_generator.generate_s3_inventory_csv( - bucket, objects, delete_markers + bucket, objects ) logger.info(f"Uploading report for bucket {bucket}") From 46fadd8ce55705cde83173ebb78ba1d517a394a5 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 14:06:55 +0000 Subject: [PATCH 42/43] [PRMP-939] updated tests --- lambdas/handlers/report_s3_content_handler.py | 4 +-- lambdas/services/base/s3_service.py | 1 - .../reporting/report_s3_content_service.py | 4 +-- .../test_report_s3_content_handler.py | 4 ++- .../test_csv_report_generator_service.py | 9 ++--- .../test_report_s3_content_service.py | 35 ++++++++++++------- 6 files changed, 31 insertions(+), 26 deletions(-) diff --git a/lambdas/handlers/report_s3_content_handler.py b/lambdas/handlers/report_s3_content_handler.py index 2509e3ad0c..0ffb4cb277 100644 --- a/lambdas/handlers/report_s3_content_handler.py +++ b/lambdas/handlers/report_s3_content_handler.py @@ -7,6 +7,7 @@ logger = LoggingService(__name__) + @ensure_environment_variables(names=["BULK_STAGING_BUCKET_NAME"]) @ensure_environment_variables(names=["STATISTICAL_REPORTS_BUCKET"]) @override_error_check @@ -17,5 +18,4 @@ def lambda_handler(event, context): service = ReportS3ContentService() - service.process_s3_content( - ) + service.process_s3_content() diff --git a/lambdas/services/base/s3_service.py b/lambdas/services/base/s3_service.py index 4a9bdb0a3d..aea283c6aa 100644 --- a/lambdas/services/base/s3_service.py +++ b/lambdas/services/base/s3_service.py @@ -275,4 +275,3 @@ def get_object_tags_versioned(self, bucket: str, key: str, version_id: str | Non return response.get("TagSet", []) except ClientError: return [] - diff --git a/lambdas/services/reporting/report_s3_content_service.py b/lambdas/services/reporting/report_s3_content_service.py index 5b74105dbb..83e836a388 100644 --- a/lambdas/services/reporting/report_s3_content_service.py +++ b/lambdas/services/reporting/report_s3_content_service.py @@ -35,9 +35,7 @@ def process_s3_content(self): pass logger.info(f"Generating CSV for bucket {bucket}") - csv_content = self.csv_generator.generate_s3_inventory_csv( - bucket, objects - ) + csv_content = self.csv_generator.generate_s3_inventory_csv(bucket, objects) logger.info(f"Uploading report for bucket {bucket}") self.s3_service.upload_file_obj( diff --git a/lambdas/tests/unit/handlers/test_report_s3_content_handler.py b/lambdas/tests/unit/handlers/test_report_s3_content_handler.py index 75976cb2f4..da90d525db 100644 --- a/lambdas/tests/unit/handlers/test_report_s3_content_handler.py +++ b/lambdas/tests/unit/handlers/test_report_s3_content_handler.py @@ -1,5 +1,7 @@ -import pytest from types import SimpleNamespace + +import pytest + from lambdas.handlers.report_s3_content_handler import lambda_handler diff --git a/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py b/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py index fba9fd9cf3..d06f37b4c3 100644 --- a/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py +++ b/lambdas/tests/unit/services/reporting/test_csv_report_generator_service.py @@ -1,15 +1,14 @@ from datetime import datetime, timezone + from services.reporting.csv_report_generator_service import CsvReportGenerator def test_generate_s3_inventory_csv(): generator = CsvReportGenerator() - versions = [ + objects = [ { "Key": "file1.txt", - "VersionId": "v1", - "IsLatest": True, "LastModified": datetime(2024, 1, 1, tzinfo=timezone.utc), "Size": 123, "ETag": "etag1", @@ -18,9 +17,7 @@ def test_generate_s3_inventory_csv(): } ] - delete_markers = [] - - csv_output = generator.generate_s3_inventory_csv("bucket-a", versions, delete_markers) + csv_output = generator.generate_s3_inventory_csv("bucket-a", objects) assert "bucket-a" in csv_output assert "file1.txt" in csv_output diff --git a/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py b/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py index 5c8c8354f3..7ce32ff5e1 100644 --- a/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py +++ b/lambdas/tests/unit/services/reporting/test_report_s3_content_service.py @@ -1,29 +1,28 @@ -from unittest.mock import MagicMock +from datetime import datetime, timezone + from services.reporting.report_s3_content_service import ReportS3ContentService def test_process_s3_content(mocker): service = ReportS3ContentService() - service.lloyd_george_bucket = "bucket-a" - service.bulk_staging_store = "bucket-b" + + service.bulk_staging_store = "bucket-a" service.statistic_reports_bucket = "reports-bucket" + service.s3_service = mocker.Mock() service.csv_generator = mocker.Mock() - fake_versions = [ + fake_objects = [ { "Key": "file1.txt", - "VersionId": "v1", - "IsLatest": True, - "LastModified": mocker.Mock(), + "LastModified": datetime.now(tz=timezone.utc), + "Size": 123, + "ETag": "etag1", + "StorageClass": "STANDARD", } ] - fake_delete_markers = [] - service.s3_service.list_all_object_versions.return_value = ( - fake_versions, - fake_delete_markers, - ) + service.s3_service.list_all_objects.return_value = fake_objects service.s3_service.get_object_tags_versioned.return_value = [ {"Key": "autodelete", "Value": "true"} ] @@ -31,4 +30,14 @@ def test_process_s3_content(mocker): service.process_s3_content() - assert service.s3_service.upload_file_obj.call_count == 2 + service.s3_service.list_all_objects.assert_called_once_with("bucket-a") + + service.s3_service.get_object_tags_versioned.assert_called_once_with( + "bucket-a", "file1.txt", None + ) + + service.csv_generator.generate_s3_inventory_csv.assert_called_once_with( + "bucket-a", fake_objects + ) + + service.s3_service.upload_file_obj.assert_called_once() From dbf24628b45c4f22d8af85e6761cbce3af8a34e3 Mon Sep 17 00:00:00 2001 From: PedroSoaresNHS Date: Mon, 16 Feb 2026 15:28:09 +0000 Subject: [PATCH 43/43] [PRMP-939] remove unused test --- lambdas/services/base/s3_service.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/lambdas/services/base/s3_service.py b/lambdas/services/base/s3_service.py index aea283c6aa..86a2234dd7 100644 --- a/lambdas/services/base/s3_service.py +++ b/lambdas/services/base/s3_service.py @@ -256,16 +256,6 @@ def save_or_create_file(self, source_bucket: str, file_key: str, body: bytes): Bucket=source_bucket, Key=file_key, Body=BytesIO(body) ) - def list_all_object_versions(self, bucket_name: str): - paginator = self.client.get_paginator("list_object_versions") - versions, delete_markers = [], [] - - for page in paginator.paginate(Bucket=bucket_name): - versions.extend(page.get("Versions", [])) - delete_markers.extend(page.get("DeleteMarkers", [])) - - return versions, delete_markers - def get_object_tags_versioned(self, bucket: str, key: str, version_id: str | None): try: params = {"Bucket": bucket, "Key": key}