WHO Clinical Care in Crisis Implementation Guide for Children
0.1.0 - ci-build

WHO Clinical Care in Crisis Implementation Guide for Children - Local Development build (v0.1.0). See the Directory of published versions

: CHE.Z.Score - TTL Representation

Active as of 2023-10-04

Raw ttl | Download

@prefix fhir: <http://hl7.org/fhir/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

# - resource -------------------------------------------------------------------

 a fhir:Library ;
  fhir:nodeRole fhir:treeRoot ;
  fhir:id [ fhir:v "chezscore"] ; # 
  fhir:text [
fhir:status [ fhir:v "generated" ] ;
fhir:div "<div xmlns=\"http://www.w3.org/1999/xhtml\"><h2>Related Artifacts</h2><table class=\"grid\"><tr><td>depends-on</td><td><code>http://fhir.org/guides/who/anc-cds/Library/FHIRHelpers</code></td></tr><tr><td>depends-on</td><td><code>https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/chebase</code></td></tr><tr><td>depends-on</td><td><code>https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/weightforage</code></td></tr><tr><td>depends-on</td><td><a href=\"Library-anthrobase.html\">anthrobase</a></td></tr><tr><td>depends-on</td><td><code>https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/weightforlength</code></td></tr><tr><td>depends-on</td><td><code>https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/weightforheight</code></td></tr></table><h2>Parameters</h2><table class=\"grid\"><tr><td>encounter</td><td>in</td><td/><td/><td>Encounter</td></tr><tr><td>pastweight</td><td>out</td><td/><td/><td>decimal</td></tr><tr><td>patientsex</td><td>out</td><td/><td/><td>string</td></tr><tr><td>ageatpastweight</td><td>out</td><td/><td/><td>integer</td></tr><tr><td>pastweightzscore</td><td>out</td><td/><td/><td>decimal</td></tr><tr><td>pastweightactualised</td><td>out</td><td/><td/><td>decimal</td></tr><tr><td>WAZ</td><td>out</td><td/><td/><td>decimal</td></tr></table><h2>Data Requirements</h2><table class=\"grid\"><tr><td colspan=\"2\"><b>Type</b>: <a href=\"http://hl7.org/fhir/R4/patient.html\">Patient</a> (<a href=\"http://hl7.org/fhir/R4/patient.html\">Patient</a>)</td></tr></table><table class=\"grid\"><tr><td colspan=\"2\"><b>Type</b>: <a href=\"http://hl7.org/fhir/R4/encounter.html\">Encounter</a> (<a href=\"http://hl7.org/fhir/R4/encounter.html\">Encounter</a>)</td></tr></table><table class=\"grid\"><tr><td colspan=\"2\"><b>Type</b>: <a href=\"http://hl7.org/fhir/R4/observation.html\">Observation</a> (<a href=\"http://hl7.org/fhir/R4/observation.html\">Observation</a>)</td></tr><tr style=\"background-color: #efefef\"><td>Filter</td><td>Value</td></tr><tr><td>code</td><td>One of these codes: [not stated] CHE.B6.DE06: CHE.B6.DE06</td></tr></table><h2>Contents</h2><p><code>text/cql</code></p><pre><code class=\"language-sql\">/*\n@author: Patrick Delcroix\n@description: This library is part of the project CHE\n*/\nlibrary chezscore version '1.0.313+build.456'\nusing FHIR version '4.0.1'\ninclude FHIRHelpers version '4.0.1' called FHIRHelpers \ninclude chebase version '1.0.313+build.456' called Base\ninclude WeightForAge version '1.0.4' called wfa\ninclude WeightForLength version '1.0.4' called wfl\ninclude WeightForHeight version '1.0.4' called wfh\n\n\n\n//codesystem &quot;CHE&quot; : 'https://fhir.dk.swisstph-mis.ch/matchbox/fhir/CodeSystem/che-custom-codes'\n\n\n\n//code &quot;Weight&quot;: 'CHE.B6.DE06' from &quot;CHE&quot; display 'Weight'\n//code &quot;Estimated Weight&quot;: 'CHE.B6.DE08' from &quot;CHE&quot; display 'Estimated Weight'\n//code &quot;MUAC&quot;: 'CHE.B6.DE17' from &quot;CHE&quot; display 'MUAC'\n//code &quot;Length&quot;: 'CHE.B6.DE12' from &quot;CHE&quot; display 'Length'\n//code &quot;Height&quot;: 'CHE.B6.DE09' from &quot;CHE&quot; display 'Height'\n\nparameter &quot;encounterid&quot; String\n\ncontext Patient\n\ndefine &quot;Weight&quot;:\n  Base.coding('CHE.B6.DE06')\ndefine &quot;Estimated Weight&quot;:\n  Base.coding('CHE.B6.DE08')\ndefine &quot;MUAC&quot;:\n  Base.coding('CHE.B6.DE17')\ndefine &quot;Length&quot;:\n  Base.coding('CHE.B6.DE12')\ndefine &quot;Height&quot;:\n  Base.coding('CHE.B6.DE09')\ndefine &quot;Visually assess&quot;:\n  Base.coding('CHE.B6.DE18')\ndefine &quot;Underweight&quot;:\n  Base.coding('CHE.B6.DE20') \ndefine &quot;Severely Underweight&quot;:\n  Base.coding('CHE.B6.DE21') \n\n/* pastweight : Previous Weight*/\ndefine &quot;pastweightobs&quot;:\n    if AgeInMonths()&lt; 4  then\n      Base.GetHistoricObservation(&quot;Weight&quot;, 60)\n    else if AgeInMonths()&lt; 6  then\n      Base.GetHistoricObservation(&quot;Weight&quot;, 91)\n    else if AgeInMonths()&lt; 12  then\n      Base.GetHistoricObservation(&quot;Weight&quot;, 121)\n    else \n      Base.GetHistoricObservation(&quot;Weight&quot;, 180)\n\ndefine &quot;pastweight&quot;:\n    if &quot;pastweightobs&quot; is not null then\n      &quot;pastweightobs&quot;.value\n    else null\n\n/* patientsex : Patient sex*/\ndefine &quot;patientsex&quot;:\n    if Patient.gender = 'female' then 'female' else 'male'\n\n/* ageatpastweight : Age at Previous Weight*/\ndefine &quot;ageatpastweight&quot;:\n    if &quot;pastweight&quot; is not null  then\n        (difference in days between Patient.birthDate and ToDate(pastweightobs.issued)) * ( 1.0 as System.Decimal )\n    else\n     null\n\n/* pastweightzscore : Z-Score at Previous Weight*/\ndefine &quot;pastweightzscore&quot;:\n    if &quot;pastweight&quot; is not null  then\n      wfa.generateZScoreWeightForAge(&quot;patientsex&quot;, &quot;ageatpastweight&quot; , (&quot;pastweight&quot;.value * ( 1.0 as System.Decimal)))\n    else\n      null\n\n/* pastweightactualised : Weight from  at Previous Weight*/\ndefine &quot;pastweightactualised&quot;:\n    if &quot;pastweightzscore&quot; is not null then\n      System.Quantity { value: Round(wfa.generateWeightFromAge(&quot;patientsex&quot;,AgeInDays() * ( 1.0 as System.Decimal ),  &quot;pastweightzscore&quot; ),2), unit: 'kg'} \n    else \n       null\n\n\n\ndefine existingweight:\n  Base.GetObsValue(&quot;Weight&quot;)\n\ndefine existingestimnatedweight:\n  if existingweight is null then  \n    Base.GetObsValue(&quot;Estimated Weight&quot;)\n  else \n    null\n\ndefine existingheight:\n  Base.GetObsValue(&quot;Height&quot;)\n\ndefine existinglength:\n  Base.GetObsValue(&quot;Length&quot;)\n\ndefine existingmuac:\n  Base.GetObsValue(&quot;MUAC&quot;)\n\ndefine existingvisual:\n  Base.GetObsValue(&quot;Visually assess&quot;)\n//\ndefine zscorefrommuac:\n  if existingmuac is null then null\n  else if existingmuac &lt; 115 'mnm' then -3.0\n  else if existingmuac &lt; 125 'mnm' then -2.0\n  else 0.0\n\ndefine estimatedweight:\n  case  \n  when existingweight is not null then null\n  when existingestimnatedweight is not null then existingestimnatedweight\n  when pastweightactualised is not null then pastweightactualised\n  when AgeInMonths()&gt;24 and existingheight then weightfromheight\n  when AgeInMonths()&lt;=24 and existinglength then weightfromlength\n  else weightfromage\n  end\n\ndefine zscorefromvisual:\n    if existingvisual is not null then\n      case  \n        when existingvisual ~ &quot;Severely Underweight&quot; then -3.0\n        when existingvisual ~ &quot;Underweight&quot; then -2.0\n        else 0.0\n      end\n    else  null\n\n\ndefine weightfromlength:\n    System.Quantity { value: Round(wfl.generateWeightFromLength(&quot;patientsex&quot;,(convert existinglength to 'cm').value * ( 1.0 as System.Decimal ), zscorefrommuac),2), unit: 'kg'}\n\ndefine weightfromheight:\n    System.Quantity { value:Round(wfh.generateWeightFromHeight(&quot;patientsex&quot;,(convert existingheight to 'cm').value * ( 1.0 as System.Decimal ), zscorefrommuac),2), unit: 'kg'}\n\ndefine weightfromage:\n    System.Quantity { value:Round(wfa.generateWeightFromAge(&quot;patientsex&quot;,AgeInDays() * ( 1.0 as System.Decimal ), zscorefrommuac),2), unit: 'kg'}\n/*\n(convert Base.HasObs(&quot;Weight&quot;) to 'Kg') does not work, so let's assume the weight is in Kg\n*/\ndefine &quot;WAZ&quot;:\n    if existingweight is not null then\n         wfa.generateZScoreWeightForAge(&quot;patientsex&quot;, AgeInDays() , (existingweight.value * ( 1.0 as System.Decimal )))\n    else if existingmuac is not null then\n        zscorefrommuac\n    else if existingvisual then\n        zscorefromvisual\n    else null\n\ndefine &quot;WLZ&quot;:\n    if existingweight is not null then\n         wfl.generateZScoreWeightForLength(&quot;patientsex&quot;, (existinglength.value * ( 1.0 as System.Decimal )) ,  (existingweight.value * ( 1.0 as System.Decimal )))\n    else if existingmuac is not null then\n        zscorefrommuac\n    else if existingvisual then\n        zscorefromvisual\n    else null\n\ndefine &quot;WHZ&quot;:\n    if existingweight is not null then\n         wfh.generateZScoreWeightForHeight(&quot;patientsex&quot;, (existingheight.value * ( 1.0 as System.Decimal )) ,  (existingweight.value * ( 1.0 as System.Decimal )))\n    else if existingmuac is not null then\n        zscorefrommuac\n    else if existingvisual then\n        zscorefromvisual\n    else null\n</code></pre></div>"
  ] ; # 
  fhir:url [ fhir:v "https://fhir.dk.swisstph-mis.ch/matchbox/fhir//Library/chezscore"^^xsd:anyURI] ; # 
  fhir:identifier ( [
fhir:use [ fhir:v "official" ] ;
fhir:value [ fhir:v "CHEZScore" ]
  ] ) ; # 
  fhir:version [ fhir:v "0.1.0"] ; # 
  fhir:name [ fhir:v "chezscore"] ; # 
  fhir:title [ fhir:v "CHE.Z.Score"] ; # 
  fhir:status [ fhir:v "active"] ; # 
  fhir:type [
    ( fhir:coding [
fhir:system [ fhir:v "http://hl7.org/fhir/ValueSet/library-type"^^xsd:anyURI ] ;
fhir:code [ fhir:v "logic-library" ]     ] )
  ] ; # 
  fhir:date [ fhir:v "2023-10-04T12:32:21+00:00"^^xsd:dateTime] ; # 
  fhir:publisher [ fhir:v "WHO"] ; # 
  fhir:contact ( [
fhir:name [ fhir:v "WHO" ] ;
    ( fhir:telecom [
fhir:system [ fhir:v "url" ] ;
fhir:value [ fhir:v "http://who.int" ]     ] )
  ] ) ; # 
  fhir:relatedArtifact ( [
fhir:type [ fhir:v "depends-on" ] ;
fhir:resource [
fhir:v "http://fhir.org/guides/who/anc-cds/Library/FHIRHelpers"^^xsd:anyURI ;
fhir:link <http://fhir.org/guides/who/anc-cds/Library/FHIRHelpers>     ]
  ] [
fhir:type [ fhir:v "depends-on" ] ;
fhir:resource [
fhir:v "https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/chebase"^^xsd:anyURI ;
fhir:link <https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/chebase>     ]
  ] [
fhir:type [ fhir:v "depends-on" ] ;
fhir:resource [
fhir:v "https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/weightforage"^^xsd:anyURI ;
fhir:link <https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/weightforage>     ]
  ] [
fhir:type [ fhir:v "depends-on" ] ;
fhir:resource [
fhir:v "https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/anthrobase"^^xsd:anyURI ;
fhir:link <https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/anthrobase>     ]
  ] [
fhir:type [ fhir:v "depends-on" ] ;
fhir:resource [
fhir:v "https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/weightforlength"^^xsd:anyURI ;
fhir:link <https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/weightforlength>     ]
  ] [
fhir:type [ fhir:v "depends-on" ] ;
fhir:resource [
fhir:v "https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/weightforheight"^^xsd:anyURI ;
fhir:link <https://fhir.dk.swisstph-mis.ch/matchbox/fhir/Library/weightforheight>     ]
  ] ) ; # 
  fhir:parameter ( [
fhir:name [ fhir:v "encounter" ] ;
fhir:use [ fhir:v "in" ] ;
fhir:type [ fhir:v "Encounter" ]
  ] [
fhir:name [ fhir:v "pastweight" ] ;
fhir:use [ fhir:v "out" ] ;
fhir:type [ fhir:v "decimal" ]
  ] [
fhir:name [ fhir:v "patientsex" ] ;
fhir:use [ fhir:v "out" ] ;
fhir:type [ fhir:v "string" ]
  ] [
fhir:name [ fhir:v "ageatpastweight" ] ;
fhir:use [ fhir:v "out" ] ;
fhir:type [ fhir:v "integer" ]
  ] [
fhir:name [ fhir:v "pastweightzscore" ] ;
fhir:use [ fhir:v "out" ] ;
fhir:type [ fhir:v "decimal" ]
  ] [
fhir:name [ fhir:v "pastweightactualised" ] ;
fhir:use [ fhir:v "out" ] ;
fhir:type [ fhir:v "decimal" ]
  ] [
fhir:name [ fhir:v "WAZ" ] ;
fhir:use [ fhir:v "out" ] ;
fhir:type [ fhir:v "decimal" ]
  ] ) ; # 
  fhir:dataRequirement ( [
fhir:type [ fhir:v "Patient" ] ;
    ( fhir:profile [
fhir:v "http://hl7.org/fhir/StructureDefinition/Patient"^^xsd:anyURI ;
fhir:link <http://hl7.org/fhir/StructureDefinition/Patient>     ] )
  ] [
fhir:type [ fhir:v "Encounter" ] ;
    ( fhir:profile [
fhir:v "http://hl7.org/fhir/StructureDefinition/Encounter"^^xsd:anyURI ;
fhir:link <http://hl7.org/fhir/StructureDefinition/Encounter>     ] )
  ] [
fhir:type [ fhir:v "Observation" ] ;
    ( fhir:profile [
fhir:v "http://hl7.org/fhir/StructureDefinition/Observation"^^xsd:anyURI ;
fhir:link <http://hl7.org/fhir/StructureDefinition/Observation>     ] ) ;
    ( fhir:mustSupport [ fhir:v "code" ] [ fhir:v "encounter.reference" ] [ fhir:v "encounter" ] [ fhir:v "value" ] [ fhir:v "status" ] ) ;
    ( fhir:codeFilter [
fhir:path [ fhir:v "code" ] ;
      ( fhir:code [
fhir:code [ fhir:v "CHE.B6.DE06" ]       ] )     ] )
  ] ) ; # 
  fhir:content ( [
fhir:id [ fhir:v "ig-loader-chezscore.cql" ] ;
fhir:contentType [ fhir:v "text/cql" ] ;
fhir:data [ fhir:v "LyoKQGF1dGhvcjogUGF0cmljayBEZWxjcm9peApAZGVzY3JpcHRpb246IFRoaXMgbGlicmFyeSBpcyBwYXJ0IG9mIHRoZSBwcm9qZWN0IENIRQoqLwpsaWJyYXJ5IGNoZXpzY29yZSB2ZXJzaW9uICcxLjAuMzEzK2J1aWxkLjQ1NicKdXNpbmcgRkhJUiB2ZXJzaW9uICc0LjAuMScKaW5jbHVkZSBGSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScgY2FsbGVkIEZISVJIZWxwZXJzIAppbmNsdWRlIGNoZWJhc2UgdmVyc2lvbiAnMS4wLjMxMytidWlsZC40NTYnIGNhbGxlZCBCYXNlCmluY2x1ZGUgV2VpZ2h0Rm9yQWdlIHZlcnNpb24gJzEuMC40JyBjYWxsZWQgd2ZhCmluY2x1ZGUgV2VpZ2h0Rm9yTGVuZ3RoIHZlcnNpb24gJzEuMC40JyBjYWxsZWQgd2ZsCmluY2x1ZGUgV2VpZ2h0Rm9ySGVpZ2h0IHZlcnNpb24gJzEuMC40JyBjYWxsZWQgd2ZoCgoKCi8vY29kZXN5c3RlbSAiQ0hFIiA6ICdodHRwczovL2ZoaXIuZGsuc3dpc3N0cGgtbWlzLmNoL21hdGNoYm94L2ZoaXIvQ29kZVN5c3RlbS9jaGUtY3VzdG9tLWNvZGVzJwoKCgovL2NvZGUgIldlaWdodCI6ICdDSEUuQjYuREUwNicgZnJvbSAiQ0hFIiBkaXNwbGF5ICdXZWlnaHQnCi8vY29kZSAiRXN0aW1hdGVkIFdlaWdodCI6ICdDSEUuQjYuREUwOCcgZnJvbSAiQ0hFIiBkaXNwbGF5ICdFc3RpbWF0ZWQgV2VpZ2h0JwovL2NvZGUgIk1VQUMiOiAnQ0hFLkI2LkRFMTcnIGZyb20gIkNIRSIgZGlzcGxheSAnTVVBQycKLy9jb2RlICJMZW5ndGgiOiAnQ0hFLkI2LkRFMTInIGZyb20gIkNIRSIgZGlzcGxheSAnTGVuZ3RoJwovL2NvZGUgIkhlaWdodCI6ICdDSEUuQjYuREUwOScgZnJvbSAiQ0hFIiBkaXNwbGF5ICdIZWlnaHQnCgpwYXJhbWV0ZXIgImVuY291bnRlcmlkIiBTdHJpbmcKCmNvbnRleHQgUGF0aWVudAoKZGVmaW5lICJXZWlnaHQiOgogIEJhc2UuY29kaW5nKCdDSEUuQjYuREUwNicpCmRlZmluZSAiRXN0aW1hdGVkIFdlaWdodCI6CiAgQmFzZS5jb2RpbmcoJ0NIRS5CNi5ERTA4JykKZGVmaW5lICJNVUFDIjoKICBCYXNlLmNvZGluZygnQ0hFLkI2LkRFMTcnKQpkZWZpbmUgIkxlbmd0aCI6CiAgQmFzZS5jb2RpbmcoJ0NIRS5CNi5ERTEyJykKZGVmaW5lICJIZWlnaHQiOgogIEJhc2UuY29kaW5nKCdDSEUuQjYuREUwOScpCmRlZmluZSAiVmlzdWFsbHkgYXNzZXNzIjoKICBCYXNlLmNvZGluZygnQ0hFLkI2LkRFMTgnKQpkZWZpbmUgIlVuZGVyd2VpZ2h0IjoKICBCYXNlLmNvZGluZygnQ0hFLkI2LkRFMjAnKSAKZGVmaW5lICJTZXZlcmVseSBVbmRlcndlaWdodCI6CiAgQmFzZS5jb2RpbmcoJ0NIRS5CNi5ERTIxJykgCgovKiBwYXN0d2VpZ2h0IDogUHJldmlvdXMgV2VpZ2h0Ki8KZGVmaW5lICJwYXN0d2VpZ2h0b2JzIjoKICAgIGlmIEFnZUluTW9udGhzKCk8IDQgIHRoZW4KICAgICAgQmFzZS5HZXRIaXN0b3JpY09ic2VydmF0aW9uKCJXZWlnaHQiLCA2MCkKICAgIGVsc2UgaWYgQWdlSW5Nb250aHMoKTwgNiAgdGhlbgogICAgICBCYXNlLkdldEhpc3RvcmljT2JzZXJ2YXRpb24oIldlaWdodCIsIDkxKQogICAgZWxzZSBpZiBBZ2VJbk1vbnRocygpPCAxMiAgdGhlbgogICAgICBCYXNlLkdldEhpc3RvcmljT2JzZXJ2YXRpb24oIldlaWdodCIsIDEyMSkKICAgIGVsc2UgCiAgICAgIEJhc2UuR2V0SGlzdG9yaWNPYnNlcnZhdGlvbigiV2VpZ2h0IiwgMTgwKQoKZGVmaW5lICJwYXN0d2VpZ2h0IjoKICAgIGlmICJwYXN0d2VpZ2h0b2JzIiBpcyBub3QgbnVsbCB0aGVuCiAgICAgICJwYXN0d2VpZ2h0b2JzIi52YWx1ZQogICAgZWxzZSBudWxsCgovKiBwYXRpZW50c2V4IDogUGF0aWVudCBzZXgqLwpkZWZpbmUgInBhdGllbnRzZXgiOgogICAgaWYgUGF0aWVudC5nZW5kZXIgPSAnZmVtYWxlJyB0aGVuICdmZW1hbGUnIGVsc2UgJ21hbGUnCgovKiBhZ2VhdHBhc3R3ZWlnaHQgOiBBZ2UgYXQgUHJldmlvdXMgV2VpZ2h0Ki8KZGVmaW5lICJhZ2VhdHBhc3R3ZWlnaHQiOgogICAgaWYgInBhc3R3ZWlnaHQiIGlzIG5vdCBudWxsICB0aGVuCiAgICAgICAgKGRpZmZlcmVuY2UgaW4gZGF5cyBiZXR3ZWVuIFBhdGllbnQuYmlydGhEYXRlIGFuZCBUb0RhdGUocGFzdHdlaWdodG9icy5pc3N1ZWQpKSAqICggMS4wIGFzIFN5c3RlbS5EZWNpbWFsICkKICAgIGVsc2UKICAgICBudWxsCgovKiBwYXN0d2VpZ2h0enNjb3JlIDogWi1TY29yZSBhdCBQcmV2aW91cyBXZWlnaHQqLwpkZWZpbmUgInBhc3R3ZWlnaHR6c2NvcmUiOgogICAgaWYgInBhc3R3ZWlnaHQiIGlzIG5vdCBudWxsICB0aGVuCiAgICAgIHdmYS5nZW5lcmF0ZVpTY29yZVdlaWdodEZvckFnZSgicGF0aWVudHNleCIsICJhZ2VhdHBhc3R3ZWlnaHQiICwgKCJwYXN0d2VpZ2h0Ii52YWx1ZSAqICggMS4wIGFzIFN5c3RlbS5EZWNpbWFsKSkpCiAgICBlbHNlCiAgICAgIG51bGwKCi8qIHBhc3R3ZWlnaHRhY3R1YWxpc2VkIDogV2VpZ2h0IGZyb20gIGF0IFByZXZpb3VzIFdlaWdodCovCmRlZmluZSAicGFzdHdlaWdodGFjdHVhbGlzZWQiOgogICAgaWYgInBhc3R3ZWlnaHR6c2NvcmUiIGlzIG5vdCBudWxsIHRoZW4KICAgICAgU3lzdGVtLlF1YW50aXR5IHsgdmFsdWU6IFJvdW5kKHdmYS5nZW5lcmF0ZVdlaWdodEZyb21BZ2UoInBhdGllbnRzZXgiLEFnZUluRGF5cygpICogKCAxLjAgYXMgU3lzdGVtLkRlY2ltYWwgKSwgICJwYXN0d2VpZ2h0enNjb3JlIiApLDIpLCB1bml0OiAna2cnfSAKICAgIGVsc2UgCiAgICAgICBudWxsCgoKCmRlZmluZSBleGlzdGluZ3dlaWdodDoKICBCYXNlLkdldE9ic1ZhbHVlKCJXZWlnaHQiKQoKZGVmaW5lIGV4aXN0aW5nZXN0aW1uYXRlZHdlaWdodDoKICBpZiBleGlzdGluZ3dlaWdodCBpcyBudWxsIHRoZW4gIAogICAgQmFzZS5HZXRPYnNWYWx1ZSgiRXN0aW1hdGVkIFdlaWdodCIpCiAgZWxzZSAKICAgIG51bGwKCmRlZmluZSBleGlzdGluZ2hlaWdodDoKICBCYXNlLkdldE9ic1ZhbHVlKCJIZWlnaHQiKQoKZGVmaW5lIGV4aXN0aW5nbGVuZ3RoOgogIEJhc2UuR2V0T2JzVmFsdWUoIkxlbmd0aCIpCgpkZWZpbmUgZXhpc3RpbmdtdWFjOgogIEJhc2UuR2V0T2JzVmFsdWUoIk1VQUMiKQoKZGVmaW5lIGV4aXN0aW5ndmlzdWFsOgogIEJhc2UuR2V0T2JzVmFsdWUoIlZpc3VhbGx5IGFzc2VzcyIpCi8vCmRlZmluZSB6c2NvcmVmcm9tbXVhYzoKICBpZiBleGlzdGluZ211YWMgaXMgbnVsbCB0aGVuIG51bGwKICBlbHNlIGlmIGV4aXN0aW5nbXVhYyA8IDExNSAnbW5tJyB0aGVuIC0zLjAKICBlbHNlIGlmIGV4aXN0aW5nbXVhYyA8IDEyNSAnbW5tJyB0aGVuIC0yLjAKICBlbHNlIDAuMAoKZGVmaW5lIGVzdGltYXRlZHdlaWdodDoKICBjYXNlICAKICB3aGVuIGV4aXN0aW5nd2VpZ2h0IGlzIG5vdCBudWxsIHRoZW4gbnVsbAogIHdoZW4gZXhpc3Rpbmdlc3RpbW5hdGVkd2VpZ2h0IGlzIG5vdCBudWxsIHRoZW4gZXhpc3Rpbmdlc3RpbW5hdGVkd2VpZ2h0CiAgd2hlbiBwYXN0d2VpZ2h0YWN0dWFsaXNlZCBpcyBub3QgbnVsbCB0aGVuIHBhc3R3ZWlnaHRhY3R1YWxpc2VkCiAgd2hlbiBBZ2VJbk1vbnRocygpPjI0IGFuZCBleGlzdGluZ2hlaWdodCB0aGVuIHdlaWdodGZyb21oZWlnaHQKICB3aGVuIEFnZUluTW9udGhzKCk8PTI0IGFuZCBleGlzdGluZ2xlbmd0aCB0aGVuIHdlaWdodGZyb21sZW5ndGgKICBlbHNlIHdlaWdodGZyb21hZ2UKICBlbmQKCmRlZmluZSB6c2NvcmVmcm9tdmlzdWFsOgogICAgaWYgZXhpc3Rpbmd2aXN1YWwgaXMgbm90IG51bGwgdGhlbgogICAgICBjYXNlICAKICAgICAgICB3aGVuIGV4aXN0aW5ndmlzdWFsIH4gIlNldmVyZWx5IFVuZGVyd2VpZ2h0IiB0aGVuIC0zLjAKICAgICAgICB3aGVuIGV4aXN0aW5ndmlzdWFsIH4gIlVuZGVyd2VpZ2h0IiB0aGVuIC0yLjAKICAgICAgICBlbHNlIDAuMAogICAgICBlbmQKICAgIGVsc2UgIG51bGwKCgpkZWZpbmUgd2VpZ2h0ZnJvbWxlbmd0aDoKICAgIFN5c3RlbS5RdWFudGl0eSB7IHZhbHVlOiBSb3VuZCh3ZmwuZ2VuZXJhdGVXZWlnaHRGcm9tTGVuZ3RoKCJwYXRpZW50c2V4IiwoY29udmVydCBleGlzdGluZ2xlbmd0aCB0byAnY20nKS52YWx1ZSAqICggMS4wIGFzIFN5c3RlbS5EZWNpbWFsICksIHpzY29yZWZyb21tdWFjKSwyKSwgdW5pdDogJ2tnJ30KCmRlZmluZSB3ZWlnaHRmcm9taGVpZ2h0OgogICAgU3lzdGVtLlF1YW50aXR5IHsgdmFsdWU6Um91bmQod2ZoLmdlbmVyYXRlV2VpZ2h0RnJvbUhlaWdodCgicGF0aWVudHNleCIsKGNvbnZlcnQgZXhpc3RpbmdoZWlnaHQgdG8gJ2NtJykudmFsdWUgKiAoIDEuMCBhcyBTeXN0ZW0uRGVjaW1hbCApLCB6c2NvcmVmcm9tbXVhYyksMiksIHVuaXQ6ICdrZyd9CgpkZWZpbmUgd2VpZ2h0ZnJvbWFnZToKICAgIFN5c3RlbS5RdWFudGl0eSB7IHZhbHVlOlJvdW5kKHdmYS5nZW5lcmF0ZVdlaWdodEZyb21BZ2UoInBhdGllbnRzZXgiLEFnZUluRGF5cygpICogKCAxLjAgYXMgU3lzdGVtLkRlY2ltYWwgKSwgenNjb3JlZnJvbW11YWMpLDIpLCB1bml0OiAna2cnfQovKgooY29udmVydCBCYXNlLkhhc09icygiV2VpZ2h0IikgdG8gJ0tnJykgZG9lcyBub3Qgd29yaywgc28gbGV0J3MgYXNzdW1lIHRoZSB3ZWlnaHQgaXMgaW4gS2cKKi8KZGVmaW5lICJXQVoiOgogICAgaWYgZXhpc3Rpbmd3ZWlnaHQgaXMgbm90IG51bGwgdGhlbgogICAgICAgICB3ZmEuZ2VuZXJhdGVaU2NvcmVXZWlnaHRGb3JBZ2UoInBhdGllbnRzZXgiLCBBZ2VJbkRheXMoKSAsIChleGlzdGluZ3dlaWdodC52YWx1ZSAqICggMS4wIGFzIFN5c3RlbS5EZWNpbWFsICkpKQogICAgZWxzZSBpZiBleGlzdGluZ211YWMgaXMgbm90IG51bGwgdGhlbgogICAgICAgIHpzY29yZWZyb21tdWFjCiAgICBlbHNlIGlmIGV4aXN0aW5ndmlzdWFsIHRoZW4KICAgICAgICB6c2NvcmVmcm9tdmlzdWFsCiAgICBlbHNlIG51bGwKCmRlZmluZSAiV0xaIjoKICAgIGlmIGV4aXN0aW5nd2VpZ2h0IGlzIG5vdCBudWxsIHRoZW4KICAgICAgICAgd2ZsLmdlbmVyYXRlWlNjb3JlV2VpZ2h0Rm9yTGVuZ3RoKCJwYXRpZW50c2V4IiwgKGV4aXN0aW5nbGVuZ3RoLnZhbHVlICogKCAxLjAgYXMgU3lzdGVtLkRlY2ltYWwgKSkgLCAgKGV4aXN0aW5nd2VpZ2h0LnZhbHVlICogKCAxLjAgYXMgU3lzdGVtLkRlY2ltYWwgKSkpCiAgICBlbHNlIGlmIGV4aXN0aW5nbXVhYyBpcyBub3QgbnVsbCB0aGVuCiAgICAgICAgenNjb3JlZnJvbW11YWMKICAgIGVsc2UgaWYgZXhpc3Rpbmd2aXN1YWwgdGhlbgogICAgICAgIHpzY29yZWZyb212aXN1YWwKICAgIGVsc2UgbnVsbAoKZGVmaW5lICJXSFoiOgogICAgaWYgZXhpc3Rpbmd3ZWlnaHQgaXMgbm90IG51bGwgdGhlbgogICAgICAgICB3ZmguZ2VuZXJhdGVaU2NvcmVXZWlnaHRGb3JIZWlnaHQoInBhdGllbnRzZXgiLCAoZXhpc3RpbmdoZWlnaHQudmFsdWUgKiAoIDEuMCBhcyBTeXN0ZW0uRGVjaW1hbCApKSAsICAoZXhpc3Rpbmd3ZWlnaHQudmFsdWUgKiAoIDEuMCBhcyBTeXN0ZW0uRGVjaW1hbCApKSkKICAgIGVsc2UgaWYgZXhpc3RpbmdtdWFjIGlzIG5vdCBudWxsIHRoZW4KICAgICAgICB6c2NvcmVmcm9tbXVhYwogICAgZWxzZSBpZiBleGlzdGluZ3Zpc3VhbCB0aGVuCiAgICAgICAgenNjb3JlZnJvbXZpc3VhbAogICAgZWxzZSBudWxsCg=="^^xsd:base64Binary ]
  ] ) . #