FHIR © HL7.org  |  FHIRsmith 4.0.1  |  Server Home  |  XIG Home  |  XIG Stats  | 

FHIR IG analytics

Packagehl7.fhir.uv.sdc.r4b
Resource TypeLibrary
IdLibrary-sdc-CHF.json
FHIR VersionR4B

Resources that use this resource

No resources found


Resources that this resource uses

No resources found


Narrative

Note: links and images are rebased to the (stated) source

Title: Congestive Heart Failure Logic
Id: sdc-CHF
Version: 4.0.0-ballot
Url: Congestive Heart Failure Logic

urn:oid:2.16.840.1.113883.4.642.40.17.28.1

Experimental: true
Type:

system: http://terminology.hl7.org/CodeSystem/library-type

code: logic-library

display: Logic Library

Date: 2020-11-29 15:54:22-0700
Publisher: HL7 International / FHIR Infrastructure
Description:

Logic for an example congestive heart failure pathway

Jurisdiction: 001
Related Artifacts:

Dependencies

Parameters:
NameTypeMinMaxIn/Out
EncounterEncounter01In
PatientPatient01Out
Body WeightObservation0*Out
Body Weight Change AssertionObservation0*Out
Daily Body WeightResource0*Out
Daily Body Weight ChangeResource0*Out
Body Weight ChangeObservation0*Out
Current Body WeightObservation01Out
Previous Body WeightObservation01Out
Current Body Weight Changeinteger01Out
Urine OutputObservation0*Out
Current Urine OutputObservation01Out
Net Intake/OutputObservation0*Out
Current Net Intake/OutputObservation01Out
Jugular Venous PressureObservation0*Out
Oxygen SaturationObservation0*Out
PotassiumObservation0*Out
CreatinineObservation0*Out
eGFRObservation0*Out
Eligibility CriteriaCondition0*Out
Data Requirements:
TypeProfileMSCode Filter
Observation http://hl7.org/fhir/StructureDefinition/Observation code filter:
path: code

system: http://loinc.org

code: 29463-7

Observation http://hl7.org/fhir/StructureDefinition/Observation code filter:
path: code

system: http://example.org/CodeSystem/chf-codes

code: body-weight-change

Observation http://hl7.org/fhir/StructureDefinition/Observation code filter:
path: code

system: http://loinc.org

code: 9192-6

Observation http://hl7.org/fhir/StructureDefinition/Observation code filter:
path: code

system: http://example.org/CodeSystem/chf-codes

code: net-intake-output

Observation http://hl7.org/fhir/StructureDefinition/Observation code filter:
path: code

system: http://example.org/CodeSystem/chf-codes

code: jvp

Observation http://hl7.org/fhir/StructureDefinition/Observation code filter:
path: code

system: http://loinc.org

code: 2708-6

Observation http://hl7.org/fhir/StructureDefinition/Observation code filter:
path: code

system: http://loinc.org

code: 86919-8

display: Potassium goal [Moles/volume] Serum or Plasma

Observation http://hl7.org/fhir/StructureDefinition/Observation code filter:
path: code

system: http://loinc.org

code: 39802-4

display: Creatinine in dialysis fluid/Creatinine in serum or plasma

Observation http://hl7.org/fhir/StructureDefinition/Observation code filter:
path: code

system: http://example.org/CodeSystem/chf-codes

code: egfr

Condition http://hl7.org/fhir/StructureDefinition/Condition
Content: text/cql
library CHF version '1.0.0'

using FHIR version '4.0.1'

include FHIRHelpers version '4.0.1'

codesystem "SNOMED-CT": 'http://snomed.info/sct'
codesystem "LOINC": 'http://loinc.org'
codesystem "CHFCodes": 'http://hl7.org/fhir/uv/cpg/CodeSystem/chf-codes'
codesystem "Condition Clinical Status Code": 'http://terminology.hl7.org/CodeSystem/condition-clinical'
codesystem "Condition Verification Status Code": 'http://terminology.hl7.org/CodeSystem/condition-ver-status'

code "Congestive heart failure": '42343007' from "SNOMED-CT"

code "Body weight": '29463-7' from "LOINC"
code "Body weight change": 'body-weight-change' from "CHFCodes"
code "Urine output": '9192-6' from "LOINC"
code "Net intake/output": 'net-intake-output' from "CHFCodes"
code "Jugular venous pressure": 'jvp' from "CHFCodes"
code "Oxygen saturation": '2708-6' from "LOINC"
code "Potassium goal": '86919-8' from "LOINC" display 'Potassium goal [Moles/volume] Serum or Plasma' // meq/L
code "Creatinine in serum": '39802-4' from "LOINC" display 'Creatinine in serum or plasma' // NOTE: example shows mg/dL, but no LOINC code has those units?
code "eGFR result": 'egfr' from "CHFCodes" // NOTE: Too many to pick from, needs clinical/terminological SME input, in mol/mm/m2

code "Active condition": 'active' from "Condition Clinical Status Code"
code "Provisional condition": 'provisional' from "Condition Verification Status Code"
code "Confirmed condition": 'confirmed' from "Condition Verification Status Code"

parameter Encounter Encounter

context Patient

// Case Features
define "Body Weight":
  [Observation: "Body weight"] O
    where O.status = 'final'
      and references(O.encounter, Encounter)

define "Body Weight Change Assertion":
  [Observation: "Body weight change"] O
    where O.status = 'final'
      and references(O.encounter, Encounter)

define "Body Weight Change":
  "Daily Body Weight Change" WC
    return Observation {
      id: id { value: Encounter.id + '-bodyweight-change' + ToString(WC.date) },
      extension: {
        Extension {
          url: url { value: 'http://hl7.org/fhir/uv/cpg/StructureDefinition/cpg-instantiatesCaseFeature' },
          value: canonical { value: 'http://hl7.org/fhir/uv/cpg/StructureDefinition/chf-bodyweight-change' }
        },
        Extension {
          url: url { value: 'http://hl7.org/fhir/uv/cpg/StructureDefinition/cpg-caseFeatureType' },
          value: code { value: 'asserted' }
        }
      },
      status: ObservationStatus { value: 'final' },
      code: CodeableConcept {
        coding: {
          Coding {
            system: uri { value: 'http://hl7.org/fhir/uv/cpg/CodeSystem/chf-codes' },
            code: code { value: 'body-weight-change' }
          }
        }
      },
      effective: dateTime { value: WC.date },
      issued: instant { value: Now() },
      subject: referenceTo(Patient),
      encounter: referenceTo(Encounter),
      value: Quantity {
        value: decimal { value: WC.change.value },
        unit: string { value: WC.change.unit },
        system: uri { value: 'http://unitsofmeasure.org' },
        code: code { value: WC.change.unit }
      }
    }

define "Daily Body Weight":
  (expand Encounter.period per day) Date
    let maxWeight: Max("Body Weight" WT where WT.issued same day as Date return WT.value as FHIR.Quantity)
    return { date: Date, weight: maxWeight }

define "Daily Body Weight Change":
  "Daily Body Weight" WT
    let priorWeight: First("Daily Body Weight" PWT where PWT.date < WT.date sort by date descending).weight
    return { date: WT.date, weight: WT.weight, priorWeight: priorWeight, change: WT.weight - priorWeight}

define "Current Body Weight":
  First("Body Weight" WT where WT.issued same day as Today() sort by issued descending)

define "Previous Body Weight":
  First("Body Weight" WT where WT.issued 1 day before day of Today() sort by issued descending)

define "Current Body Weight Change":
  "Current Body Weight".value - "Previous Body Weight".value

define "Urine Output":
  [Observation: "Urine output"] O
    where O.status = 'final'
    and references(O.encounter, Encounter)

define "Current Urine Output":
  First("Urine Output" UO where UO.issued same day as Today() sort by issued descending)

define "Net Intake/Output":
  [Observation: "Net intake/output"] O
    where O.status = 'final'
      and references(O.encounter, Encounter)

define "Current Net Intake/Output":
  First("Net Intake/Output" IO where IO.issued same day as Today() sort by issued descending)

define "Jugular Venous Pressure":
  [Observation: "Jugular venous pressure"] O
    where O.status = 'final'
      and references(O.encounter, Encounter)

define "Oxygen Saturation":
  [Observation: "Oxygen saturation"] O
    where O.status = 'final'
      and references(O.encounter, Encounter)

define "Potassium":
  [Observation: "Potassium goal"] O
    where O.status = 'final'
      and references(O.encounter, Encounter)

define "Creatinine":
  [Observation: "Creatinine in serum"] O
    where O.status = 'final'
      and references(O.encounter, Encounter)

define "eGFR":
  [Observation: "eGFR result"] O
    where O.status = 'final'
      and references(O.encounter, Encounter)


// Eligibility Criteria
define "Eligibility Criteria":
  [Condition] C
    where C.code ~ "Congestive heart failure"
      and C.clinicalStatus ~ "Active condition"
      and C.verificationStatus ~ "Confirmed condition"

// TODO: Handle contained references
// TODO: Handle bundle references
// TODO: Handle remote references
define function references(reference Reference, encounter Encounter):
  EndsWith(reference.reference, '/' + encounter.id)

define function referenceTo(encounter Encounter):
  Reference { reference: string { value: 'Encounter/' + encounter.id } }

define function referenceTo(patient Patient):
  Reference { reference: string { value: 'Patient/' + patient.id } }

Source1

{
  "resourceType": "Library",
  "id": "sdc-CHF",
  "meta": {
    "profile": [
      "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-library"
    ]
  },
  "text": {
    "status": "extensions",
    "div": "<!-- snip (see above) -->"
  },
  "url": "http://hl7.org/fhir/uv/sdc/Library/sdc-CHF",
  "identifier": [
    {
      "system": "urn:ietf:rfc:3986",
      "value": "urn:oid:2.16.840.1.113883.4.642.40.17.28.1"
    }
  ],
  "version": "4.0.0-ballot",
  "name": "CHF",
  "title": "Congestive Heart Failure Logic",
  "status": "active",
  "experimental": true,
  "type": {
    "coding": [
      {
        "system": "http://terminology.hl7.org/CodeSystem/library-type",
        "code": "logic-library",
        "display": "Logic Library"
      }
    ]
  },
  "date": "2020-11-29T15:54:22-07:00",
  "publisher": "HL7 International / FHIR Infrastructure",
  "contact": [
    {
      "name": "HL7 International / FHIR Infrastructure",
      "telecom": [
        {
          "system": "url",
          "value": "http://www.hl7.org/Special/committees/fiwg"
        }
      ]
    },
    {
      "telecom": [
        {
          "system": "url",
          "value": "http://www.hl7.org/Special/committees/fiwg"
        }
      ]
    }
  ],
  "description": "Logic for an example congestive heart failure pathway",
  "jurisdiction": [
    {
      "coding": [
        {
          "system": "http://unstats.un.org/unsd/methods/m49/m49.htm",
          "code": "001",
          "display": "World"
        }
      ]
    }
  ],
  "relatedArtifact": [
    {
      "type": "depends-on",
      "display": "SNOMED CT",
      "url": "http://snomed.info/sct",
      "document": {
        "url": "http://snomed.info/sct"
      },
      "resource": "http://snomed.info/sct"
    },
    {
      "type": "depends-on",
      "display": "LOINC",
      "url": "http://loinc.org",
      "document": {
        "url": "http://loinc.org"
      },
      "resource": "http://loinc.org"
    },
    {
      "type": "depends-on",
      "display": "Congestive heart failure codes",
      "url": "http://hl7.org/fhir/uv/sdc/CodeSystem/chf-codes",
      "document": {
        "url": "http://hl7.org/fhir/uv/sdc/CodeSystem/chf-codes"
      },
      "resource": "http://hl7.org/fhir/uv/sdc/CodeSystem/chf-codes"
    },
    {
      "type": "depends-on",
      "display": "Clinical condition codes",
      "url": "http://terminology.hl7.org/CodeSystem/condition-clinical",
      "document": {
        "url": "http://terminology.hl7.org/CodeSystem/condition-clinical"
      },
      "resource": "http://terminology.hl7.org/CodeSystem/condition-clinical"
    },
    {
      "type": "depends-on",
      "display": "Condition verification status",
      "url": "http://terminology.hl7.org/CodeSystem/condition-ver-status",
      "document": {
        "url": "http://terminology.hl7.org/CodeSystem/condition-ver-status"
      },
      "resource": "http://terminology.hl7.org/CodeSystem/condition-ver-status"
    }
  ],
  "parameter": [
    {
      "name": "Encounter",
      "use": "in",
      "min": 0,
      "max": "1",
      "type": "Encounter"
    },
    {
      "name": "Patient",
      "use": "out",
      "min": 0,
      "max": "1",
      "type": "Patient"
    },
    {
      "name": "Body Weight",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Observation"
    },
    {
      "name": "Body Weight Change Assertion",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Observation"
    },
    {
      "name": "Daily Body Weight",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Resource"
    },
    {
      "name": "Daily Body Weight Change",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Resource"
    },
    {
      "name": "Body Weight Change",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Observation"
    },
    {
      "name": "Current Body Weight",
      "use": "out",
      "min": 0,
      "max": "1",
      "type": "Observation"
    },
    {
      "name": "Previous Body Weight",
      "use": "out",
      "min": 0,
      "max": "1",
      "type": "Observation"
    },
    {
      "name": "Current Body Weight Change",
      "use": "out",
      "min": 0,
      "max": "1",
      "type": "integer"
    },
    {
      "name": "Urine Output",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Observation"
    },
    {
      "name": "Current Urine Output",
      "use": "out",
      "min": 0,
      "max": "1",
      "type": "Observation"
    },
    {
      "name": "Net Intake/Output",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Observation"
    },
    {
      "name": "Current Net Intake/Output",
      "use": "out",
      "min": 0,
      "max": "1",
      "type": "Observation"
    },
    {
      "name": "Jugular Venous Pressure",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Observation"
    },
    {
      "name": "Oxygen Saturation",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Observation"
    },
    {
      "name": "Potassium",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Observation"
    },
    {
      "name": "Creatinine",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Observation"
    },
    {
      "name": "eGFR",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Observation"
    },
    {
      "name": "Eligibility Criteria",
      "use": "out",
      "min": 0,
      "max": "*",
      "type": "Condition"
    }
  ],
  "dataRequirement": [
    {
      "type": "Observation",
      "profile": [
        "http://hl7.org/fhir/StructureDefinition/Observation"
      ],
      "codeFilter": [
        {
          "path": "code",
          "code": [
            {
              "system": "http://loinc.org",
              "code": "29463-7"
            }
          ]
        }
      ]
    },
    {
      "type": "Observation",
      "profile": [
        "http://hl7.org/fhir/StructureDefinition/Observation"
      ],
      "codeFilter": [
        {
          "path": "code",
          "code": [
            {
              "system": "http://example.org/CodeSystem/chf-codes",
              "code": "body-weight-change"
            }
          ]
        }
      ]
    },
    {
      "type": "Observation",
      "profile": [
        "http://hl7.org/fhir/StructureDefinition/Observation"
      ],
      "codeFilter": [
        {
          "path": "code",
          "code": [
            {
              "system": "http://loinc.org",
              "code": "9192-6"
            }
          ]
        }
      ]
    },
    {
      "type": "Observation",
      "profile": [
        "http://hl7.org/fhir/StructureDefinition/Observation"
      ],
      "codeFilter": [
        {
          "path": "code",
          "code": [
            {
              "system": "http://example.org/CodeSystem/chf-codes",
              "code": "net-intake-output"
            }
          ]
        }
      ]
    },
    {
      "type": "Observation",
      "profile": [
        "http://hl7.org/fhir/StructureDefinition/Observation"
      ],
      "codeFilter": [
        {
          "path": "code",
          "code": [
            {
              "system": "http://example.org/CodeSystem/chf-codes",
              "code": "jvp"
            }
          ]
        }
      ]
    },
    {
      "type": "Observation",
      "profile": [
        "http://hl7.org/fhir/StructureDefinition/Observation"
      ],
      "codeFilter": [
        {
          "path": "code",
          "code": [
            {
              "system": "http://loinc.org",
              "code": "2708-6"
            }
          ]
        }
      ]
    },
    {
      "type": "Observation",
      "profile": [
        "http://hl7.org/fhir/StructureDefinition/Observation"
      ],
      "codeFilter": [
        {
          "path": "code",
          "code": [
            {
              "system": "http://loinc.org",
              "code": "86919-8",
              "display": "Potassium goal [Moles/volume] Serum or Plasma"
            }
          ]
        }
      ]
    },
    {
      "type": "Observation",
      "profile": [
        "http://hl7.org/fhir/StructureDefinition/Observation"
      ],
      "codeFilter": [
        {
          "path": "code",
          "code": [
            {
              "system": "http://loinc.org",
              "code": "39802-4",
              "display": "Creatinine in dialysis fluid/Creatinine in serum or plasma"
            }
          ]
        }
      ]
    },
    {
      "type": "Observation",
      "profile": [
        "http://hl7.org/fhir/StructureDefinition/Observation"
      ],
      "codeFilter": [
        {
          "path": "code",
          "code": [
            {
              "system": "http://example.org/CodeSystem/chf-codes",
              "code": "egfr"
            }
          ]
        }
      ]
    },
    {
      "type": "Condition",
      "profile": [
        "http://hl7.org/fhir/StructureDefinition/Condition"
      ]
    }
  ],
  "content": [
    {
      "contentType": "text/cql",
      "data": "bGlicmFyeSBDSEYgdmVyc2lvbiAnMS4wLjAnDQoNCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnDQoNCmluY2x1ZGUgRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjEnDQoNCmNvZGVzeXN0ZW0gIlNOT01FRC1DVCI6ICdodHRwOi8vc25vbWVkLmluZm8vc2N0Jw0KY29kZXN5c3RlbSAiTE9JTkMiOiAnaHR0cDovL2xvaW5jLm9yZycNCmNvZGVzeXN0ZW0gIkNIRkNvZGVzIjogJ2h0dHA6Ly9obDcub3JnL2ZoaXIvdXYvY3BnL0NvZGVTeXN0ZW0vY2hmLWNvZGVzJw0KY29kZXN5c3RlbSAiQ29uZGl0aW9uIENsaW5pY2FsIFN0YXR1cyBDb2RlIjogJ2h0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vY29uZGl0aW9uLWNsaW5pY2FsJw0KY29kZXN5c3RlbSAiQ29uZGl0aW9uIFZlcmlmaWNhdGlvbiBTdGF0dXMgQ29kZSI6ICdodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL2NvbmRpdGlvbi12ZXItc3RhdHVzJw0KDQpjb2RlICJDb25nZXN0aXZlIGhlYXJ0IGZhaWx1cmUiOiAnNDIzNDMwMDcnIGZyb20gIlNOT01FRC1DVCINCg0KY29kZSAiQm9keSB3ZWlnaHQiOiAnMjk0NjMtNycgZnJvbSAiTE9JTkMiDQpjb2RlICJCb2R5IHdlaWdodCBjaGFuZ2UiOiAnYm9keS13ZWlnaHQtY2hhbmdlJyBmcm9tICJDSEZDb2RlcyINCmNvZGUgIlVyaW5lIG91dHB1dCI6ICc5MTkyLTYnIGZyb20gIkxPSU5DIg0KY29kZSAiTmV0IGludGFrZS9vdXRwdXQiOiAnbmV0LWludGFrZS1vdXRwdXQnIGZyb20gIkNIRkNvZGVzIg0KY29kZSAiSnVndWxhciB2ZW5vdXMgcHJlc3N1cmUiOiAnanZwJyBmcm9tICJDSEZDb2RlcyINCmNvZGUgIk94eWdlbiBzYXR1cmF0aW9uIjogJzI3MDgtNicgZnJvbSAiTE9JTkMiDQpjb2RlICJQb3Rhc3NpdW0gZ29hbCI6ICc4NjkxOS04JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnUG90YXNzaXVtIGdvYWwgW01vbGVzL3ZvbHVtZV0gU2VydW0gb3IgUGxhc21hJyAvLyBtZXEvTA0KY29kZSAiQ3JlYXRpbmluZSBpbiBzZXJ1bSI6ICczOTgwMi00JyBmcm9tICJMT0lOQyIgZGlzcGxheSAnQ3JlYXRpbmluZSBpbiBzZXJ1bSBvciBwbGFzbWEnIC8vIE5PVEU6IGV4YW1wbGUgc2hvd3MgbWcvZEwsIGJ1dCBubyBMT0lOQyBjb2RlIGhhcyB0aG9zZSB1bml0cz8NCmNvZGUgImVHRlIgcmVzdWx0IjogJ2VnZnInIGZyb20gIkNIRkNvZGVzIiAvLyBOT1RFOiBUb28gbWFueSB0byBwaWNrIGZyb20sIG5lZWRzIGNsaW5pY2FsL3Rlcm1pbm9sb2dpY2FsIFNNRSBpbnB1dCwgaW4gbW9sL21tL20yDQoNCmNvZGUgIkFjdGl2ZSBjb25kaXRpb24iOiAnYWN0aXZlJyBmcm9tICJDb25kaXRpb24gQ2xpbmljYWwgU3RhdHVzIENvZGUiDQpjb2RlICJQcm92aXNpb25hbCBjb25kaXRpb24iOiAncHJvdmlzaW9uYWwnIGZyb20gIkNvbmRpdGlvbiBWZXJpZmljYXRpb24gU3RhdHVzIENvZGUiDQpjb2RlICJDb25maXJtZWQgY29uZGl0aW9uIjogJ2NvbmZpcm1lZCcgZnJvbSAiQ29uZGl0aW9uIFZlcmlmaWNhdGlvbiBTdGF0dXMgQ29kZSINCg0KcGFyYW1ldGVyIEVuY291bnRlciBFbmNvdW50ZXINCg0KY29udGV4dCBQYXRpZW50DQoNCi8vIENhc2UgRmVhdHVyZXMNCmRlZmluZSAiQm9keSBXZWlnaHQiOg0KICBbT2JzZXJ2YXRpb246ICJCb2R5IHdlaWdodCJdIE8NCiAgICB3aGVyZSBPLnN0YXR1cyA9ICdmaW5hbCcNCiAgICAgIGFuZCByZWZlcmVuY2VzKE8uZW5jb3VudGVyLCBFbmNvdW50ZXIpDQoNCmRlZmluZSAiQm9keSBXZWlnaHQgQ2hhbmdlIEFzc2VydGlvbiI6DQogIFtPYnNlcnZhdGlvbjogIkJvZHkgd2VpZ2h0IGNoYW5nZSJdIE8NCiAgICB3aGVyZSBPLnN0YXR1cyA9ICdmaW5hbCcNCiAgICAgIGFuZCByZWZlcmVuY2VzKE8uZW5jb3VudGVyLCBFbmNvdW50ZXIpDQoNCmRlZmluZSAiQm9keSBXZWlnaHQgQ2hhbmdlIjoNCiAgIkRhaWx5IEJvZHkgV2VpZ2h0IENoYW5nZSIgV0MNCiAgICByZXR1cm4gT2JzZXJ2YXRpb24gew0KICAgICAgaWQ6IGlkIHsgdmFsdWU6IEVuY291bnRlci5pZCArICctYm9keXdlaWdodC1jaGFuZ2UnICsgVG9TdHJpbmcoV0MuZGF0ZSkgfSwNCiAgICAgIGV4dGVuc2lvbjogew0KICAgICAgICBFeHRlbnNpb24gew0KICAgICAgICAgIHVybDogdXJsIHsgdmFsdWU6ICdodHRwOi8vaGw3Lm9yZy9maGlyL3V2L2NwZy9TdHJ1Y3R1cmVEZWZpbml0aW9uL2NwZy1pbnN0YW50aWF0ZXNDYXNlRmVhdHVyZScgfSwNCiAgICAgICAgICB2YWx1ZTogY2Fub25pY2FsIHsgdmFsdWU6ICdodHRwOi8vaGw3Lm9yZy9maGlyL3V2L2NwZy9TdHJ1Y3R1cmVEZWZpbml0aW9uL2NoZi1ib2R5d2VpZ2h0LWNoYW5nZScgfQ0KICAgICAgICB9LA0KICAgICAgICBFeHRlbnNpb24gew0KICAgICAgICAgIHVybDogdXJsIHsgdmFsdWU6ICdodHRwOi8vaGw3Lm9yZy9maGlyL3V2L2NwZy9TdHJ1Y3R1cmVEZWZpbml0aW9uL2NwZy1jYXNlRmVhdHVyZVR5cGUnIH0sDQogICAgICAgICAgdmFsdWU6IGNvZGUgeyB2YWx1ZTogJ2Fzc2VydGVkJyB9DQogICAgICAgIH0NCiAgICAgIH0sDQogICAgICBzdGF0dXM6IE9ic2VydmF0aW9uU3RhdHVzIHsgdmFsdWU6ICdmaW5hbCcgfSwNCiAgICAgIGNvZGU6IENvZGVhYmxlQ29uY2VwdCB7DQogICAgICAgIGNvZGluZzogew0KICAgICAgICAgIENvZGluZyB7DQogICAgICAgICAgICBzeXN0ZW06IHVyaSB7IHZhbHVlOiAnaHR0cDovL2hsNy5vcmcvZmhpci91di9jcGcvQ29kZVN5c3RlbS9jaGYtY29kZXMnIH0sDQogICAgICAgICAgICBjb2RlOiBjb2RlIHsgdmFsdWU6ICdib2R5LXdlaWdodC1jaGFuZ2UnIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0sDQogICAgICBlZmZlY3RpdmU6IGRhdGVUaW1lIHsgdmFsdWU6IFdDLmRhdGUgfSwNCiAgICAgIGlzc3VlZDogaW5zdGFudCB7IHZhbHVlOiBOb3coKSB9LA0KICAgICAgc3ViamVjdDogcmVmZXJlbmNlVG8oUGF0aWVudCksDQogICAgICBlbmNvdW50ZXI6IHJlZmVyZW5jZVRvKEVuY291bnRlciksDQogICAgICB2YWx1ZTogUXVhbnRpdHkgew0KICAgICAgICB2YWx1ZTogZGVjaW1hbCB7IHZhbHVlOiBXQy5jaGFuZ2UudmFsdWUgfSwNCiAgICAgICAgdW5pdDogc3RyaW5nIHsgdmFsdWU6IFdDLmNoYW5nZS51bml0IH0sDQogICAgICAgIHN5c3RlbTogdXJpIHsgdmFsdWU6ICdodHRwOi8vdW5pdHNvZm1lYXN1cmUub3JnJyB9LA0KICAgICAgICBjb2RlOiBjb2RlIHsgdmFsdWU6IFdDLmNoYW5nZS51bml0IH0NCiAgICAgIH0NCiAgICB9DQoNCmRlZmluZSAiRGFpbHkgQm9keSBXZWlnaHQiOg0KICAoZXhwYW5kIEVuY291bnRlci5wZXJpb2QgcGVyIGRheSkgRGF0ZQ0KICAgIGxldCBtYXhXZWlnaHQ6IE1heCgiQm9keSBXZWlnaHQiIFdUIHdoZXJlIFdULmlzc3VlZCBzYW1lIGRheSBhcyBEYXRlIHJldHVybiBXVC52YWx1ZSBhcyBGSElSLlF1YW50aXR5KQ0KICAgIHJldHVybiB7IGRhdGU6IERhdGUsIHdlaWdodDogbWF4V2VpZ2h0IH0NCg0KZGVmaW5lICJEYWlseSBCb2R5IFdlaWdodCBDaGFuZ2UiOg0KICAiRGFpbHkgQm9keSBXZWlnaHQiIFdUDQogICAgbGV0IHByaW9yV2VpZ2h0OiBGaXJzdCgiRGFpbHkgQm9keSBXZWlnaHQiIFBXVCB3aGVyZSBQV1QuZGF0ZSA8IFdULmRhdGUgc29ydCBieSBkYXRlIGRlc2NlbmRpbmcpLndlaWdodA0KICAgIHJldHVybiB7IGRhdGU6IFdULmRhdGUsIHdlaWdodDogV1Qud2VpZ2h0LCBwcmlvcldlaWdodDogcHJpb3JXZWlnaHQsIGNoYW5nZTogV1Qud2VpZ2h0IC0gcHJpb3JXZWlnaHR9DQoNCmRlZmluZSAiQ3VycmVudCBCb2R5IFdlaWdodCI6DQogIEZpcnN0KCJCb2R5IFdlaWdodCIgV1Qgd2hlcmUgV1QuaXNzdWVkIHNhbWUgZGF5IGFzIFRvZGF5KCkgc29ydCBieSBpc3N1ZWQgZGVzY2VuZGluZykNCg0KZGVmaW5lICJQcmV2aW91cyBCb2R5IFdlaWdodCI6DQogIEZpcnN0KCJCb2R5IFdlaWdodCIgV1Qgd2hlcmUgV1QuaXNzdWVkIDEgZGF5IGJlZm9yZSBkYXkgb2YgVG9kYXkoKSBzb3J0IGJ5IGlzc3VlZCBkZXNjZW5kaW5nKQ0KDQpkZWZpbmUgIkN1cnJlbnQgQm9keSBXZWlnaHQgQ2hhbmdlIjoNCiAgIkN1cnJlbnQgQm9keSBXZWlnaHQiLnZhbHVlIC0gIlByZXZpb3VzIEJvZHkgV2VpZ2h0Ii52YWx1ZQ0KDQpkZWZpbmUgIlVyaW5lIE91dHB1dCI6DQogIFtPYnNlcnZhdGlvbjogIlVyaW5lIG91dHB1dCJdIE8NCiAgICB3aGVyZSBPLnN0YXR1cyA9ICdmaW5hbCcNCiAgICBhbmQgcmVmZXJlbmNlcyhPLmVuY291bnRlciwgRW5jb3VudGVyKQ0KDQpkZWZpbmUgIkN1cnJlbnQgVXJpbmUgT3V0cHV0IjoNCiAgRmlyc3QoIlVyaW5lIE91dHB1dCIgVU8gd2hlcmUgVU8uaXNzdWVkIHNhbWUgZGF5IGFzIFRvZGF5KCkgc29ydCBieSBpc3N1ZWQgZGVzY2VuZGluZykNCg0KZGVmaW5lICJOZXQgSW50YWtlL091dHB1dCI6DQogIFtPYnNlcnZhdGlvbjogIk5ldCBpbnRha2Uvb3V0cHV0Il0gTw0KICAgIHdoZXJlIE8uc3RhdHVzID0gJ2ZpbmFsJw0KICAgICAgYW5kIHJlZmVyZW5jZXMoTy5lbmNvdW50ZXIsIEVuY291bnRlcikNCg0KZGVmaW5lICJDdXJyZW50IE5ldCBJbnRha2UvT3V0cHV0IjoNCiAgRmlyc3QoIk5ldCBJbnRha2UvT3V0cHV0IiBJTyB3aGVyZSBJTy5pc3N1ZWQgc2FtZSBkYXkgYXMgVG9kYXkoKSBzb3J0IGJ5IGlzc3VlZCBkZXNjZW5kaW5nKQ0KDQpkZWZpbmUgIkp1Z3VsYXIgVmVub3VzIFByZXNzdXJlIjoNCiAgW09ic2VydmF0aW9uOiAiSnVndWxhciB2ZW5vdXMgcHJlc3N1cmUiXSBPDQogICAgd2hlcmUgTy5zdGF0dXMgPSAnZmluYWwnDQogICAgICBhbmQgcmVmZXJlbmNlcyhPLmVuY291bnRlciwgRW5jb3VudGVyKQ0KDQpkZWZpbmUgIk94eWdlbiBTYXR1cmF0aW9uIjoNCiAgW09ic2VydmF0aW9uOiAiT3h5Z2VuIHNhdHVyYXRpb24iXSBPDQogICAgd2hlcmUgTy5zdGF0dXMgPSAnZmluYWwnDQogICAgICBhbmQgcmVmZXJlbmNlcyhPLmVuY291bnRlciwgRW5jb3VudGVyKQ0KDQpkZWZpbmUgIlBvdGFzc2l1bSI6DQogIFtPYnNlcnZhdGlvbjogIlBvdGFzc2l1bSBnb2FsIl0gTw0KICAgIHdoZXJlIE8uc3RhdHVzID0gJ2ZpbmFsJw0KICAgICAgYW5kIHJlZmVyZW5jZXMoTy5lbmNvdW50ZXIsIEVuY291bnRlcikNCg0KZGVmaW5lICJDcmVhdGluaW5lIjoNCiAgW09ic2VydmF0aW9uOiAiQ3JlYXRpbmluZSBpbiBzZXJ1bSJdIE8NCiAgICB3aGVyZSBPLnN0YXR1cyA9ICdmaW5hbCcNCiAgICAgIGFuZCByZWZlcmVuY2VzKE8uZW5jb3VudGVyLCBFbmNvdW50ZXIpDQoNCmRlZmluZSAiZUdGUiI6DQogIFtPYnNlcnZhdGlvbjogImVHRlIgcmVzdWx0Il0gTw0KICAgIHdoZXJlIE8uc3RhdHVzID0gJ2ZpbmFsJw0KICAgICAgYW5kIHJlZmVyZW5jZXMoTy5lbmNvdW50ZXIsIEVuY291bnRlcikNCg0KDQovLyBFbGlnaWJpbGl0eSBDcml0ZXJpYQ0KZGVmaW5lICJFbGlnaWJpbGl0eSBDcml0ZXJpYSI6DQogIFtDb25kaXRpb25dIEMNCiAgICB3aGVyZSBDLmNvZGUgfiAiQ29uZ2VzdGl2ZSBoZWFydCBmYWlsdXJlIg0KICAgICAgYW5kIEMuY2xpbmljYWxTdGF0dXMgfiAiQWN0aXZlIGNvbmRpdGlvbiINCiAgICAgIGFuZCBDLnZlcmlmaWNhdGlvblN0YXR1cyB+ICJDb25maXJtZWQgY29uZGl0aW9uIg0KDQovLyBUT0RPOiBIYW5kbGUgY29udGFpbmVkIHJlZmVyZW5jZXMNCi8vIFRPRE86IEhhbmRsZSBidW5kbGUgcmVmZXJlbmNlcw0KLy8gVE9ETzogSGFuZGxlIHJlbW90ZSByZWZlcmVuY2VzDQpkZWZpbmUgZnVuY3Rpb24gcmVmZXJlbmNlcyhyZWZlcmVuY2UgUmVmZXJlbmNlLCBlbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgRW5kc1dpdGgocmVmZXJlbmNlLnJlZmVyZW5jZSwgJy8nICsgZW5jb3VudGVyLmlkKQ0KDQpkZWZpbmUgZnVuY3Rpb24gcmVmZXJlbmNlVG8oZW5jb3VudGVyIEVuY291bnRlcik6DQogIFJlZmVyZW5jZSB7IHJlZmVyZW5jZTogc3RyaW5nIHsgdmFsdWU6ICdFbmNvdW50ZXIvJyArIGVuY291bnRlci5pZCB9IH0NCg0KZGVmaW5lIGZ1bmN0aW9uIHJlZmVyZW5jZVRvKHBhdGllbnQgUGF0aWVudCk6DQogIFJlZmVyZW5jZSB7IHJlZmVyZW5jZTogc3RyaW5nIHsgdmFsdWU6ICdQYXRpZW50LycgKyBwYXRpZW50LmlkIH0gfQ0K"
    }
  ]
}