@memoarchitect/ontology 0.13.2 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -3
- package/examples/connected-patient-monitor/memo.identity.yaml +34 -0
- package/examples/connected-patient-monitor/memo.package.yaml +3 -1
- package/examples/connected-patient-monitor/model/catalog/connected_patient_monitor.sysml +17 -12
- package/examples/connected-patient-monitor/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/embedded-infusion-pump/memo.package.yaml +3 -1
- package/examples/embedded-infusion-pump/model/catalog/embedded_infusion_pump.sysml +6 -6
- package/examples/embedded-infusion-pump/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/functional-logical-physical/memo.identity.yaml +28 -0
- package/examples/functional-logical-physical/memo.package.yaml +3 -1
- package/examples/functional-logical-physical/model/catalog/functional_logical_physical.sysml +5 -5
- package/examples/functional-logical-physical/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/gpca-pump/analysis/Samples/01-model-overview.ipynb +40 -139
- package/examples/gpca-pump/analysis/Samples/02-architecture-hotspots.ipynb +38 -290
- package/examples/gpca-pump/analysis/Samples/03-model-quality.ipynb +47 -217
- package/examples/gpca-pump/analysis/Samples/04-change-impact-explorer.ipynb +50 -191
- package/examples/gpca-pump/analysis/Samples/05-model-charts.ipynb +42 -181
- package/examples/gpca-pump/analysis/Samples/06-ownership-graph.ipynb +40 -164
- package/examples/gpca-pump/analysis/Samples/07-model-inventory-table.ipynb +51 -172
- package/examples/gpca-pump/analysis/Samples/README.md +15 -9
- package/examples/gpca-pump/analysis/memo_model.py +243 -0
- package/examples/gpca-pump/memo.identity.yaml +521 -26
- package/examples/gpca-pump/memo.package.yaml +3 -1
- package/examples/gpca-pump/methodology/gpca_profiles.sysml +56 -47
- package/examples/gpca-pump/model/catalog/gpca_analysis.sysml +51 -78
- package/examples/gpca-pump/model/catalog/gpca_architecture.sysml +359 -357
- package/examples/gpca-pump/model/catalog/gpca_behavior_actions.sysml +9 -9
- package/examples/gpca-pump/model/catalog/gpca_behavior_modes.sysml +56 -69
- package/examples/gpca-pump/model/catalog/gpca_behavior_subsystems.sysml +44 -59
- package/examples/gpca-pump/model/catalog/gpca_context.sysml +23 -35
- package/examples/gpca-pump/model/catalog/gpca_cybersecurity.sysml +33 -40
- package/examples/gpca-pump/model/catalog/gpca_formal_behavior.sysml +62 -63
- package/examples/gpca-pump/model/catalog/gpca_interfaces.sysml +362 -483
- package/examples/gpca-pump/model/catalog/gpca_operational.sysml +45 -70
- package/examples/gpca-pump/model/catalog/gpca_physical.sysml +6 -12
- package/examples/gpca-pump/model/catalog/gpca_requirements.sysml +173 -169
- package/examples/gpca-pump/model/catalog/gpca_risk.sysml +139 -225
- package/examples/gpca-pump/model/catalog/gpca_standards.sysml +43 -47
- package/examples/gpca-pump/model/catalog/gpca_system.sysml +68 -65
- package/examples/gpca-pump/model/catalog/gpca_trace.sysml +147 -116
- package/examples/gpca-pump/model/catalog/gpca_verification.sysml +65 -90
- package/examples/gpca-pump/model/catalog/viewpoints/context/views/context_system_context_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/cybersecurity_cybersecurity_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_cyber_assessment_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/cybersecurity/views/document_threat_model_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_allocation_view.sysml +2 -4
- package/examples/gpca-pump/model/catalog/viewpoints/functional/views/functional_function_browser_view.sysml +7 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/behavior_action_flow_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/document_architecture_description_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_device_interconnect_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_logical_architecture_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_mode_state_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/logical/views/logical_system_decomposition_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_scenario_sequence_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/operational/views/operational_use_case_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/physical/views/physical_physical_bom_view.sysml +2 -4
- package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/document_dhf_index_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/requirements/views/requirements_requirements_trace_view.sysml +2 -4
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_hazard_analysis_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/document_rmf_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_fmea_view.sysml +2 -4
- package/examples/gpca-pump/model/catalog/viewpoints/risk/views/risk_risk_chain_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/software/views/document_sdd_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/software/views/software_software_architecture_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/usability/views/document_usability_view.sysml +4 -6
- package/examples/gpca-pump/model/catalog/viewpoints/verification/views/document_vv_view.sysml +3 -5
- package/examples/gpca-pump/model/catalog/viewpoints/verification/views/verification_verification_coverage_view.sysml +2 -4
- package/examples/gpca-pump/model/{catalog → methodology}/project.sysml +8 -6
- package/examples/ivd-laboratory-system/memo.package.yaml +3 -1
- package/examples/ivd-laboratory-system/model/catalog/ivd_laboratory_system.sysml +12 -9
- package/examples/ivd-laboratory-system/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/manual-surgical-instrument/memo.package.yaml +3 -1
- package/examples/manual-surgical-instrument/model/catalog/manual_surgical_instrument.sysml +2 -6
- package/examples/manual-surgical-instrument/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/multidimensional-layers/memo.package.yaml +3 -1
- package/examples/multidimensional-layers/model/catalog/multidimensional_layers.sysml +2 -4
- package/examples/multidimensional-layers/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/nested-architecture-dsm/memo.identity.yaml +93 -0
- package/examples/nested-architecture-dsm/memo.package.yaml +3 -1
- package/examples/nested-architecture-dsm/model/catalog/architecture/functional/functions.sysml +30 -30
- package/examples/nested-architecture-dsm/model/catalog/architecture/logical/structure.sysml +28 -28
- package/examples/nested-architecture-dsm/model/catalog/architecture/operational/context.sysml +2 -4
- package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/needs.sysml +4 -4
- package/examples/nested-architecture-dsm/model/catalog/assurance/requirements/requirements.sysml +7 -7
- package/examples/nested-architecture-dsm/model/catalog/assurance/verification_validation/verification_validation.sysml +8 -8
- package/examples/nested-architecture-dsm/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/reusable-instrument/memo.package.yaml +3 -1
- package/examples/reusable-instrument/model/catalog/reusable_instrument.sysml +7 -7
- package/examples/reusable-instrument/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/robot-cell-family/README.md +34 -0
- package/examples/robot-cell-family/memo.identity.yaml +142 -0
- package/examples/robot-cell-family/memo.package.yaml +7 -0
- package/examples/robot-cell-family/model/methodology/project.sysml +30 -0
- package/examples/robot-cell-family/model/shared/shared.sysml +53 -0
- package/examples/robot-cell-family/model/sos/chains.sysml +36 -0
- package/examples/robot-cell-family/model/sos/icds.sysml +29 -0
- package/examples/robot-cell-family/model/sos/sos.sysml +31 -0
- package/examples/robot-cell-family/model/sos/use_cases.sysml +25 -0
- package/examples/robot-cell-family/model/systems/manipulation/manipulation_system.sysml +35 -0
- package/examples/robot-cell-family/model/systems/navigation/navigation_system.sysml +46 -0
- package/examples/robot-cell-family/model/systems/perception/perception_system.sysml +37 -0
- package/examples/robot-platform/memo.package.yaml +3 -0
- package/examples/robot-platform/model/platform.sysml +15 -0
- package/examples/ros-mobile-robot/README.md +5 -4
- package/examples/ros-mobile-robot/memo.identity.yaml +94 -0
- package/examples/ros-mobile-robot/memo.package.yaml +3 -1
- package/examples/ros-mobile-robot/model/catalog/ros_mobile_robot.sysml +26 -29
- package/examples/ros-mobile-robot/model/{catalog → methodology}/project.sysml +8 -14
- package/examples/software-only-medical-device/memo.package.yaml +3 -1
- package/examples/software-only-medical-device/model/catalog/software_only_medical_device.sysml +9 -10
- package/examples/software-only-medical-device/model/{catalog → methodology}/project.sysml +8 -9
- package/examples/surgical-closure-workflow/memo.package.yaml +3 -1
- package/examples/surgical-closure-workflow/model/catalog/surgical_closure_workflow.sysml +23 -26
- package/examples/surgical-closure-workflow/model/{catalog → methodology}/project.sysml +7 -5
- package/examples/surgical-robot/memo.package.yaml +3 -1
- package/examples/surgical-robot/model/catalog/surgical_robot.sysml +14 -12
- package/examples/surgical-robot/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/sysml-diagram-samples/README.md +1 -0
- package/examples/sysml-diagram-samples/memo.identity.yaml +459 -0
- package/examples/sysml-diagram-samples/memo.package.yaml +3 -1
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/viewpoint.sysml +10 -20
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/action_flow_view.sysml +5 -5
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/browser_view.sysml +10 -13
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.sysml +11 -7
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/diagram_samples.sysml +63 -8
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/drill_down_view.sysml +88 -0
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/functional_flow_view.sysml +25 -25
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/grid_view.sysml +6 -6
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.sysml +15 -17
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.sysml +21 -21
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/package_view.sysml +7 -7
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/requirements_view.sysml +5 -5
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/sequence_view.sysml +14 -14
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/state_transition_view.sysml +16 -17
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/tree_view.sysml +9 -9
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/use_case_view.sysml +7 -14
- package/examples/sysml-diagram-samples/model/{catalog → methodology}/project.sysml +5 -5
- package/examples/sysml-diagram-samples/model/sysml_v2_activity_example.sysml +1 -1
- package/examples/temperature-alarm/memo.identity.yaml +6 -0
- package/examples/temperature-alarm/memo.package.yaml +3 -1
- package/examples/temperature-alarm/model/catalog/temperature_alarm.sysml +43 -21
- package/examples/temperature-alarm/model/{catalog → methodology}/project.sysml +4 -5
- package/examples/ui-screen-regions/memo.identity.yaml +33 -0
- package/examples/ui-screen-regions/memo.package.yaml +3 -1
- package/examples/ui-screen-regions/model/catalog/architecture/functional/functions.sysml +12 -12
- package/examples/ui-screen-regions/model/catalog/architecture/implementation/ui.sysml +18 -18
- package/examples/ui-screen-regions/model/catalog/artifacts/assets/catalog.sysml +6 -6
- package/examples/ui-screen-regions/model/catalog/artifacts/reviews/comments.sysml +3 -3
- package/examples/ui-screen-regions/model/catalog/artifacts/reviews/notes.sysml +1 -1
- package/examples/ui-screen-regions/model/catalog/artifacts/reviews/rationales.sysml +1 -1
- package/examples/ui-screen-regions/model/catalog/assurance/human_factors/human_factors.sysml +10 -10
- package/examples/ui-screen-regions/model/catalog/assurance/requirements/needs.sysml +1 -1
- package/examples/ui-screen-regions/model/catalog/assurance/requirements/requirements.sysml +12 -12
- package/examples/ui-screen-regions/model/catalog/assurance/safety_risk/risk.sysml +15 -15
- package/examples/ui-screen-regions/model/catalog/assurance/verification_validation/verification_validation.sysml +6 -6
- package/examples/ui-screen-regions/model/catalog/viewpoints/functional/views/ui_functional_tree.sysml +1 -2
- package/examples/ui-screen-regions/model/catalog/viewpoints/requirements/views/ui_requirements_trace.sysml +1 -2
- package/examples/ui-screen-regions/model/catalog/viewpoints/risk/views/ui_risk_chain.sysml +1 -2
- package/examples/ui-screen-regions/model/{catalog → methodology}/project.sysml +4 -5
- package/extensions/README.md +65 -16
- package/extensions/aadl/memo.package.yaml +1 -1
- package/extensions/aadl/src/aadl_extension.sysml +5 -2
- package/extensions/aadl/src/correspondence/memo_aadl_correspondence.sysml +29 -50
- package/extensions/clinical/memo.package.yaml +1 -1
- package/extensions/clinical/src/clinical_extension.sysml +2 -0
- package/extensions/cloud/memo.package.yaml +1 -1
- package/extensions/container/memo.package.yaml +1 -1
- package/extensions/messaging/memo.package.yaml +1 -1
- package/extensions/messaging/src/messaging_extension.sysml +2 -2
- package/extensions/ros/memo.package.yaml +1 -1
- package/extensions/ros/src/ros_extension.sysml +25 -24
- package/extensions/template/memo.package.yaml +1 -1
- package/extensions/template/model/extension.sysml +25 -0
- package/memo.manifest.yaml +1 -7
- package/methodologies/default/memo.package.yaml +1 -1
- package/methodologies/gpca/memo.package.yaml +1 -1
- package/ontology/memo.package.yaml +1 -1
- package/package.json +6 -4
- package/profile/memo.package.yaml +1 -1
- package/src/architecture/decisions/memo_decisions.sysml +9 -2
- package/src/architecture/functional/behavior/memo_behavior.sysml +27 -7
- package/src/architecture/functional/functions/memo_functions.sysml +45 -31
- package/src/architecture/functional/memo_architecture_functional.sysml +14 -0
- package/src/architecture/implementation/memo_architecture_implementation.sysml +21 -0
- package/src/architecture/implementation/software/runtime/memo_software_runtime.sysml +7 -0
- package/src/architecture/implementation/software/structure/memo_software_structure.sysml +58 -17
- package/src/architecture/implementation/ui/memo_ui.sysml +1 -1
- package/src/architecture/logical/interfaces/memo_interfaces.sysml +67 -58
- package/src/architecture/logical/memo_architecture_logical.sysml +13 -0
- package/src/architecture/logical/structure/memo_logical_structure.sysml +27 -8
- package/src/architecture/operational/context/stakeholders/memo_stakeholders.sysml +4 -1
- package/src/architecture/operational/memo_architecture_operational.sysml +19 -0
- package/src/architecture/operational/scenarios/memo_scenarios.sysml +9 -8
- package/src/architecture/operational/structure/memo_operational.sysml +5 -2
- package/src/architecture/operational/use_cases/memo_use_cases.sysml +16 -8
- package/src/architecture/realization/deployment/memo_deployment.sysml +30 -10
- package/src/architecture/realization/memo_architecture_realization.sysml +13 -0
- package/src/architecture/realization/physical/memo_physical_architecture.sysml +61 -0
- package/src/architecture/variability/memo_variability.sysml +87 -0
- package/src/artifacts/configuration_management/memo_configuration_management.sysml +95 -3
- package/src/artifacts/core/memo_controlled_artifacts.sysml +4 -2
- package/src/artifacts/standards/cfr_21_820.sysml +12 -24
- package/src/artifacts/standards/fda_cybersecurity_2023.sysml +13 -20
- package/src/artifacts/standards/iec_60601_1.sysml +16 -32
- package/src/artifacts/standards/iec_60601_1_2.sysml +5 -10
- package/src/artifacts/standards/iec_60812.sysml +4 -8
- package/src/artifacts/standards/iec_62304.sysml +607 -47
- package/src/artifacts/standards/iec_62366_1.sysml +12 -24
- package/src/artifacts/standards/iec_81001_5_1.sysml +8 -16
- package/src/artifacts/standards/iso_13485.sysml +12 -24
- package/src/artifacts/standards/iso_14971.sysml +118 -20
- package/src/artifacts/standards/iso_iec_ieee_42010.sysml +3 -6
- package/src/artifacts/standards/memo_artifacts_standards_traceability.sysml +14 -4
- package/src/artifacts/templates/dhf/fda-cybersecurity/postmarket-surveillance.md +1 -2
- package/src/artifacts/templates/dhf/fda-cybersecurity/vuln-assessment.md +1 -2
- package/src/artifacts/templates/dhf/iec-62304/sad.md +1 -2
- package/src/artifacts/templates/dhf/iec-62304/sbom.md +1 -2
- package/src/artifacts/templates/dhf/iec-62304/sdp.md +1 -2
- package/src/artifacts/templates/dhf/iec-62304/soup.md +3 -5
- package/src/artifacts/templates/dhf/system/sad.md +1 -1
- package/src/artifacts/templates/dhf/system/standards-checklist.md +2 -2
- package/src/artifacts/templates/dhf/system/standards-traceability.md +1 -1
- package/src/assurance/cybersecurity/memo_cybersecurity.sysml +339 -13
- package/src/assurance/human_factors/memo_human_factors.sysml +6 -2
- package/src/assurance/safety_risk/analysis/memo_fmea.sysml +7 -3
- package/src/assurance/safety_risk/memo_risk.sysml +39 -1
- package/src/core/common/memo_common.sysml +61 -68
- package/src/core/enumerations/memo_enumerations.sysml +93 -9
- package/src/core/relationships/memo_relationships.sysml +17 -11
- package/src/core/relationships/memo_workspace_membership.sysml +284 -0
- package/src/core/semantics/semantics.sysml +58 -0
- package/src/core/terminology/terminology.sysml +7 -0
- package/src/memo_namespaces.sysml +6 -0
- package/src/methodology/archetypes/memo_archetypes.sysml +8 -16
- package/src/methodology/core/memo_core.sysml +85 -29
- package/src/methodology/profiles/memo_profiles.sysml +217 -61
- package/src/methodology/workflow/memo_workflow.sysml +28 -0
- package/src/rules/closure/closure_rules.sysml +250 -4
- package/src/rules/crosslayer/cross_layer_rules.sysml +11 -0
- package/src/rules/ontology/ontology_invariants.sysml +288 -48
- package/src/rules/quantitative/quantitative_rules.sysml +4 -0
- package/src/viewpoints/catalog/memo_viewpoint_catalog.sysml +28 -28
- package/src/viewpoints/clinical/clinical_viewpoint.sysml +2 -3
- package/src/viewpoints/context/context_viewpoint.sysml +2 -3
- package/src/viewpoints/context/views/system_context_view/system_context_view.sysml +3 -5
- package/src/viewpoints/cybersecurity/cybersecurity_viewpoint.sysml +2 -3
- package/src/viewpoints/definitions/memo_view_layout.sysml +150 -0
- package/src/viewpoints/definitions/memo_viewpoint_definitions.sysml +0 -4
- package/src/viewpoints/functional/functional_viewpoint.sysml +2 -3
- package/src/viewpoints/functional/views/function_allocation_view/function_allocation_view.sysml +2 -4
- package/src/viewpoints/functional/views/system_functional_tree_view/system_functional_tree_view.sysml +2 -4
- package/src/viewpoints/logical/logical_viewpoint.sysml +2 -3
- package/src/viewpoints/logical/views/logical_architecture_view/logical_architecture_view.sysml +2 -4
- package/src/viewpoints/operational/operational_viewpoint.sysml +2 -3
- package/src/viewpoints/operational/views/use_case_view/use_case_view.sysml +3 -5
- package/src/viewpoints/physical/physical_viewpoint.sysml +2 -3
- package/src/viewpoints/physical/views/network_topology_view/network_topology_view.sysml +2 -4
- package/src/viewpoints/physical/views/physical_bom_view/physical_bom_view.sysml +2 -4
- package/src/viewpoints/rendering/memo_rendering.sysml +50 -98
- package/src/viewpoints/requirements/requirements_viewpoint.sysml +2 -3
- package/src/viewpoints/requirements/views/requirements_traceability_view/requirements_traceability_view.sysml +2 -4
- package/src/viewpoints/risk/risk_viewpoint.sysml +2 -3
- package/src/viewpoints/risk/views/risk_chain_view/risk_chain_view.sysml +2 -4
- package/src/viewpoints/software/software_viewpoint.sysml +2 -3
- package/src/viewpoints/software/views/software_architecture_view/software_architecture_view.sysml +3 -5
- package/src/viewpoints/stakeholders_concerns/memo_stakeholders_concerns.sysml +11 -29
- package/src/viewpoints/ui_layout/ui_layout_viewpoint.sysml +2 -3
- package/src/viewpoints/ui_layout/views/screen_layout_view/screen_layout_view.sysml +1 -1
- package/src/viewpoints/usability/usability_viewpoint.sysml +2 -3
- package/src/viewpoints/verification/verification_viewpoint.sysml +2 -3
- package/src/viewpoints/verification/views/verification_coverage_view/verification_coverage_view.sysml +2 -4
- package/stage1/syside-67f92dc96ba75cd05b5c8d13.ids.gz +0 -0
- package/stage1/syside-67f92dc96ba75cd05b5c8d13.json.gz +0 -0
- package/templates/default/memo.package.yaml +6 -1
- package/templates/default/model/catalog/architecture/system.sysml +7 -3
- package/templates/default/model/{catalog → methodology}/project.sysml +3 -4
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/context_view.viewlayout +0 -47
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/interconnection_view.viewlayout +0 -94
- package/examples/sysml-diagram-samples/model/catalog/viewpoints/unassigned/views/operational_behaviour_view.viewlayout +0 -13
- package/examples/ui-screen-regions/model/catalog/relationships.sysml +0 -8
- package/extensions/aadl/src/methodology/aadl_methodology.sysml +0 -19
- package/extensions/clinical/src/methodology/clinical_methodology.sysml +0 -24
- package/extensions/cloud/src/methodology/cloud_methodology.sysml +0 -19
- package/extensions/container/src/methodology/container_methodology.sysml +0 -19
- package/extensions/messaging/src/methodology/messaging_methodology.sysml +0 -19
- package/extensions/ros/src/methodology/ros_methodology.sysml +0 -27
- package/extensions/template/src/extension.sysml +0 -39
- package/templates/connected-device/memo.package.yaml +0 -13
- package/templates/connected-device/model/catalog/architecture/system.sysml +0 -5
- package/templates/connected-device/model/catalog/artifacts/catalog.sysml +0 -5
- package/templates/connected-device/model/catalog/assurance/requirements.sysml +0 -7
- package/templates/connected-device/model/catalog/project.sysml +0 -30
- package/templates/connected-device/package.json +0 -8
- package/templates/connected-device/syside.toml +0 -13
- package/templates/infusion-pump/memo.package.yaml +0 -13
- package/templates/infusion-pump/model/catalog/architecture/system.sysml +0 -5
- package/templates/infusion-pump/model/catalog/artifacts/catalog.sysml +0 -5
- package/templates/infusion-pump/model/catalog/assurance/requirements.sysml +0 -7
- package/templates/infusion-pump/model/catalog/project.sysml +0 -30
- package/templates/infusion-pump/package.json +0 -8
- package/templates/infusion-pump/syside.toml +0 -13
- package/templates/monitoring-device/memo.package.yaml +0 -13
- package/templates/monitoring-device/model/catalog/architecture/system.sysml +0 -5
- package/templates/monitoring-device/model/catalog/artifacts/catalog.sysml +0 -5
- package/templates/monitoring-device/model/catalog/assurance/requirements.sysml +0 -7
- package/templates/monitoring-device/model/catalog/project.sysml +0 -30
- package/templates/monitoring-device/package.json +0 -8
- package/templates/monitoring-device/syside.toml +0 -13
- package/templates/samd/memo.package.yaml +0 -13
- package/templates/samd/model/catalog/architecture/system.sysml +0 -5
- package/templates/samd/model/catalog/artifacts/catalog.sysml +0 -5
- package/templates/samd/model/catalog/assurance/requirements.sysml +0 -7
- package/templates/samd/model/catalog/project.sysml +0 -30
- package/templates/samd/package.json +0 -8
- package/templates/samd/syside.toml +0 -13
|
@@ -11,8 +11,8 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
11
11
|
private import memo_core_common::MemoIdentity;
|
|
12
12
|
// ── Logical functions ───────────────────────────────────────
|
|
13
13
|
action fnAcquireSensors : SystemFunction {
|
|
14
|
-
@MemoIdentity { :>> providedId = "FUNC-001"; }
|
|
15
|
-
|
|
14
|
+
@MemoIdentity { :>> providedId = "FUNC-001"; :>> label = "AcquireSensorData"; }
|
|
15
|
+
out sensorVectorOut : InterfaceItem;
|
|
16
16
|
attribute :>> functionCategory = "sensing";
|
|
17
17
|
attribute :>> trigger = "every 20 ms execution step";
|
|
18
18
|
attribute :>> outputSummary = "Debounced, range-checked sensor status vector";
|
|
@@ -28,8 +28,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
28
28
|
// requires — a component function allocated nowhere is a
|
|
29
29
|
// responsibility nobody has accepted.
|
|
30
30
|
action cfnMeasureFlowRate : ComponentFunction {
|
|
31
|
-
@MemoIdentity { :>> providedId = "CFUN-001"; }
|
|
32
|
-
attribute :>> name = "MeasureFlowRate";
|
|
31
|
+
@MemoIdentity { :>> providedId = "CFUN-001"; :>> label = "MeasureFlowRate"; }
|
|
33
32
|
attribute :>> functionCategory = "sensing";
|
|
34
33
|
attribute :>> actionKind = ActionKind::sense;
|
|
35
34
|
attribute :>> trigger = "continuous, sampled every 20 ms execution step";
|
|
@@ -38,8 +37,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
38
37
|
attribute :>> criticality = CriticalityKind::catastrophic;
|
|
39
38
|
}
|
|
40
39
|
action cfnDetectAirInLine : ComponentFunction {
|
|
41
|
-
@MemoIdentity { :>> providedId = "CFUN-002"; }
|
|
42
|
-
attribute :>> name = "DetectAirInLine";
|
|
40
|
+
@MemoIdentity { :>> providedId = "CFUN-002"; :>> label = "DetectAirInLine"; }
|
|
43
41
|
attribute :>> functionCategory = "protection";
|
|
44
42
|
attribute :>> actionKind = ActionKind::sense;
|
|
45
43
|
attribute :>> trigger = "continuous, sampled every 20 ms execution step";
|
|
@@ -49,8 +47,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
49
47
|
}
|
|
50
48
|
// The subassembly case: a component function need not sit on a leaf part.
|
|
51
49
|
action cfnAggregateSensorStatus : ComponentFunction {
|
|
52
|
-
@MemoIdentity { :>> providedId = "CFUN-003"; }
|
|
53
|
-
attribute :>> name = "AggregateSensorStatus";
|
|
50
|
+
@MemoIdentity { :>> providedId = "CFUN-003"; :>> label = "AggregateSensorStatus"; }
|
|
54
51
|
attribute :>> functionCategory = "sensing";
|
|
55
52
|
attribute :>> actionKind = ActionKind::transform;
|
|
56
53
|
attribute :>> trigger = "every 20 ms execution step";
|
|
@@ -61,8 +58,8 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
61
58
|
}
|
|
62
59
|
|
|
63
60
|
action fnValidatePrescription : SystemFunction {
|
|
64
|
-
@MemoIdentity { :>> providedId = "FUNC-002"; }
|
|
65
|
-
|
|
61
|
+
@MemoIdentity { :>> providedId = "FUNC-002"; :>> label = "ValidatePrescription"; }
|
|
62
|
+
in prescriptionIn : InterfaceItem;
|
|
66
63
|
attribute :>> functionCategory = "configuration";
|
|
67
64
|
attribute :>> trigger = "prescription entry or edit";
|
|
68
65
|
attribute :>> outputSummary = "Prescription accepted (within drug-library hard/soft limits) or rejected with reason";
|
|
@@ -70,8 +67,9 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
70
67
|
attribute :>> criticality = CriticalityKind::catastrophic;
|
|
71
68
|
}
|
|
72
69
|
action fnMonitorAlarm : SystemFunction {
|
|
73
|
-
@MemoIdentity { :>> providedId = "FUNC-003"; }
|
|
74
|
-
|
|
70
|
+
@MemoIdentity { :>> providedId = "FUNC-003"; :>> label = "MonitorExceptionalConditions"; }
|
|
71
|
+
in sensorVectorIn : InterfaceItem;
|
|
72
|
+
out alarmSignalOut : InterfaceItem;
|
|
75
73
|
attribute :>> functionCategory = "alarm";
|
|
76
74
|
attribute :>> trigger = "every 20 ms execution step";
|
|
77
75
|
attribute :>> outputSummary = "Alarm outputs and inhibition conditions";
|
|
@@ -79,8 +77,8 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
79
77
|
attribute :>> criticality = CriticalityKind::catastrophic;
|
|
80
78
|
}
|
|
81
79
|
action fnAnnunciate : SystemFunction {
|
|
82
|
-
@MemoIdentity { :>> providedId = "FUNC-004"; }
|
|
83
|
-
|
|
80
|
+
@MemoIdentity { :>> providedId = "FUNC-004"; :>> label = "AnnunciateAlarms"; }
|
|
81
|
+
in alarmSignalIn : InterfaceItem;
|
|
84
82
|
attribute :>> functionCategory = "alarm";
|
|
85
83
|
attribute :>> trigger = "alarm raised, escalated, or cleared";
|
|
86
84
|
attribute :>> outputSummary = "Priority-coded audible tone and visual message";
|
|
@@ -88,8 +86,8 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
88
86
|
attribute :>> criticality = CriticalityKind::high;
|
|
89
87
|
}
|
|
90
88
|
action fnManageInfusion : SystemFunction {
|
|
91
|
-
@MemoIdentity { :>> providedId = "FUNC-005"; }
|
|
92
|
-
|
|
89
|
+
@MemoIdentity { :>> providedId = "FUNC-005"; :>> label = "ManageInfusion"; }
|
|
90
|
+
out flowCommandOut : InterfaceItem;
|
|
93
91
|
attribute :>> functionCategory = "infusion";
|
|
94
92
|
attribute :>> trigger = "mode transitions and each execution step while therapy active";
|
|
95
93
|
attribute :>> outputSummary = "Commanded flow and mode transitions";
|
|
@@ -97,8 +95,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
97
95
|
attribute :>> criticality = CriticalityKind::catastrophic;
|
|
98
96
|
}
|
|
99
97
|
action fnEnforceLimits : SystemFunction {
|
|
100
|
-
@MemoIdentity { :>> providedId = "FUNC-006"; }
|
|
101
|
-
attribute :>> name = "EnforceDoseLimits";
|
|
98
|
+
@MemoIdentity { :>> providedId = "FUNC-006"; :>> label = "EnforceDoseLimits"; }
|
|
102
99
|
attribute :>> functionCategory = "infusion";
|
|
103
100
|
attribute :>> trigger = "patient bolus request or clinician square bolus command";
|
|
104
101
|
attribute :>> outputSummary = "Bolus authorized or rejected against lockout interval and hourly maximum";
|
|
@@ -106,8 +103,8 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
106
103
|
attribute :>> criticality = CriticalityKind::catastrophic;
|
|
107
104
|
}
|
|
108
105
|
action fnCommandPump : SystemFunction {
|
|
109
|
-
@MemoIdentity { :>> providedId = "FUNC-007"; }
|
|
110
|
-
|
|
106
|
+
@MemoIdentity { :>> providedId = "FUNC-007"; :>> label = "CommandPumpMotor"; }
|
|
107
|
+
in flowCommandIn : InterfaceItem;
|
|
111
108
|
attribute :>> functionCategory = "actuation";
|
|
112
109
|
attribute :>> trigger = "flow command update";
|
|
113
110
|
attribute :>> outputSummary = "Motor step rate with enable interlock; FlowRate_Mode_macro per mode, KVO floor in PAUSED (REQ 43), zero flow in OFF/IDLE (REQ 6/14)";
|
|
@@ -115,8 +112,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
115
112
|
attribute :>> criticality = CriticalityKind::catastrophic;
|
|
116
113
|
}
|
|
117
114
|
action fnLogEvents : SystemFunction {
|
|
118
|
-
@MemoIdentity { :>> providedId = "FUNC-008"; }
|
|
119
|
-
attribute :>> name = "LogTherapyEvents";
|
|
115
|
+
@MemoIdentity { :>> providedId = "FUNC-008"; :>> label = "LogTherapyEvents"; }
|
|
120
116
|
attribute :>> functionCategory = "logging";
|
|
121
117
|
attribute :>> trigger = "dose delivered, mode change, alarm, or configuration change";
|
|
122
118
|
attribute :>> outputSummary = "Timestamped append-only event records";
|
|
@@ -124,8 +120,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
124
120
|
attribute :>> criticality = CriticalityKind::medium;
|
|
125
121
|
}
|
|
126
122
|
action fnManagePower : SystemFunction {
|
|
127
|
-
@MemoIdentity { :>> providedId = "FUNC-009"; }
|
|
128
|
-
attribute :>> name = "ManagePower";
|
|
123
|
+
@MemoIdentity { :>> providedId = "FUNC-009"; :>> label = "ManagePower"; }
|
|
129
124
|
attribute :>> functionCategory = "platform";
|
|
130
125
|
attribute :>> trigger = "mains-loss signal or battery level change";
|
|
131
126
|
attribute :>> outputSummary = "Power source selection, low/depleted battery conditions";
|
|
@@ -133,8 +128,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
133
128
|
attribute :>> criticality = CriticalityKind::high;
|
|
134
129
|
}
|
|
135
130
|
action fnPresentStatus : SystemFunction {
|
|
136
|
-
@MemoIdentity { :>> providedId = "FUNC-010"; }
|
|
137
|
-
attribute :>> name = "PresentStatus";
|
|
131
|
+
@MemoIdentity { :>> providedId = "FUNC-010"; :>> label = "PresentStatus"; }
|
|
138
132
|
attribute :>> functionCategory = "user-interface";
|
|
139
133
|
attribute :>> trigger = "state or prescription change";
|
|
140
134
|
attribute :>> outputSummary = "Mode, prescription, delivered dose, and alarm text on display";
|
|
@@ -142,8 +136,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
142
136
|
attribute :>> criticality = CriticalityKind::high;
|
|
143
137
|
}
|
|
144
138
|
action fnSelfTest : SystemFunction {
|
|
145
|
-
@MemoIdentity { :>> providedId = "FUNC-011"; }
|
|
146
|
-
attribute :>> name = "ExecuteSelfTest";
|
|
139
|
+
@MemoIdentity { :>> providedId = "FUNC-011"; :>> label = "ExecuteSelfTest"; }
|
|
147
140
|
attribute :>> functionCategory = "platform";
|
|
148
141
|
attribute :>> trigger = "power-on and periodic in-service checks";
|
|
149
142
|
attribute :>> outputSummary = "POST pass/fail; CPU, RAM, ROM, and sensor plausibility results";
|
|
@@ -152,51 +145,48 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
152
145
|
}
|
|
153
146
|
|
|
154
147
|
// ── Logical flows ───────────────────────────────────────────
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
148
|
+
// Each exchange is the flow itself, from one function's `out` parameter
|
|
149
|
+
// to another's `in`. LF-004 starts outside the system: the prescription is
|
|
150
|
+
// what the clinician's ProgramPrescription activity (OA-003) produces, and
|
|
151
|
+
// CE-004 carries it from the operator keypad.
|
|
152
|
+
flow lfSensorAcquisition : FunctionalExchange
|
|
153
|
+
from fnAcquireSensors.sensorVectorOut to fnMonitorAlarm.sensorVectorIn {
|
|
154
|
+
@MemoIdentity { :>> providedId = "LF-001"; :>> label = "SensorAcquisitionFlow"; }
|
|
158
155
|
attribute :>> flowKind = FlowKind::measurement;
|
|
159
156
|
attribute :>> latencyBudgetMs = 20.0;
|
|
160
157
|
attribute :>> staleAfterMs = 40.0;
|
|
161
158
|
attribute :>> integrityLevel = "class C data path";
|
|
162
|
-
ref :>> sourceFunction = fnAcquireSensors;
|
|
163
|
-
ref :>> targetFunction = fnMonitorAlarm;
|
|
164
159
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
160
|
+
flow lfFlowCommand : FunctionalExchange
|
|
161
|
+
from fnManageInfusion.flowCommandOut to fnCommandPump.flowCommandIn {
|
|
162
|
+
@MemoIdentity { :>> providedId = "LF-002"; :>> label = "FlowCommandFlow"; }
|
|
168
163
|
attribute :>> flowKind = FlowKind::command;
|
|
169
164
|
attribute :>> latencyBudgetMs = 20.0;
|
|
170
165
|
attribute :>> staleAfterMs = 20.0;
|
|
171
166
|
attribute :>> integrityLevel = "class C command path";
|
|
172
|
-
ref :>> sourceFunction = fnManageInfusion;
|
|
173
|
-
ref :>> targetFunction = fnCommandPump;
|
|
174
167
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
168
|
+
flow lfAlarmSignal : FunctionalExchange
|
|
169
|
+
from fnMonitorAlarm.alarmSignalOut to fnAnnunciate.alarmSignalIn {
|
|
170
|
+
@MemoIdentity { :>> providedId = "LF-003"; :>> label = "AlarmSignalFlow"; }
|
|
178
171
|
attribute :>> flowKind = FlowKind::alarm;
|
|
179
172
|
attribute :>> latencyBudgetMs = 20.0;
|
|
180
173
|
attribute :>> staleAfterMs = 20.0;
|
|
181
174
|
attribute :>> integrityLevel = "class C alarm path; same-step delivery to infusion manager";
|
|
182
|
-
ref :>> sourceFunction = fnMonitorAlarm;
|
|
183
|
-
ref :>> targetFunction = fnAnnunciate;
|
|
184
175
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
176
|
+
flow lfPrescriptionEntry : FunctionalExchange
|
|
177
|
+
from memo_examples_gpca_pump_gpca_operational::oaProgram.prescriptionOut
|
|
178
|
+
to fnValidatePrescription.prescriptionIn {
|
|
179
|
+
@MemoIdentity { :>> providedId = "LF-004"; :>> label = "PrescriptionEntryFlow"; }
|
|
188
180
|
attribute :>> flowKind = FlowKind::configuration;
|
|
189
181
|
attribute :>> latencyBudgetMs = 500.0;
|
|
190
182
|
attribute :>> staleAfterMs = 0.0;
|
|
191
183
|
attribute :>> integrityLevel = "confirmed double-entry path";
|
|
192
|
-
ref :>> targetFunction = fnValidatePrescription;
|
|
193
184
|
}
|
|
194
185
|
|
|
195
186
|
// ── Exchange item definitions ───────────────────────────────
|
|
196
187
|
item ddPrescription : InterfaceItem {
|
|
197
188
|
attribute :>> itemKind = InterfaceItemKind::data;
|
|
198
|
-
@MemoIdentity { :>> providedId = "DD-001"; }
|
|
199
|
-
attribute :>> name = "PrescriptionRecord";
|
|
189
|
+
@MemoIdentity { :>> providedId = "DD-001"; :>> label = "PrescriptionRecord"; }
|
|
200
190
|
attribute :>> semantics = "patient id, drug name, concentration, VTBI total, duration total, basal flow rate, square bolus rate/duration/interval, patient bolus rate/duration/lockout period, max boluses per hour (DD-005..DD-017)";
|
|
201
191
|
attribute :>> unit = "ml/hr, ml, minutes, mg/ml, per hour";
|
|
202
192
|
attribute :>> minValue = "pharmacy-database safe-value lower bounds (lo_hd)";
|
|
@@ -210,8 +200,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
210
200
|
}
|
|
211
201
|
item ddBolusRequest : InterfaceItem {
|
|
212
202
|
attribute :>> itemKind = InterfaceItemKind::data;
|
|
213
|
-
@MemoIdentity { :>> providedId = "DD-002"; }
|
|
214
|
-
attribute :>> name = "BolusRequestSignal";
|
|
203
|
+
@MemoIdentity { :>> providedId = "DD-002"; :>> label = "BolusRequestSignal"; }
|
|
215
204
|
attribute :>> semantics = "debounced patient pendant press event";
|
|
216
205
|
attribute :>> encoding = "edge event with 50 ms debounce";
|
|
217
206
|
attribute :>> timestampRequired = true;
|
|
@@ -221,8 +210,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
221
210
|
}
|
|
222
211
|
item ddSensorVector : InterfaceItem {
|
|
223
212
|
attribute :>> itemKind = InterfaceItemKind::data;
|
|
224
|
-
@MemoIdentity { :>> providedId = "DD-003"; }
|
|
225
|
-
attribute :>> name = "SensorStatusVector";
|
|
213
|
+
@MemoIdentity { :>> providedId = "DD-003"; :>> label = "SensorStatusVector"; }
|
|
226
214
|
attribute :>> semantics = "air-in-line, occlusion pressure, reservoir volume, door state, flow measurement, battery level, CPU/memory status";
|
|
227
215
|
attribute :>> encoding = "fixed-layout status word per 20 ms step";
|
|
228
216
|
attribute :>> timestampRequired = true;
|
|
@@ -232,8 +220,7 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
232
220
|
}
|
|
233
221
|
item ddEventRecord : InterfaceItem {
|
|
234
222
|
attribute :>> itemKind = InterfaceItemKind::data;
|
|
235
|
-
@MemoIdentity { :>> providedId = "DD-004"; }
|
|
236
|
-
attribute :>> name = "TherapyEventRecord";
|
|
223
|
+
@MemoIdentity { :>> providedId = "DD-004"; :>> label = "TherapyEventRecord"; }
|
|
237
224
|
attribute :>> semantics = "timestamped dose, alarm, mode, and configuration events";
|
|
238
225
|
attribute :>> encoding = "append-only sequenced records";
|
|
239
226
|
attribute :>> timestampRequired = true;
|
|
@@ -243,16 +230,14 @@ package memo_examples_gpca_pump_gpca_behavior_subsystems {
|
|
|
243
230
|
}
|
|
244
231
|
item cdFlowCommand : InterfaceItem {
|
|
245
232
|
attribute :>> itemKind = InterfaceItemKind::command;
|
|
246
|
-
@MemoIdentity { :>> providedId = "CD-001"; }
|
|
247
|
-
attribute :>> name = "FlowCommand";
|
|
233
|
+
@MemoIdentity { :>> providedId = "CD-001"; :>> label = "FlowCommand"; }
|
|
248
234
|
attribute :>> controlType = "commanded flow rate with enable interlock";
|
|
249
235
|
attribute :>> timeoutMs = 40.0;
|
|
250
236
|
attribute :>> retryPolicy = "no retry; missing command forces zero flow";
|
|
251
237
|
}
|
|
252
238
|
item cdAlarmSignal : InterfaceItem {
|
|
253
239
|
attribute :>> itemKind = InterfaceItemKind::command;
|
|
254
|
-
@MemoIdentity { :>> providedId = "CD-002"; }
|
|
255
|
-
attribute :>> name = "AlarmSignal";
|
|
240
|
+
@MemoIdentity { :>> providedId = "CD-002"; :>> label = "AlarmSignal"; }
|
|
256
241
|
attribute :>> controlType = "priority-coded alarm assertion (level 1 stops infusion, level 2 warns)";
|
|
257
242
|
attribute :>> timeoutMs = 20.0;
|
|
258
243
|
attribute :>> retryPolicy = "latched until acknowledged and condition cleared";
|
|
@@ -13,11 +13,10 @@ package memo_examples_gpca_pump_gpca_context {
|
|
|
13
13
|
private import memo_core_common::*;
|
|
14
14
|
private import memo_core_common::MemoIdentity;
|
|
15
15
|
// ── Intended use (ISO 14971 §5.2, IEC 62366-1) ──────────────
|
|
16
|
-
|
|
16
|
+
requirement gpcaIntendedUse : IntendedUse {
|
|
17
17
|
@MemoIdentity { :>> providedId = "IU-001"; }
|
|
18
|
-
attribute :>> name = "GPCA_IntendedUse";
|
|
19
18
|
@MemoIdentity { :>> shortDescription = "Patient-controlled analgesia infusion of prescribed opioid analgesics."; }
|
|
20
|
-
|
|
19
|
+
doc /* The GPCA pump delivers a prescribed analgesic drug intravenously at a programmed basal rate, supplemented by square boluses delivered automatically at programmed intervals and by patient-requested bolus doses, subject to lockout intervals and maximum-dose limits. */
|
|
21
20
|
attribute :>> indication = "Management of acute post-operative or chronic pain requiring titrated intravenous opioid analgesia.";
|
|
22
21
|
attribute :>> contraindication = "Patients unable to comprehend or operate the bolus request mechanism; drugs without safe-value records in the hospital pharmacy database.";
|
|
23
22
|
attribute :>> patientPopulation = "Adult in-patients under clinical supervision.";
|
|
@@ -29,10 +28,9 @@ package memo_examples_gpca_pump_gpca_context {
|
|
|
29
28
|
@MemoIdentity { :>> sourceReference = "CITE-001: CriSys GPCA System Requirements (2013), §2.1-2.3 (GPCA overview, system functions, user characteristics)"; }
|
|
30
29
|
}
|
|
31
30
|
part bolusByProxyMisuse : ReasonablyForeseeableMisuse {
|
|
32
|
-
@MemoIdentity { :>> providedId = "RFM-001"; }
|
|
33
|
-
attribute :>> name = "BolusRequestBySomeoneOtherThanPatient";
|
|
31
|
+
@MemoIdentity { :>> providedId = "RFM-001"; :>> label = "BolusRequestBySomeoneOtherThanPatient"; }
|
|
34
32
|
@MemoIdentity { :>> shortDescription = "A caregiver or visitor presses the patient bolus control."; }
|
|
35
|
-
|
|
33
|
+
doc /* A person other than the patient activates the bolus request control, bypassing the intended patient self-limiting behavior. */
|
|
36
34
|
attribute :>> misuseContext = "Patient-controlled analgesia in a supervised hospital setting.";
|
|
37
35
|
attribute :>> foreseeableBasis = "Known PCA use pattern represented in the GPCA hazard analysis.";
|
|
38
36
|
attribute :>> affectedUseContext = "UC-001";
|
|
@@ -41,8 +39,7 @@ package memo_examples_gpca_pump_gpca_context {
|
|
|
41
39
|
|
|
42
40
|
// ── Use contexts ────────────────────────────────────────────
|
|
43
41
|
part hospitalWardContext : UseContext {
|
|
44
|
-
@MemoIdentity { :>> providedId = "UC-001"; }
|
|
45
|
-
attribute :>> name = "HospitalWardUseContext";
|
|
42
|
+
@MemoIdentity { :>> providedId = "UC-001"; :>> label = "HospitalWardUseContext"; }
|
|
46
43
|
attribute :>> careSetting = "acute-care hospital ward and post-anesthesia care unit";
|
|
47
44
|
attribute :>> environment = "indoor clinical environment, mains power with battery backup, pole or bed-rail mounted";
|
|
48
45
|
attribute :>> jurisdiction = "generic (FDA/EU reference model)";
|
|
@@ -54,18 +51,16 @@ package memo_examples_gpca_pump_gpca_context {
|
|
|
54
51
|
// ── Actors ──────────────────────────────────────────────────
|
|
55
52
|
part actorPatient : User {
|
|
56
53
|
attribute :>> actorKind = ActorKind::patient;
|
|
57
|
-
@MemoIdentity { :>> providedId = "ACT-001"; }
|
|
58
|
-
attribute :>> name = "Patient";
|
|
54
|
+
@MemoIdentity { :>> providedId = "ACT-001"; :>> label = "Patient"; }
|
|
59
55
|
attribute :>> trainingLevel = "instructed by clinician on bolus request button only";
|
|
60
|
-
|
|
56
|
+
doc /* Receives the infusion and requests bolus doses via the patient pendant. */
|
|
61
57
|
perform oaRequestBolus;
|
|
62
58
|
}
|
|
63
59
|
part actorNurse : User {
|
|
64
60
|
attribute :>> actorKind = ActorKind::clinician;
|
|
65
|
-
@MemoIdentity { :>> providedId = "ACT-002"; }
|
|
66
|
-
attribute :>> name = "ClinicianNurse";
|
|
61
|
+
@MemoIdentity { :>> providedId = "ACT-002"; :>> label = "ClinicianNurse"; }
|
|
67
62
|
attribute :>> trainingLevel = "trained clinical user; programs prescriptions and responds to alarms";
|
|
68
|
-
|
|
63
|
+
doc /* Loads the drug reservoir, programs and confirms the prescription, starts/stops therapy, and responds to alarms. */
|
|
69
64
|
perform oaProgram;
|
|
70
65
|
perform oaStartTherapy;
|
|
71
66
|
perform oaRespondAlarm;
|
|
@@ -73,64 +68,57 @@ package memo_examples_gpca_pump_gpca_context {
|
|
|
73
68
|
}
|
|
74
69
|
part actorPrescriber : User {
|
|
75
70
|
attribute :>> actorKind = ActorKind::clinician;
|
|
76
|
-
@MemoIdentity { :>> providedId = "ACT-003"; }
|
|
77
|
-
attribute :>> name = "PrescribingPhysician";
|
|
71
|
+
@MemoIdentity { :>> providedId = "ACT-003"; :>> label = "PrescribingPhysician"; }
|
|
78
72
|
attribute :>> trainingLevel = "licensed prescriber";
|
|
79
|
-
|
|
73
|
+
doc /* Prescribes drug, concentration, basal rate, bolus volume, lockout interval, and maximum dose limits. */
|
|
80
74
|
perform oaPrescribe;
|
|
81
75
|
}
|
|
82
76
|
part actorPharmacist : User {
|
|
83
77
|
attribute :>> actorKind = ActorKind::clinician;
|
|
84
|
-
@MemoIdentity { :>> providedId = "ACT-004"; }
|
|
85
|
-
attribute :>> name = "Pharmacist";
|
|
78
|
+
@MemoIdentity { :>> providedId = "ACT-004"; :>> label = "Pharmacist"; }
|
|
86
79
|
attribute :>> trainingLevel = "licensed pharmacist";
|
|
87
|
-
|
|
80
|
+
doc /* Prepares the drug reservoir and verifies drug and concentration against the prescription. */
|
|
88
81
|
perform oaLoadReservoir;
|
|
89
82
|
}
|
|
90
83
|
part actorTechnician : User {
|
|
91
84
|
attribute :>> actorKind = ActorKind::technician;
|
|
92
|
-
@MemoIdentity { :>> providedId = "ACT-005"; }
|
|
93
|
-
attribute :>> name = "BiomedicalTechnician";
|
|
85
|
+
@MemoIdentity { :>> providedId = "ACT-005"; :>> label = "BiomedicalTechnician"; }
|
|
94
86
|
attribute :>> trainingLevel = "service-trained; authenticated service access";
|
|
95
|
-
|
|
87
|
+
doc /* Performs maintenance, battery replacement, and calibration through the service interface. */
|
|
96
88
|
perform oaMaintain;
|
|
97
89
|
}
|
|
98
90
|
|
|
99
91
|
// ── Foreseeable use errors (IEC 62366-1, AAMI TIR PCA) ──────
|
|
100
92
|
part ueMisprogrammedRate : UseError {
|
|
101
|
-
@MemoIdentity { :>> providedId = "UE-001"; }
|
|
102
|
-
attribute :>> name = "MisprogrammedInfusionParameters";
|
|
93
|
+
@MemoIdentity { :>> providedId = "UE-001"; :>> label = "MisprogrammedInfusionParameters"; }
|
|
103
94
|
attribute :>> errorCategory = UseErrorCategoryKind::actionCategory;
|
|
104
95
|
attribute :>> severity = SeverityKind::catastrophic;
|
|
105
96
|
attribute :>> rootCauseType = "decimal-point / unit entry slip during prescription programming";
|
|
106
|
-
|
|
97
|
+
doc /* Clinician enters a basal rate or bolus volume an order of magnitude off (e.g. mg vs mL, misplaced decimal). */
|
|
107
98
|
@MemoIdentity { :>> sourceReference = "CITE-004: GIP Hazard Analysis v1.0 (2009), §2.4.8 Use Hazards (incorrect dose settings)"; }
|
|
108
99
|
}
|
|
109
100
|
part ueBolusByProxy : UseError {
|
|
110
|
-
@MemoIdentity { :>> providedId = "UE-002"; }
|
|
111
|
-
attribute :>> name = "PCAByProxy";
|
|
101
|
+
@MemoIdentity { :>> providedId = "UE-002"; :>> label = "PCAByProxy"; }
|
|
112
102
|
attribute :>> errorCategory = UseErrorCategoryKind::cognition;
|
|
113
103
|
attribute :>> severity = SeverityKind::catastrophic;
|
|
114
104
|
attribute :>> rootCauseType = "family member or caregiver presses bolus button on behalf of a sedated patient";
|
|
115
|
-
|
|
105
|
+
doc /* Bolus doses requested by someone other than the patient defeat the inherent safety of patient-limited dosing. */
|
|
116
106
|
@MemoIdentity { :>> sourceReference = "illustrative — no source"; }
|
|
117
107
|
}
|
|
118
108
|
part ueWrongDrugLoaded : UseError {
|
|
119
|
-
@MemoIdentity { :>> providedId = "UE-003"; }
|
|
120
|
-
attribute :>> name = "WrongDrugOrConcentrationLoaded";
|
|
109
|
+
@MemoIdentity { :>> providedId = "UE-003"; :>> label = "WrongDrugOrConcentrationLoaded"; }
|
|
121
110
|
attribute :>> errorCategory = UseErrorCategoryKind::cognition;
|
|
122
111
|
attribute :>> severity = SeverityKind::catastrophic;
|
|
123
112
|
attribute :>> rootCauseType = "reservoir containing wrong drug or concentration mounted without verification";
|
|
124
|
-
|
|
113
|
+
doc /* Loaded drug or concentration differs from the programmed prescription, so delivered dose differs from intended dose. */
|
|
125
114
|
@MemoIdentity { :>> sourceReference = "illustrative — no source"; }
|
|
126
115
|
}
|
|
127
116
|
part ueAlarmDisregard : UseError {
|
|
128
|
-
@MemoIdentity { :>> providedId = "UE-004"; }
|
|
129
|
-
attribute :>> name = "AlarmSilencedAndForgotten";
|
|
117
|
+
@MemoIdentity { :>> providedId = "UE-004"; :>> label = "AlarmSilencedAndForgotten"; }
|
|
130
118
|
attribute :>> errorCategory = UseErrorCategoryKind::memoryRecall;
|
|
131
119
|
attribute :>> severity = SeverityKind::serious;
|
|
132
120
|
attribute :>> rootCauseType = "alarm silenced during high workload and the underlying condition never resolved";
|
|
133
|
-
|
|
121
|
+
doc /* Clinician silences an alarm and does not return to resolve the underlying condition (e.g. occlusion), interrupting therapy. */
|
|
134
122
|
@MemoIdentity { :>> sourceReference = "CITE-004: GIP Hazard Analysis v1.0 (2009), §2.4.8 Use Hazards (attentional/memory failure)"; }
|
|
135
123
|
}
|
|
136
124
|
// Which task each use error is committed during (IEC 62366-1). This was
|
|
@@ -18,81 +18,75 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
|
|
|
18
18
|
private import memo_core_common::MemoIdentity;
|
|
19
19
|
part therapyConfigurationAsset : CybersecurityAsset {
|
|
20
20
|
@MemoIdentity { :>> providedId = "AST-CYB-001"; }
|
|
21
|
-
attribute :>> name = "TherapyConfigurationAsset";
|
|
22
21
|
attribute :>> assetKind = AssetKind::configuration;
|
|
23
|
-
attribute :>> confidentialityNeed =
|
|
24
|
-
attribute :>> integrityNeed =
|
|
25
|
-
attribute :>> availabilityNeed =
|
|
22
|
+
attribute :>> confidentialityNeed = SecurityNeedKind::medium;
|
|
23
|
+
attribute :>> integrityNeed = SecurityNeedKind::veryHigh;
|
|
24
|
+
attribute :>> availabilityNeed = SecurityNeedKind::high;
|
|
26
25
|
attribute :>> privacyRelevant = false;
|
|
27
26
|
attribute :>> safetyRelevant = true;
|
|
28
|
-
|
|
27
|
+
ref :>> holder = gpcaSoftware.config;
|
|
29
28
|
}
|
|
30
29
|
|
|
31
30
|
part patientEventLogAsset : CybersecurityAsset {
|
|
32
31
|
@MemoIdentity { :>> providedId = "AST-CYB-002"; }
|
|
33
|
-
attribute :>> name = "PatientEventLogAsset";
|
|
34
32
|
attribute :>> assetKind = AssetKind::auditRecord;
|
|
35
|
-
attribute :>> confidentialityNeed =
|
|
36
|
-
attribute :>> integrityNeed =
|
|
37
|
-
attribute :>> availabilityNeed =
|
|
33
|
+
attribute :>> confidentialityNeed = SecurityNeedKind::high;
|
|
34
|
+
attribute :>> integrityNeed = SecurityNeedKind::high;
|
|
35
|
+
attribute :>> availabilityNeed = SecurityNeedKind::medium;
|
|
38
36
|
attribute :>> privacyRelevant = true;
|
|
39
37
|
attribute :>> safetyRelevant = false;
|
|
40
|
-
|
|
38
|
+
ref :>> holder = gpcaSoftware.logging;
|
|
41
39
|
}
|
|
42
40
|
|
|
43
41
|
part maintenancePortBoundary : TrustBoundary {
|
|
44
42
|
@MemoIdentity { :>> providedId = "TB-001"; }
|
|
45
|
-
attribute :>> name = "MaintenancePortBoundary";
|
|
46
43
|
attribute :>> boundaryType = "service-access";
|
|
47
44
|
attribute :>> crossingConstraint = "Boundary between service tooling and therapy controller runtime.";
|
|
48
45
|
attribute :>> trustAssumption = "Service tooling on the untrusted side requires authentication before any crossing is permitted.";
|
|
49
46
|
}
|
|
50
47
|
|
|
48
|
+
// --8<-- [start:threat]
|
|
51
49
|
part unauthorizedConfigChangeThreat : Threat {
|
|
52
|
-
@MemoIdentity { :>> providedId = "TH-001"; }
|
|
53
|
-
attribute :>> name = "UnauthorizedTherapyConfigurationChange";
|
|
50
|
+
@MemoIdentity { :>> providedId = "TH-001"; :>> label = "UnauthorizedTherapyConfigurationChange"; }
|
|
54
51
|
attribute :>> driverKind = "cybersecurity";
|
|
55
52
|
attribute :>> threatCategory = ThreatCategoryKind::tampering;
|
|
56
53
|
attribute :>> attackVector = "maintenance port";
|
|
57
54
|
attribute :>> threatSource = "unauthorized actor with local access";
|
|
58
55
|
attribute :>> precondition = "maintenance interface exposed without strong authentication";
|
|
59
56
|
attribute :>> affectedConcern = ConcernKind::cybersecurity;
|
|
60
|
-
|
|
57
|
+
// --8<-- [end:threat]
|
|
61
58
|
}
|
|
62
59
|
|
|
63
60
|
part eventLogTamperingThreat : Threat {
|
|
64
|
-
@MemoIdentity { :>> providedId = "TH-002"; }
|
|
65
|
-
attribute :>> name = "PatientEventLogTampering";
|
|
61
|
+
@MemoIdentity { :>> providedId = "TH-002"; :>> label = "PatientEventLogTampering"; }
|
|
66
62
|
attribute :>> driverKind = "cybersecurity";
|
|
67
63
|
attribute :>> threatCategory = ThreatCategoryKind::repudiation;
|
|
68
64
|
attribute :>> attackVector = "maintenance port";
|
|
69
65
|
attribute :>> threatSource = "unauthorized actor with local access";
|
|
70
66
|
attribute :>> precondition = "audit log writable without integrity protection";
|
|
71
67
|
attribute :>> affectedConcern = ConcernKind::cybersecurity;
|
|
72
|
-
attribute :>> defaultTechnique = "STRIDE repudiation";
|
|
73
68
|
}
|
|
74
69
|
|
|
75
|
-
|
|
70
|
+
// --8<-- [start:vulnerability]
|
|
71
|
+
item weakServiceAuthentication : Vulnerability {
|
|
76
72
|
@MemoIdentity { :>> providedId = "VULN-001"; }
|
|
77
|
-
attribute :>> name = "WeakServiceAuthentication";
|
|
78
73
|
attribute :>> weakness = "service mode relies on shared default credential";
|
|
79
74
|
attribute :>> exploitability = "moderate";
|
|
80
75
|
attribute :>> discoveryMethod = "architecture review";
|
|
81
|
-
|
|
76
|
+
ref :>> affectedElement = gpcaSoftware.config;
|
|
82
77
|
attribute :>> cweReference = "CWE-798";
|
|
78
|
+
// --8<-- [end:vulnerability]
|
|
83
79
|
}
|
|
84
80
|
|
|
85
81
|
action tamperedConfigurationScenario : OperativeScenario {
|
|
86
|
-
@MemoIdentity { :>> providedId = "SCN-001"; }
|
|
87
|
-
|
|
88
|
-
attribute :>> description = "An attacker with local access to the maintenance port alters lockout or dose parameters, aiming to bypass safety limits; may enable unsafe therapy delivery or bypass safeguards.";
|
|
82
|
+
@MemoIdentity { :>> providedId = "SCN-001"; :>> label = "TamperedTherapyConfigurationScenario"; }
|
|
83
|
+
doc /* An attacker with local access to the maintenance port alters lockout or dose parameters, aiming to bypass safety limits; may enable unsafe therapy delivery or bypass safeguards. */
|
|
89
84
|
attribute :>> actorDescription = "unauthorized actor with local access to the maintenance port";
|
|
90
85
|
attribute :>> defaultCategory = ThreatCategoryKind::tampering;
|
|
91
86
|
}
|
|
92
87
|
|
|
93
|
-
|
|
94
|
-
@MemoIdentity { :>> providedId = "CHZ-001"; }
|
|
95
|
-
attribute :>> name = "UnsafeTherapyConfigurationHazard";
|
|
88
|
+
item unsafeDoseCyberHazard : CyberHazard {
|
|
89
|
+
@MemoIdentity { :>> providedId = "CHZ-001"; :>> label = "UnsafeTherapyConfigurationHazard"; }
|
|
96
90
|
attribute :>> hazardType = HazardTypeKind::drugDeliveryError;
|
|
97
91
|
attribute :>> foreseeable = true;
|
|
98
92
|
attribute :>> securityImpact = "loss of configuration integrity";
|
|
@@ -103,7 +97,6 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
|
|
|
103
97
|
|
|
104
98
|
part configurationTamperingRisk : CyberRisk {
|
|
105
99
|
@MemoIdentity { :>> providedId = "CRISK-001"; }
|
|
106
|
-
attribute :>> name = "ConfigurationTamperingRisk";
|
|
107
100
|
attribute :>> driverKind = "cyber risk";
|
|
108
101
|
attribute :>> probabilityEstimate = ProbabilityKind::occasional;
|
|
109
102
|
attribute :>> severityEstimate = SeverityKind::catastrophic;
|
|
@@ -116,8 +109,7 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
|
|
|
116
109
|
}
|
|
117
110
|
|
|
118
111
|
part strongServiceAuthentication : CyberMitigation {
|
|
119
|
-
@MemoIdentity { :>> providedId = "CMIT-001"; }
|
|
120
|
-
attribute :>> name = "StrongServiceAuthenticationAndAudit";
|
|
112
|
+
@MemoIdentity { :>> providedId = "CMIT-001"; :>> label = "StrongServiceAuthenticationAndAudit"; }
|
|
121
113
|
attribute :>> controlKind = RiskControlKind::protectiveMeasure;
|
|
122
114
|
attribute :>> implementationKind = RiskControlImplementationKind::softwareDesign;
|
|
123
115
|
attribute :>> verificationStatus = "planned";
|
|
@@ -127,8 +119,7 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
|
|
|
127
119
|
}
|
|
128
120
|
|
|
129
121
|
requirement reqAuthenticatedServiceAccess : SecurityRequirement {
|
|
130
|
-
@MemoIdentity { :>> providedId = "SREQ-001"; }
|
|
131
|
-
attribute :>> name = "AuthenticatedServiceAccess";
|
|
122
|
+
@MemoIdentity { :>> providedId = "SREQ-001"; :>> label = "AuthenticatedServiceAccess"; }
|
|
132
123
|
attribute :>> statement = "The system shall require authenticated and authorized service access before any therapy configuration parameter can be modified.";
|
|
133
124
|
attribute :>> sourceKind = RequirementSourceKind::risk;
|
|
134
125
|
attribute :>> concernKind = ConcernKind::cybersecurity;
|
|
@@ -139,14 +130,11 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
|
|
|
139
130
|
attribute :>> assumptionSummary = "cryptographic identity available";
|
|
140
131
|
attribute :>> guaranteeSummary = "only authorized service access can change therapy configuration";
|
|
141
132
|
attribute :>> securityObjective = "integrity";
|
|
142
|
-
attribute :>> derivedFromThreat = "TH-001";
|
|
143
|
-
attribute :>> defaultConcern = ConcernKind::cybersecurity;
|
|
144
133
|
attribute :>> safetyClass = SafetyClassKind::C;
|
|
145
134
|
}
|
|
146
135
|
|
|
147
136
|
verification vcAuthenticatedServiceAccess : VerificationCase {
|
|
148
|
-
@MemoIdentity { :>> providedId = "CVER-001"; }
|
|
149
|
-
attribute :>> name = "VerifyAuthenticatedServiceAccess";
|
|
137
|
+
@MemoIdentity { :>> providedId = "CVER-001"; :>> label = "VerifyAuthenticatedServiceAccess"; }
|
|
150
138
|
attribute :>> methodKind = MemoVerificationMethodKind::test;
|
|
151
139
|
attribute :>> acceptanceCriteria = "Only authenticated and authorized service sessions may modify therapy configuration; all attempts are logged.";
|
|
152
140
|
attribute :>> status = ElementStatusKind::approved;
|
|
@@ -154,21 +142,26 @@ package memo_examples_gpca_pump_gpca_cybersecurity {
|
|
|
154
142
|
objective { verify reqAuthenticatedServiceAccess; }
|
|
155
143
|
}
|
|
156
144
|
|
|
157
|
-
|
|
145
|
+
// --8<-- [start:chain]
|
|
146
|
+
connection : ThreatenedBy connect protectedAsset ::> therapyConfigurationAsset to threat ::> unauthorizedConfigChangeThreat;
|
|
158
147
|
|
|
159
|
-
connection : ThreatenedBy connect protectedAsset ::> patientEventLogAsset to
|
|
148
|
+
connection : ThreatenedBy connect protectedAsset ::> patientEventLogAsset to threat ::> eventLogTamperingThreat;
|
|
160
149
|
|
|
161
|
-
connection : Exploits connect
|
|
150
|
+
connection : Exploits connect threat ::> unauthorizedConfigChangeThreat to enablingVulnerability ::> weakServiceAuthentication;
|
|
162
151
|
|
|
163
152
|
connection : RealizedByScenario connect realizedThreat ::> unauthorizedConfigChangeThreat to scenario ::> tamperedConfigurationScenario;
|
|
153
|
+
// --8<-- [end:chain]
|
|
164
154
|
|
|
165
|
-
connection : Mitigates
|
|
155
|
+
connection : Mitigates connect control ::> strongServiceAuthentication to mitigatedElement ::> weakServiceAuthentication { attribute :>> mitigationKind = MitigationKind::vulnerability; }
|
|
166
156
|
|
|
167
157
|
connection : DerivesCyberRequirement connect sourceThreatOrRisk ::> unauthorizedConfigChangeThreat to targetRequirement ::> reqAuthenticatedServiceAccess;
|
|
168
158
|
|
|
169
159
|
connection : DerivesCyberRequirement connect sourceThreatOrRisk ::> eventLogTamperingThreat to targetRequirement ::> reqAuthenticatedServiceAccess;
|
|
170
160
|
|
|
171
|
-
|
|
161
|
+
// A security risk feeds safety risk management at the hazard it can
|
|
162
|
+
// cause (AAMI TIR57), not at another risk's estimate: tampered therapy
|
|
163
|
+
// configuration is a route to over-infusion.
|
|
164
|
+
connection : ImpactsSafety connect cyberElement ::> configurationTamperingRisk to safetyElement ::> overdoseHazard;
|
|
172
165
|
|
|
173
166
|
connection : CrossesTrustBoundary connect boundary ::> maintenancePortBoundary to crossingItem ::> therapyConfigurationAsset;
|
|
174
167
|
|