From cea7b265db2dec9c443d98c037e3e5558dad305b Mon Sep 17 00:00:00 2001 From: "tom.droza2" Date: Fri, 19 Dec 2025 17:05:00 +0000 Subject: [PATCH 1/2] Added C4 diagrams for new SendToPrint architecture, including GuardDuty scanning Added markdown files for new Print Services component diagrams Update component names Reorder Print docs --- .../notifhir/printer/eventsfromprint/index.md | 2 +- .../notifhir/printer/printanalyser/index.md | 15 ++++++++ .../c4/notifhir/printer/printscanner/index.md | 15 ++++++++ .../{sendtoprint => printsender}/index.md | 10 ++--- docs/assets/aws-icons-mermaid.json | 10 ++--- .../_diagrams/c4code-mesh-acknowledger.md | 2 +- .../c4code-mesh-statusreporter-recorder.md | 2 +- .../_diagrams/c4code-nhsapp-callback.md | 2 +- .../_diagrams/c4code-pdm-poller.md | 2 +- .../_diagrams/c4code-pdm-upload.md | 2 +- .../_diagrams/c4code-printer-analyser.md | 22 +++++++++++ .../c4code-printer-removefromqueue.md | 2 +- .../_diagrams/c4code-printer-scanner.md | 38 +++++++++++++++++++ .../_diagrams/c4code-printer-sender.md | 21 ++++++++++ .../_diagrams/c4code-printer-sendtoprint.md | 27 ------------- .../_diagrams/sequence-print-metadata.md | 35 +++++++++++++++++ 16 files changed, 163 insertions(+), 44 deletions(-) create mode 100644 docs/architecture/c4/notifhir/printer/printanalyser/index.md create mode 100644 docs/architecture/c4/notifhir/printer/printscanner/index.md rename docs/architecture/c4/notifhir/printer/{sendtoprint => printsender}/index.md (57%) create mode 100644 docs/collections/_diagrams/c4code-printer-analyser.md create mode 100644 docs/collections/_diagrams/c4code-printer-scanner.md create mode 100644 docs/collections/_diagrams/c4code-printer-sender.md delete mode 100644 docs/collections/_diagrams/c4code-printer-sendtoprint.md create mode 100644 docs/collections/_diagrams/sequence-print-metadata.md diff --git a/docs/architecture/c4/notifhir/printer/eventsfromprint/index.md b/docs/architecture/c4/notifhir/printer/eventsfromprint/index.md index 843a104e..d3733dd6 100644 --- a/docs/architecture/c4/notifhir/printer/eventsfromprint/index.md +++ b/docs/architecture/c4/notifhir/printer/eventsfromprint/index.md @@ -2,7 +2,7 @@ title: Events from Supplier API parent: Print Supplier Services -nav_order: 9 +nav_order: 4 has_children: true is_not_draft: false last_modified_date: 2025-12-12 diff --git a/docs/architecture/c4/notifhir/printer/printanalyser/index.md b/docs/architecture/c4/notifhir/printer/printanalyser/index.md new file mode 100644 index 00000000..9000514d --- /dev/null +++ b/docs/architecture/c4/notifhir/printer/printanalyser/index.md @@ -0,0 +1,15 @@ +--- + +title: Print Analyser +parent: Print Supplier Services +nav_order: 2 +has_children: false +is_not_draft: false +last_modified_date: 2025-12-22 +owner: Ross Buggins +author: Tom D'Roza +diagrams: [c4code-printer-analyser] +events-raised: [print-letter-analysed] +events-consumed: [print-letter-safe] +c4type: code +--- diff --git a/docs/architecture/c4/notifhir/printer/printscanner/index.md b/docs/architecture/c4/notifhir/printer/printscanner/index.md new file mode 100644 index 00000000..733cf3da --- /dev/null +++ b/docs/architecture/c4/notifhir/printer/printscanner/index.md @@ -0,0 +1,15 @@ +--- + +title: Print Scanner +parent: Print Supplier Services +nav_order: 1 +has_children: false +is_not_draft: false +last_modified_date: 2025-12-22 +owner: Ross Buggins +author: Tom D'Roza +diagrams: [c4code-printer-scanner] +events-raised: [print-letter-safe] +events-consumed: [queue-item-dequeued] +c4type: code +--- diff --git a/docs/architecture/c4/notifhir/printer/sendtoprint/index.md b/docs/architecture/c4/notifhir/printer/printsender/index.md similarity index 57% rename from docs/architecture/c4/notifhir/printer/sendtoprint/index.md rename to docs/architecture/c4/notifhir/printer/printsender/index.md index b94b6a84..cd388e40 100644 --- a/docs/architecture/c4/notifhir/printer/sendtoprint/index.md +++ b/docs/architecture/c4/notifhir/printer/printsender/index.md @@ -1,15 +1,15 @@ --- -title: Send letter to print +title: Print Sender parent: Print Supplier Services -nav_order: 9 +nav_order: 3 has_children: false is_not_draft: false -last_modified_date: 2025-12-04 +last_modified_date: 2025-12-22 owner: Ross Buggins author: Tom D'Roza -diagrams: [] +diagrams: [c4code-printer-sender] events-raised: [external-supplier-api-letter-prepared] -events-consumed: [queue-item-dequeued] +events-consumed: [print-letter-analysed] c4type: code --- diff --git a/docs/assets/aws-icons-mermaid.json b/docs/assets/aws-icons-mermaid.json index 0771b0ab..acb06f6b 100644 --- a/docs/assets/aws-icons-mermaid.json +++ b/docs/assets/aws-icons-mermaid.json @@ -1086,6 +1086,11 @@ "height": 64, "width": 64 }, + "arch-amazon-guardduty": { + "body": "", + "height": 64, + "width": 64 + }, "artifact": { "body": "", "height": 64, @@ -2486,11 +2491,6 @@ "height": 64, "width": 64 }, - "guardduty": { - "body": "", - "height": 64, - "width": 64 - }, "health-dashboard": { "body": "", "height": 64, diff --git a/docs/collections/_diagrams/c4code-mesh-acknowledger.md b/docs/collections/_diagrams/c4code-mesh-acknowledger.md index 3a4ecbec..733eb5d1 100644 --- a/docs/collections/_diagrams/c4code-mesh-acknowledger.md +++ b/docs/collections/_diagrams/c4code-mesh-acknowledger.md @@ -8,7 +8,7 @@ title: c4code-mesh-acknowledger ```mermaid architecture-beta - group meshAcknowledger(cloud)[MeshAcknowledge] + group meshAcknowledger(cloud)[MeshAcknowledger] service meshDownloaded(aws:res-amazon-eventbridge-event)[MESHInboxMessageDownloaded Event] service meshAcknowledged(aws:res-amazon-eventbridge-event)[ MESHInboxMessageAcknowledged Event] service meshAckQueue(logos:aws-sqs)[MeshAcknowledgement Queue] in meshAcknowledger diff --git a/docs/collections/_diagrams/c4code-mesh-statusreporter-recorder.md b/docs/collections/_diagrams/c4code-mesh-statusreporter-recorder.md index c118a914..33735014 100644 --- a/docs/collections/_diagrams/c4code-mesh-statusreporter-recorder.md +++ b/docs/collections/_diagrams/c4code-mesh-statusreporter-recorder.md @@ -6,7 +6,7 @@ title: c4code-mesh-statusreporter-recorder ```mermaid architecture-beta - group statusRecorder(cloud)[StatusRecorder] + group statusRecorder(cloud)[ReportStatusRecorder] service report1Event(aws:res-amazon-eventbridge-event)[DigitalLetterRead Event] service report2Event(aws:res-amazon-eventbridge-event)[PrintingDispatched Event] service report3Event(aws:res-amazon-eventbridge-event)[NHSAppMessageRequested Event] diff --git a/docs/collections/_diagrams/c4code-nhsapp-callback.md b/docs/collections/_diagrams/c4code-nhsapp-callback.md index 8a74022f..47fadd5a 100644 --- a/docs/collections/_diagrams/c4code-nhsapp-callback.md +++ b/docs/collections/_diagrams/c4code-nhsapp-callback.md @@ -6,7 +6,7 @@ title: c4code-nhsapp-callback ```mermaid architecture-beta - group CallbackHandler(cloud)[NHSApp Callback Handler] + group CallbackHandler(cloud)[NHSAppCallbackHandler] service nhsapp(server)[NHS App] service apiGateway(aws:arch-amazon-api-gateway)[API Gateway] service lambda(logos:aws-lambda)[NHS App Callback Handler] in CallbackHandler diff --git a/docs/collections/_diagrams/c4code-pdm-poller.md b/docs/collections/_diagrams/c4code-pdm-poller.md index 4b091fac..447f6b4b 100644 --- a/docs/collections/_diagrams/c4code-pdm-poller.md +++ b/docs/collections/_diagrams/c4code-pdm-poller.md @@ -16,12 +16,12 @@ description: PDM Poller ```mermaid architecture-beta + group checkPdm(cloud)[PDMPoller] service pdmResourceSubmitted(aws:res-amazon-eventbridge-event)[PDMResourceSubmitted Event] service pdmResourceAvailable(aws:res-amazon-eventbridge-event)[PDMResourceUnavailable Event] service pdmResourceUnavailable2(aws:res-amazon-eventbridge-event)[PDMResourceAvailable Event] service pdmRetriesExceeded(aws:res-amazon-eventbridge-event)[PDMResourceRetriesExceeded Event] service pdmResourceUnavailable(aws:res-amazon-eventbridge-event)[PDMResourceUnavailable Event] - group checkPdm(cloud)[PDMPoller] service pollPdmQueue(logos:aws-sqs)[PollPDM SQS Delay Queue] in checkPdm service pollPdmLambda(logos:aws-lambda)[PollPDM] in checkPdm service pdm(server)[PDM] diff --git a/docs/collections/_diagrams/c4code-pdm-upload.md b/docs/collections/_diagrams/c4code-pdm-upload.md index 88d34453..fe62ded9 100644 --- a/docs/collections/_diagrams/c4code-pdm-upload.md +++ b/docs/collections/_diagrams/c4code-pdm-upload.md @@ -7,10 +7,10 @@ description: PDM Upload ```mermaid architecture-beta + group uploadToPdm(cloud)[PDMUploader] service meshDownloaded(aws:res-amazon-eventbridge-event)[MESHInboxMessageDownloaded Event] service pdmSaved(aws:res-amazon-eventbridge-event)[PDMResourceSubmitted Event] service pdmFailed(aws:res-amazon-eventbridge-event)[PDMResourceSubmssionRejected Event] - group uploadToPdm(cloud)[UploadToPDM] service uploadQueue(logos:aws-sqs)[UploadToPDM Queue] in uploadToPdm service uploadLambda(logos:aws-lambda)[UploadToPDM] in uploadToPdm service s3(logos:aws-s3)[DocumentReference] in uploadToPdm diff --git a/docs/collections/_diagrams/c4code-printer-analyser.md b/docs/collections/_diagrams/c4code-printer-analyser.md new file mode 100644 index 00000000..ef468cc0 --- /dev/null +++ b/docs/collections/_diagrams/c4code-printer-analyser.md @@ -0,0 +1,22 @@ +--- + +title: c4code-printer-analyser +--- + + +```mermaid +architecture-beta + service letterSafe(aws:res-amazon-eventbridge-event)[PrintLetterSafe Event] + service analyseQueue(logos:aws-sqs)[Analyse Queue] in printAnalyser + service analyseLambda(logos:aws-lambda)[PrintAnalyser] in printAnalyser + service safeBucket(logos:aws-s3)[SafeLetters] in printAnalyser + service letterAnalysed(aws:res-amazon-eventbridge-event)[PrintLetterAnalysed Event] + group printAnalyser(cloud)[PrintAnalyser] + + letterSafe:R --> L:analyseQueue + analyseQueue:R --> L:analyseLambda + safeBucket:B --> T:analyseLambda + analyseLambda:R --> L:letterAnalysed + + +``` diff --git a/docs/collections/_diagrams/c4code-printer-removefromqueue.md b/docs/collections/_diagrams/c4code-printer-removefromqueue.md index a4cc4aa0..1d667e4c 100644 --- a/docs/collections/_diagrams/c4code-printer-removefromqueue.md +++ b/docs/collections/_diagrams/c4code-printer-removefromqueue.md @@ -7,7 +7,7 @@ description: Manage TTL ```mermaid architecture-beta - group manageTTL(cloud)[ManageTTL] + group manageTTL(cloud)[QueueManager] service pollEvent(aws:res-amazon-eventbridge-event)[TTLPollTimerExpired Event] service manageLambda(logos:aws-lambda)[Poll TTL] in manageTTL service manageDb(aws:arch-amazon-dynamodb)[ItemsWithTTL] in manageTTL diff --git a/docs/collections/_diagrams/c4code-printer-scanner.md b/docs/collections/_diagrams/c4code-printer-scanner.md new file mode 100644 index 00000000..a4b8b6cd --- /dev/null +++ b/docs/collections/_diagrams/c4code-printer-scanner.md @@ -0,0 +1,38 @@ +--- + +title: c4code-printer-scanner +--- + + +```mermaid +architecture-beta + group printScanner(cloud)[PrintScanner] + service itemDequeued(aws:res-amazon-eventbridge-event)[ItemDequeued Event] + service analyseQueue(logos:aws-sqs)[Analyse Queue] in printScanner + service analyseLambda(logos:aws-lambda)[PrintScanner] in printScanner + service docRefBucket(logos:aws-s3)[DocumentReference] in printScanner + service lettersBucket(logos:aws-s3)[DigitalLetters] in printScanner + service quarantineBucket(logos:aws-s3)[QuarantinedLetters] in printScanner + service safeBucket(logos:aws-s3)[SafeLetters] in printScanner + service guardDuty(aws:arch-amazon-guardduty)[GuardDuty] in printScanner + service safeLetter(aws:res-amazon-eventbridge-event)[PrintLetterSafe Event] + service quarantinedLetter(aws:res-amazon-eventbridge-event)[PrintLetterQuarantined Event] + junction j1 in printScanner + junction j2 in printScanner + junction j3 in printScanner + + itemDequeued:R --> L:analyseQueue + docRefBucket:T --> B:analyseLambda + analyseQueue:R --> L:analyseLambda + analyseLambda:T --> B:lettersBucket + lettersBucket:R --> L:guardDuty + guardDuty:R -- L:j1 + j1:T -- B:j2 + j1:B -- T:j3 + j2:R --> L:quarantineBucket + quarantineBucket:R --> L:quarantinedLetter + j3:R --> L:safeBucket + safeBucket:R --> L:safeLetter + + +``` diff --git a/docs/collections/_diagrams/c4code-printer-sender.md b/docs/collections/_diagrams/c4code-printer-sender.md new file mode 100644 index 00000000..ac6ecad6 --- /dev/null +++ b/docs/collections/_diagrams/c4code-printer-sender.md @@ -0,0 +1,21 @@ +--- + +title: c4code-printer-sender + +--- + + +```mermaid +architecture-beta + service letterAnalysed(aws:res-amazon-eventbridge-event)[PrintLetterAnalysed Event] + service printQueue(logos:aws-sqs)[PrintSender Queue] in printSender + service printLambda(logos:aws-lambda)[PrintSender] in printSender + service letterPrepared(aws:res-amazon-eventbridge-event)[letterPREPARED Event] + group printSender(cloud)[PrintSender] + + letterAnalysed:R --> L:printQueue + printQueue:R --> L:printLambda + printLambda:R --> L:letterPrepared + + +``` diff --git a/docs/collections/_diagrams/c4code-printer-sendtoprint.md b/docs/collections/_diagrams/c4code-printer-sendtoprint.md deleted file mode 100644 index 9de9839d..00000000 --- a/docs/collections/_diagrams/c4code-printer-sendtoprint.md +++ /dev/null @@ -1,27 +0,0 @@ ---- - -title: c4code-printer-sendtoprint - ---- - - -```mermaid -architecture-beta - service itemDequeued(aws:res-amazon-eventbridge-event)[ItemDequeued Event] - service printQueue(logos:aws-sqs)[Print Queue] in sendToPrint - service printLambda(logos:aws-lambda)[Print] in sendToPrint - service docRefBucket(logos:aws-s3)[DocumentReference] in sendToPrint - service digLtrsBucket(logos:aws-s3)[DigitalLetters] in sendToPrint - service letterPrepared(aws:res-amazon-eventbridge-event)[LetterPrepared Event] - group sendToPrint(cloud)[SendToPrint] - junction j1 - - - itemDequeued:R --> L:printQueue - printQueue:R --> L:printLambda - printLambda:B <-- T:docRefBucket - printLambda:T --> B:digLtrsBucket - printLambda:R --> L:letterPrepared - - -``` diff --git a/docs/collections/_diagrams/sequence-print-metadata.md b/docs/collections/_diagrams/sequence-print-metadata.md new file mode 100644 index 00000000..91de6dc3 --- /dev/null +++ b/docs/collections/_diagrams/sequence-print-metadata.md @@ -0,0 +1,35 @@ +--- + +title: sequence-expire-print-ttl + +--- + +```mermaid +sequenceDiagram + participant dl as Digital Letters + participant s3 as S3 Bucket + participant eventBus as Event Bus + participant printApi as Print API + + eventBus ->> dl: ItemDequeued event + activate dl + dl ->> dl: Extract & Decode PDF + dl -) s3: Store PDF + deactivate dl + s3 -) s3: GuardDuty + s3 -) eventBus: ScanResult event + eventBus ->> dl: ScanResult event + activate dl + dl ->> s3: Get scanned PDF + activate s3 + s3 -->> dl: PDF + deactivate s3 + dl ->> dl: Count pages + dl ->> dl: SHA256 + dl ->> eventBus: LetterAvailable event + deactivate dl + eventBus ->> dl: LetterAvailable event + activate dl + dl -) printApi: letter.PREPARED event + deactivate dl +``` From 705585f454c7c7369c4c936bc39c8084f0222d26 Mon Sep 17 00:00:00 2001 From: "tom.droza2" Date: Mon, 5 Jan 2026 17:46:16 +0000 Subject: [PATCH 2/2] Updated sequence diagram for latest GuarDuty design --- .../_diagrams/c4code-printer-scanner.md | 22 +++--- .../_diagrams/sequence-print-metadata.md | 67 ++++++++++++------- .../2025-10-draft/defs/core.schema.yaml | 1 - 3 files changed, 57 insertions(+), 33 deletions(-) diff --git a/docs/collections/_diagrams/c4code-printer-scanner.md b/docs/collections/_diagrams/c4code-printer-scanner.md index a4b8b6cd..38ed9126 100644 --- a/docs/collections/_diagrams/c4code-printer-scanner.md +++ b/docs/collections/_diagrams/c4code-printer-scanner.md @@ -8,25 +8,29 @@ title: c4code-printer-scanner architecture-beta group printScanner(cloud)[PrintScanner] service itemDequeued(aws:res-amazon-eventbridge-event)[ItemDequeued Event] - service analyseQueue(logos:aws-sqs)[Analyse Queue] in printScanner - service analyseLambda(logos:aws-lambda)[PrintScanner] in printScanner + service scannerQueue(logos:aws-sqs)[Scanner Queue] in printScanner + service scannerLambda(logos:aws-lambda)[PrintScanner] in printScanner + service moveLambda(logos:aws-lambda)[MoveLetters] in printScanner service docRefBucket(logos:aws-s3)[DocumentReference] in printScanner - service lettersBucket(logos:aws-s3)[DigitalLetters] in printScanner + service unscannedBucket(logos:aws-s3)[UnscannedLetters] in printScanner service quarantineBucket(logos:aws-s3)[QuarantinedLetters] in printScanner service safeBucket(logos:aws-s3)[SafeLetters] in printScanner service guardDuty(aws:arch-amazon-guardduty)[GuardDuty] in printScanner + service scanComplete(aws:res-amazon-eventbridge-event)[ScanResult Event] service safeLetter(aws:res-amazon-eventbridge-event)[PrintLetterSafe Event] service quarantinedLetter(aws:res-amazon-eventbridge-event)[PrintLetterQuarantined Event] junction j1 in printScanner junction j2 in printScanner junction j3 in printScanner - itemDequeued:R --> L:analyseQueue - docRefBucket:T --> B:analyseLambda - analyseQueue:R --> L:analyseLambda - analyseLambda:T --> B:lettersBucket - lettersBucket:R --> L:guardDuty - guardDuty:R -- L:j1 + itemDequeued:R --> L:scannerQueue + docRefBucket:B --> T:scannerLambda + scannerQueue:R --> L:scannerLambda + scannerLambda:B --> T:unscannedBucket + unscannedBucket:R --> L:guardDuty + guardDuty:R --> L:scanComplete + scanComplete:R --> L:moveLambda + moveLambda:R -- L:j1 j1:T -- B:j2 j1:B -- T:j3 j2:R --> L:quarantineBucket diff --git a/docs/collections/_diagrams/sequence-print-metadata.md b/docs/collections/_diagrams/sequence-print-metadata.md index 91de6dc3..43213d30 100644 --- a/docs/collections/_diagrams/sequence-print-metadata.md +++ b/docs/collections/_diagrams/sequence-print-metadata.md @@ -6,30 +6,51 @@ title: sequence-expire-print-ttl ```mermaid sequenceDiagram - participant dl as Digital Letters - participant s3 as S3 Bucket + participant scannerlambda as Lambda
PrintScanner + participant analyserLambda as Lambda
PrintAnalyser + participant senderLambda as Lambda
PrintSender + participant moveLambda as Lambda
MoveLetters + participant unscannedS3 as S3
UnscannedLetters + participant gd as GuardDuty + participant safeS3 as S3
SafeLetters + participant quarantinedS3 as S3
QuarantinedLetters participant eventBus as Event Bus participant printApi as Print API - eventBus ->> dl: ItemDequeued event - activate dl - dl ->> dl: Extract & Decode PDF - dl -) s3: Store PDF - deactivate dl - s3 -) s3: GuardDuty - s3 -) eventBus: ScanResult event - eventBus ->> dl: ScanResult event - activate dl - dl ->> s3: Get scanned PDF - activate s3 - s3 -->> dl: PDF - deactivate s3 - dl ->> dl: Count pages - dl ->> dl: SHA256 - dl ->> eventBus: LetterAvailable event - deactivate dl - eventBus ->> dl: LetterAvailable event - activate dl - dl -) printApi: letter.PREPARED event - deactivate dl + eventBus ->> scannerlambda: ItemDequeued event + activate scannerlambda + scannerlambda ->> scannerlambda: Extract & Decode PDF + scannerlambda -) unscannedS3: Store PDF + deactivate scannerlambda + unscannedS3 -) gd: S3 new object event + activate gd + gd -) gd: Scan for threats + gd -) eventBus: ScanResult event + deactivate gd + eventBus -) moveLambda: ScanResult event + activate moveLambda + alt Move scanned letter + moveLambda ->> safeS3: Store safe PDF + moveLambda ->> eventBus: PrintLetterSafe event + else + moveLambda ->> quarantinedS3: Store quarantined PDF + moveLambda ->> eventBus: PrintLetterQuarantined event + end + moveLambda ->> unscannedS3: Delete unscanned PDF + deactivate moveLambda + eventBus -) analyserLambda: PrintLetterSafe event + activate analyserLambda + analyserLambda ->> safeS3: Get scanned PDF + activate safeS3 + safeS3 -->> analyserLambda: PDF + deactivate safeS3 + analyserLambda ->> analyserLambda: Count pages + analyserLambda ->> analyserLambda: SHA256 + analyserLambda ->> eventBus: PrintLetterAnalysed event + deactivate analyserLambda + eventBus -) senderLambda: PrintLetterAnalysed event + activate senderLambda + senderLambda -) eventBus: letter.PREPARED event + deactivate senderLambda + eventBus -) printApi: letter.PREPARED event ``` diff --git a/src/cloudevents/domains/digital-letters/2025-10-draft/defs/core.schema.yaml b/src/cloudevents/domains/digital-letters/2025-10-draft/defs/core.schema.yaml index 45d8c45a..7dc5cd94 100644 --- a/src/cloudevents/domains/digital-letters/2025-10-draft/defs/core.schema.yaml +++ b/src/cloudevents/domains/digital-letters/2025-10-draft/defs/core.schema.yaml @@ -25,5 +25,4 @@ properties: "2025-10-01T10:15:30.000Z" ] type: "string" - format: "date-time" pattern: "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"