eCQM QICore Content Implementation Guide
2025.0.0 - CI Build

eCQM QICore Content Implementation Guide, published by cqframework. This guide is not an authorized publication; it is the continuous build for version 2025.0.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/cqframework/ecqm-content-qicore-2025/ and changes regularly. See the Directory of published versions

: CMS832HHAKIFHIR - JSON Representation

Active as of 2025-05-27

Raw json | Download

{
  "resourceType" : "Library",
  "id" : "CMS832HHAKIFHIR",
  "meta" : {
    "profile" : [
      🔗 "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-computablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-executablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/elm-json-library"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/elm-xml-library"
    ]
  },
  "language" : "en",
  "text" : {
    "status" : "extensions",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n    <table class=\"grid dict\">\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Title: </b></th>\n            <td style=\"padding-left: 4px;\">CMS832HHAKIFHIR</td>\n        </tr>\n        \n\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Id: </b></th>\n            <td style=\"padding-left: 4px;\">CMS832HHAKIFHIR</td>\n        </tr>\n        \n\n        \n        \n        <tr>\n            <th scope=\"row\"><b>Version: </b></th>\n            <td style=\"padding-left: 4px;\">0.2.000</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Url: </b></th>\n            <td style=\"padding-left: 4px;\">https://madie.cms.gov/Library/CMS832HHAKIFHIR</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\">\n                <b>\n                    \n                        official\n                    \n                </b>\n            </th>\n            <td style=\"padding-left: 4px;\">\n                \n                <p style=\"margin-bottom: 5px;\">\n                    <span>CMS832HHAKIFHIR</span>\n                </p>\n                \n            </td>\n        </tr>\n        \n\n        \n\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Type: </b></th>\n            <td style=\"padding-left: 4px;\">\n                \n                    \n                        \n                        <p style=\"margin-bottom: 5px;\">\n                            <b>system: </b> <span>http://terminology.hl7.org/CodeSystem/library-type</span>\n                        </p>\n                        \n                        \n                        <p style=\"margin-bottom: 5px;\">\n                            <b>code: </b> <span>logic-library</span>\n                        </p>\n                        \n                        \n                    \n                \n                \n            </td>\n        </tr>\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Date: </b></th>\n            <td style=\"padding-left: 4px;\">2025-05-27T15:45:19+00:00</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Publisher: </b></th>\n            <td style=\"padding-left: 4px;\">Centers for Medicare &amp; Medicaid Services (CMS)</td>\n        </tr>\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Description: </b></th>\n            <td style=\"padding-left: 4px;\">CMS832HHAKIFHIR</td>\n        </tr>\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n\n        \n        <tr>\n            <th scope=\"row\"><b>Related Artifacts: </b></th>\n            <td style=\"padding-left: 4px;\">\n                \n                \n                \n                <p><b>Dependencies</b></p>\n                <ul>\n                  \n                    <li>https://madie.cms.gov/Library/FHIRHelpers|4.4.000</li>\n                  \n                    <li>https://madie.cms.gov/Library/CQMCommon|4.1.000</li>\n                  \n                    <li>https://madie.cms.gov/Library/QICoreCommon|4.0.000</li>\n                  \n                    <li>https://madie.cms.gov/Library/SupplementalDataElements|5.1.000</li>\n                  \n                    <li>http://loinc.org</li>\n                  \n                    <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307</li>\n                  \n                    <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.21</li>\n                  \n                    <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.33</li>\n                  \n                    <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197</li>\n                  \n                    <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.199</li>\n                  \n                    <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.152</li>\n                  \n                    <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.12</li>\n                  \n                    <li>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.19</li>\n                  \n                </ul>\n                \n                \n                \n                \n                \n            </td>\n        </tr>\n        \n\n        \n\n        \n        <tr>\n          <th scope=\"row\"><b>Data Requirements:</b></th>\n          <td style=\"padding-left: 4px;\">\n            <table class=\"grid-dict\">\n              <tr><th><b>Type</b></th><th><b>Profile</b></th><th><b>MS</b></th><th><b>Code Filter</b></th></tr>\n              \n                <tr>\n                  <th>Patient</th>\n                  <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-patient</th>\n                  <th>;;</th>\n                  <th>\n                    \n                  </th>\n                </tr>\n              \n                <tr>\n                  <th>Claim</th>\n                  <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-claim</th>\n                  <th>;;;;;;</th>\n                  <th>\n                    \n                  </th>\n                </tr>\n              \n                <tr>\n                  <th>Coverage</th>\n                  <th>http://hl7.org/fhir/us/qicore/StructureDefinition/qicore-coverage</th>\n                  <th>;;</th>\n                  <th>\n                    \n                      <b>code filter: </b>\n                      \n                      <br/>\n                      \n                      \n                      <span style=\"padding-left: 4px;\">\n                          <b>path: </b><span>type</span>\n                      </span>\n                      \n                      <br/>\n                      \n                      \n                      \n                      <span style=\"padding-left: 4px;\">\n                          <b>value set: </b><span>http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.114222.4.11.3591</span>\n                      </span>\n                      \n                      \n                    \n                  </th>\n                </tr>\n              \n            </table>\n          </td>\n        </tr>\n        \n\n        \n        \n        <tr>\n          <td colspan=\"2\">\n            <table>\n              <tr><th><a id=\"cql-content\"><b>Content: </b></a> text/cql</th></tr>\n              <tr><td><pre><code class=\"language-cql\">library CMS832HHAKIFHIR version '0.2.000'\r\n\r\nusing QICore version '6.0.0'\r\n\r\ninclude FHIRHelpers version '4.4.000' called FHIRHelpers\r\ninclude SupplementalDataElements version '5.1.000' called SDE\r\ninclude CQMCommon version '4.1.000' called CQMCommon\r\ninclude QICoreCommon version '4.0.000' called QICoreCommon\r\ninclude CumulativeMedicationDuration version '5.0.000' called CMD\r\ninclude HospitalHarm version '2.5.000' called HospitalHarm\r\n\r\ncodesystem &quot;SNOMEDCT&quot;: 'http://snomed.info/sct'\r\ncodesystem &quot;LOINC&quot;: 'http://loinc.org'\r\n\r\nvalueset &quot;Body temperature&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1045.152'\r\nvalueset &quot;Creatinine Mass Per Volume&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.21'\r\nvalueset &quot;Emergency Department Visit&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.292'\r\nvalueset &quot;Encounter Inpatient&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'\r\nvalueset &quot;Glomerular Filtration Rate&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.17.4077.2.2038'\r\nvalueset &quot;High Risk Diagnosis for AKI&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.12'\r\nvalueset &quot;High Risk Procedures for AKI&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.19'\r\nvalueset &quot;Hospital Based Dialysis Services&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.199'\r\nvalueset &quot;Observation Services&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1111.143'\r\nvalueset &quot;Obstetrics and VTE Obstetrics&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.33'\r\nvalueset &quot;Present on Admission or Clinically Undetermined&quot;: 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197'\r\n\r\ncode &quot;Female (finding)&quot;: '248152002' from &quot;SNOMEDCT&quot; display 'Female'\r\ncode &quot;Male (finding)&quot;: '248153007' from &quot;SNOMEDCT&quot; display 'Male'\r\ncode &quot;Heart rate&quot;: '8867-4' from &quot;LOINC&quot; display 'Heart rate'\r\ncode &quot;Respiratory rate&quot;: '9279-1' from &quot;LOINC&quot; display 'Respiratory rate'\r\ncode &quot;Systolic blood pressure&quot;: '8480-6' from &quot;LOINC&quot; display 'Systolic blood pressure'\r\n\r\nparameter &quot;Measurement Period&quot; Interval&lt;DateTime&gt;\r\n\r\ncontext Patient\r\n\r\ndefine &quot;SDE Ethnicity&quot;:\r\n  SDE.&quot;SDE Ethnicity&quot;\r\n\r\ndefine &quot;SDE Payer&quot;:\r\n  SDE.&quot;SDE Payer&quot;\r\n\r\ndefine &quot;SDE Race&quot;:\r\n  SDE.&quot;SDE Race&quot;\r\n\r\ndefine &quot;SDE Sex&quot;:\r\n  SDE.&quot;SDE Sex&quot;\r\n\r\n// -------------------------------- Population Definitions -----------------------------\r\n\r\n\r\ndefine &quot;Initial Population&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot;\r\n\r\ndefine &quot;Denominator&quot;:\r\n  &quot;Initial Population&quot;\r\n\r\ndefine &quot;Denominator Exclusion&quot;:\r\n  &quot;Encounter with Less Than 2 Creatinine Results within 48 Hours of Arrival&quot; // clause 1\r\n    \r\n    union &quot;Encounter with Index eGFR Less Than 60 within First 48 Hours&quot;     // clause 2\r\n    \r\n    union &quot;Encounter with 0.3 mg dL or More Increase in Creatinine&quot;          // clause 3\r\n    \r\n    union &quot;Encounter with Kidney Dialysis Started 48 Hours or Less After Arrival without High Creatinine&quot;  // clause 4\r\n    \r\n    union &quot;Encounter with High Risk Diagnosis for AKI&quot;                       // clause 5\r\n    \r\n    union &quot;Encounter with High Risk Procedures for AKI&quot;                      // clause 6 \r\n\r\n\r\ndefine &quot;Numerator&quot;:\r\n  &quot;Encounter with 2 Times Serum Creatinine Increase&quot; // clause 1\r\n    \r\n    union &quot;Encounter with Kidney Dialysis Started More Than 48 Hours After Arrival without High Creatinine&quot;   // clause 2\r\n\r\n\r\n//-------------------------------- Supporting Definitions for Initial Population -----------------------------\r\n\r\n// Supports Initial Population\r\n// Used in other definitions throughout\r\n\r\n\r\n\r\n\r\n\r\ndefine &quot;Encounter with Creatinine and without Obstetrical Conditions&quot;:\r\n  &quot;Inpatient Encounter with Creatinine&quot; EncounterWithCreatinine\r\n    where not exists ( ( EncounterWithCreatinine.encounterDiagnosis ( ) ) EncounterDiagnosis\r\n        where EncounterDiagnosis.code in &quot;Obstetrics and VTE Obstetrics&quot;\r\n    )\r\n\r\n\r\n// Supports Initial Population\r\n\r\n\r\ndefine &quot;Inpatient Encounter with Creatinine&quot;:\r\n  from\r\n    &quot;Encounter with Age 18 and Length of Stay 48 Hours or More&quot; Encounter48Hours,\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] CreatinineTest\r\n    let HospitalizationPeriod: Encounter48Hours.hospitalizationWithObservation ( ),\r\n    CreatinineTestStart: CreatinineTest.effective.earliest ( )\r\n    where CreatinineTest.value is not null\r\n      and CreatinineTestStart during Interval[start of HospitalizationPeriod + 48 hours, end of HospitalizationPeriod]\r\n      and CreatinineTest.status in { 'final', 'amended', 'corrected' }\r\n    return Encounter48Hours\r\n                \r\n// Supports Initial Population\r\n\r\n/*\r\ndefine &quot;Encounter with Age 18 and Length of Stay 48 Hours or More&quot;:\r\n  [&quot;Encounter&quot;: &quot;Encounter Inpatient&quot;] InpatientEncounter\r\n                    where InpatientEncounter.period ends during day of &quot;Measurement Period&quot;\r\n                        and AgeInYearsAt(date from start of InpatientEncounter.period)&gt;= 18\r\n                        and ( duration in hours of InpatientEncounter.hospitalizationWithObservation() &gt;= 48 )*/ \r\n\r\n\r\n\r\ndefine &quot;Encounter with Age 18 and Length of Stay 48 Hours or More&quot;:\r\n  [&quot;Encounter&quot;: &quot;Encounter Inpatient&quot;] InpatientEncounter\r\n    where Patient.sex in { '248153007', '248152002' }\r\n      and InpatientEncounter.period ends during day of &quot;Measurement Period&quot;\r\n      and AgeInYearsAt(date from start of InpatientEncounter.period) &gt;= 18\r\n      and ( duration in hours of InpatientEncounter.hospitalizationWithObservation ( ) &gt;= 48 )\r\n\r\n// -------------------------------- Supporting Definitions for Denominator Exclusion  -----------------------------\r\n\r\n// Denominator Exclusion clause 1\r\n\r\n\r\n\r\ndefine &quot;Encounter with Less Than 2 Creatinine Results within 48 Hours of Arrival&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    where ( Count(&quot;CreatinineLabTestwithResultwithinFirst48Hours&quot;(QualifyingEncounter)) &lt; 2 ) \r\n\r\n// Denonminator Exclusion clause 2\r\n\r\n\r\ndefine &quot;Encounter with Index eGFR Less Than 60 within First 48 Hours&quot;:\r\n  &quot;Male Encounter with eGFR Less Than 60&quot;\r\n    union &quot;Female Encounter with eGFR Less Than 60&quot;\r\n\r\n// Supporting Denominator Exclusion clause 2    \r\n\r\n\r\ndefine &quot;Female Encounter with eGFR Less Than 60&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    where &quot;FemaleeGFR&quot;(QualifyingEncounter) is not null\r\n      and &quot;FemaleeGFR&quot;(QualifyingEncounter) as Decimal &lt; 60\r\n\r\n// Supporting Denominator Exclusion clause 2  \r\n\r\n\r\ndefine &quot;Male Encounter with eGFR Less Than 60&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    where &quot;MaleeGFR&quot;(QualifyingEncounter) is not null\r\n      and &quot;MaleeGFR&quot;(QualifyingEncounter) as Decimal &lt; 60\r\n\r\n// Denominator Exclusion clause 3  (Coalesce doesn't seem to work as intended)\r\n\r\n\r\ndefine &quot;Encounter with 0.3 mg dL or More Increase in Creatinine&quot;:\r\n  &quot;Increase of 0.3 or More Using Lowest Creatinine within 24 Hours&quot;\r\n    union &quot;Increase of 0.3 or More Using First Creatinine within First 48 Hours&quot;\r\n\r\n   \r\n//define &quot;Encounter with 0.3 mg dL or More Increase in Creatinine&quot;:\r\n  //Coalesce(&quot;Increase of 0.3 or More Using Lowest Creatinine within 24 Hours&quot;,&quot;Increase of 0.3 or More Using First Creatinine within First 48 Hours&quot;)\r\n\r\n/*\r\ndefine &quot;Encounter with 0.3 mg dL or More Increase in Creatinine&quot;:\r\n  case\r\n    when &quot;Increase of 0.3 or More Using Lowest Creatinine within 24 Hours&quot; is not null\r\n      then &quot;Increase of 0.3 or More Using Lowest Creatinine within 24 Hours&quot;\r\n    when &quot;Increase of 0.3 or More Using First Creatinine within First 48 Hours&quot; is not null\r\n      then &quot;Increase of 0.3 or More Using First Creatinine within First 48 Hours&quot;\r\n    else null\r\n  end */\r\n\r\n  \r\n// Supporting Denominator Exclusion clause 3\r\n\r\n\r\n\r\n\r\n\r\ndefine &quot;Increase of 0.3 or More Using Lowest Creatinine within 24 Hours&quot;:\r\n  from\r\n    &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter,\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] IndexCreatinineLabResult,\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] SubsequentCreatinineLabResult\r\n    let IndexCreatinineLabResultTime: IndexCreatinineLabResult.effective.earliest ( ),\r\n    SubsequentCreatinineLabResultTime: SubsequentCreatinineLabResult.effective.earliest ( ),\r\n    HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )\r\n    where IndexCreatinineLabResult.status in { 'final', 'amended', 'corrected' }\r\n      and SubsequentCreatinineLabResult.status in { 'final', 'amended', 'corrected' }\r\n      and ( ( SubsequentCreatinineLabResult.value as Quantity ) - ( IndexCreatinineLabResult.value as Quantity ) ) &gt; 0.299 'mg/dL'\r\n      and IndexCreatinineLabResult.value = &quot;LowestSerumCreatinineResult&quot;(QualifyingEncounter)\r\n      and IndexCreatinineLabResultTime during Interval[SubsequentCreatinineLabResultTime - 48 hours, SubsequentCreatinineLabResultTime]\r\n      and IndexCreatinineLabResultTime during HospitalWithObservationPeriod\r\n      and IndexCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 24 hours]\r\n      and SubsequentCreatinineLabResultTime during HospitalWithObservationPeriod\r\n      and SubsequentCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]\r\n      and IndexCreatinineLabResult.id != SubsequentCreatinineLabResult.id\r\n    return QualifyingEncounter\r\n\r\n// Supporting Denominator Exclusion clause 3            \r\n\r\n\r\ndefine &quot;Increase of 0.3 or More Using First Creatinine within First 48 Hours&quot;:\r\n  from\r\n    &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter,\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] IndexCreatinineLabResult,\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] SubsequentCreatinineLabResult\r\n    let IndexCreatinineLabResultTime: IndexCreatinineLabResult.effective.earliest ( ),\r\n    SubsequentCreatinineLabResultTime: SubsequentCreatinineLabResult.effective.earliest ( ),\r\n    HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )\r\n    where IndexCreatinineLabResult.status in { 'final', 'amended', 'corrected' }\r\n      and SubsequentCreatinineLabResult.status in { 'final', 'amended', 'corrected' }\r\n      and ( ( SubsequentCreatinineLabResult.value as Quantity ) - ( IndexCreatinineLabResult.value as Quantity ) ) &gt; 0.299 'mg/dL'\r\n      and IndexCreatinineLabResult.value as Quantity = singleton from &quot;EarliestSerumCreatinineResult&quot;(QualifyingEncounter)\r\n      and IndexCreatinineLabResultTime during Interval[SubsequentCreatinineLabResultTime - 48 hours, SubsequentCreatinineLabResultTime]\r\n      and IndexCreatinineLabResultTime during HospitalWithObservationPeriod\r\n      and SubsequentCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]\r\n      and SubsequentCreatinineLabResultTime during HospitalWithObservationPeriod\r\n      and IndexCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]\r\n      and SubsequentCreatinineLabResultTime during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]\r\n      and IndexCreatinineLabResult.id != SubsequentCreatinineLabResult.id\r\n    return QualifyingEncounter\r\n \r\n// Denominator Exclusion clause 4\r\n\r\n\r\ndefine &quot;Encounter with Kidney Dialysis Started 48 Hours or Less After Arrival without High Creatinine&quot;:\r\n  &quot;Encounter with Kidney Dialysis Started 48 Hours or Less After Arrival&quot; EncounterWithKidneyDialysis48HoursOrAfter\r\n    where not ( exists ( &quot;Encounter with 2 Times Serum Creatinine Increase&quot; EncounterWithHighCreatinine\r\n          where ( EncounterWithHighCreatinine.period includes EncounterWithKidneyDialysis48HoursOrAfter.period )\r\n      )\r\n    )\r\n \r\n// Supporting Denominator Exclusion clause 4\r\n\r\n\r\ndefine &quot;Encounter with Kidney Dialysis Started 48 Hours or Less After Arrival&quot;:\r\n  from\r\n    [&quot;Procedure&quot;: &quot;Hospital Based Dialysis Services&quot;] Dialysis,\r\n    &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    let HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )\r\n    where Dialysis.performed.toInterval ( ) starts during Interval[start of HospitalWithObservationPeriod, start of HospitalWithObservationPeriod + 48 hours]\r\n      and Dialysis.performed.toInterval ( ) starts during HospitalWithObservationPeriod\r\n    return QualifyingEncounter\r\n\r\n\r\n// Supporting Denominator Exclusion clause 4\r\n// Also Supporting Numerator clause 1\r\n\r\n\r\n\r\ndefine &quot;Encounter with 2 Times Serum Creatinine Increase&quot;:\r\n  from\r\n    &quot;Encounter with 1.5 Times Serum Creatinine Increase&quot; EncounterWithHighCreatinine,\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] HighCreatinineTest,\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] LowCreatinineTest\r\n    let LowCreatinineTestTime: LowCreatinineTest.effective.earliest ( ),\r\n    HighCreatinineTestTime: HighCreatinineTest.effective.earliest ( ),\r\n    HospitalWithObservationPeriod: EncounterWithHighCreatinine.hospitalizationWithObservation ( )\r\n    where ( HighCreatinineTest.value &gt; &quot;Serum Creatinine Normal&quot; )\r\n      and LowCreatinineTest.status in { 'final', 'amended', 'corrected' }\r\n      and HighCreatinineTest.status in { 'final', 'amended', 'corrected' }\r\n      and HighCreatinineTest.value = &quot;HighestSerumCreatinineResult&quot;(EncounterWithHighCreatinine)\r\n      and LowCreatinineTest.value = &quot;LowestSerumCreatinineResult&quot;(EncounterWithHighCreatinine)\r\n      and ( HighCreatinineTest.value as Quantity ) &gt;= ( LowCreatinineTest.value as Quantity )\r\n      and LowCreatinineTestTime 7 days or less before HighCreatinineTestTime\r\n      and LowCreatinineTestTime during HospitalWithObservationPeriod\r\n      and HighCreatinineTestTime during Interval[start of HospitalWithObservationPeriod + 48 hours, start of HospitalWithObservationPeriod + 30 days]\r\n      and HighCreatinineTestTime during HospitalWithObservationPeriod\r\n    return EncounterWithHighCreatinine\r\n\r\n\r\n\r\n// Supports &quot;Encounter with 2 Times Serum Creatinine Increase&quot;\r\n// Supports &quot;Encounter with 1.5 Times Serum Creatinine Increase&quot;\r\n\r\n\r\n\r\ndefine &quot;Serum Creatinine Normal&quot;:\r\n  if ( Patient.sex = '248152002' ) then 1.02 'mg/dL' \r\n    else 1.18 'mg/dL' \r\n\r\n\r\n// Denominator Exclusion clause 5\r\n\r\n\r\ndefine &quot;Encounter with High Risk Diagnosis for AKI&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    where exists ( ( QualifyingEncounter.encounterDiagnosis ( ) ) EncounterDiagnosis\r\n        where ( EncounterDiagnosis.code in &quot;High Risk Diagnosis for AKI&quot; )\r\n    )\r\n\r\n\r\n// Denominator Exclusion clause 6\r\n\r\n\r\ndefine &quot;Encounter with High Risk Procedures for AKI&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    with [&quot;Procedure&quot;: &quot;High Risk Procedures for AKI&quot;] HighRiskProcedures\r\n      such that HighRiskProcedures.performed.toInterval ( ) starts during QualifyingEncounter.hospitalizationWithObservation ( )\r\n\r\n\r\n// -------------------------------- Supporting Definitions for Numerator  -----------------------------\r\n\r\n// Numerator clause 1:  See &quot;Encounter with 2 Times Serum Creatinine Increase&quot;\r\n\r\n// Numerator union clause 2\r\n\r\n\r\n\r\n\r\ndefine &quot;Encounter with Kidney Dialysis Started More Than 48 Hours After Arrival without High Creatinine&quot;:\r\n  &quot;Encounter with Kidney Dialysis Started More Than 48 Hours After Arrival&quot; EncounterWithDialysisAfter48Hours\r\n    where not ( exists ( &quot;Encounter with 2 Times Serum Creatinine Increase&quot; EncounterWithHighCreatinine\r\n          where ( EncounterWithHighCreatinine.period includes EncounterWithDialysisAfter48Hours.period )\r\n      )\r\n    )\r\n\r\n// Supports Numerator union clause 2\r\n\r\n\r\ndefine &quot;Encounter with Kidney Dialysis Started More Than 48 Hours After Arrival&quot;:\r\n  from\r\n    [&quot;Procedure&quot;: &quot;Hospital Based Dialysis Services&quot;] Dialysis,\r\n    &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    let HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )\r\n    where Dialysis.performed.toInterval ( ) starts during Interval[start of HospitalWithObservationPeriod + 48 hours, end of HospitalWithObservationPeriod]\r\n      and Dialysis.performed.toInterval ( ) starts during HospitalWithObservationPeriod\r\n    return QualifyingEncounter\r\n\r\n\r\n// -------------------------------- Supporting Definitions for Creatinine calculations -----------------------------\r\n\r\n// Used throughout creatinine functions and defines  \r\n\r\n\r\n\r\ndefine &quot;Qualifying Creatinine Lab Result by Time&quot;:\r\n  from\r\n    &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter,\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] CreatinineTestByTime\r\n    let CrEncId: QualifyingEncounter.id,\r\n    CrHospPeriod: QualifyingEncounter.hospitalizationWithObservation ( ),\r\n    CrLabId: CreatinineTestByTime.id,\r\n    CrTime: CreatinineTestByTime.effective.earliest ( ),\r\n    CrTimeIssued: CreatinineTestByTime.issued,\r\n    CrResult: CreatinineTestByTime.value as Quantity,\r\n    CrResultValue: CrResult.value,\r\n    CrResultUnit: CrResult.unit\r\n    where CrTime during CrHospPeriod\r\n      and CreatinineTestByTime.isLaboratory ( )\r\n      and CreatinineTestByTime.status in { 'final', 'amended', 'corrected' }\r\n      and CrResultUnit = 'mg/dL'\r\n      and CreatinineTestByTime.value is not null\r\n      and CreatinineTestByTime.value as Quantity &gt; 0 'mg/dL'\r\n    return Tuple {\r\n      CrEncInPtId: CrEncId,\r\n      CrHospitalization: CrHospPeriod,\r\n      CrLabObsId: CrLabId,\r\n//                    LabCategory: CreatinineTestByQuantity.isLaboratory(),\r\n      \r\n      CrLabObsCategory: if CreatinineTestByTime.isLaboratory ( ) then 'laboratory' \r\n        else CreatinineTestByTime.isLaboratory ( ),\r\n      CrLabObsStatus: CreatinineTestByTime.status,\r\n      CrLabResult: CrResult,\r\n      CrLabResultUnit: CrResultUnit,\r\n      CrLabResultValue: CrResultValue,\r\n      CrLabTime: CrTime,\r\n      CrLabTimeIssued: CrTimeIssued\r\n    }\r\n    sort by CrLabTime  \r\n\r\n// Supporting Denominator Exclusion clause 4\r\n// Supporting Numerator               \r\n\r\n\r\n\r\ndefine &quot;Encounter with 1.5 Times Serum Creatinine Increase&quot;:\r\n  from\r\n    &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter,\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] HighCreatinineTest,\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] LowCreatinineTest\r\n    let LowCreatinineTestTime: LowCreatinineTest.effective.earliest ( ),\r\n    HighCreatinineTestTime: HighCreatinineTest.effective.earliest ( ),\r\n    HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation ( )\r\n    where ( HighCreatinineTest.value &gt; &quot;Serum Creatinine Normal&quot; )\r\n      and LowCreatinineTest.status in { 'final', 'amended', 'corrected' }\r\n      and HighCreatinineTest.status in { 'final', 'amended', 'corrected' }\r\n      and HighCreatinineTest.value = &quot;HighestSerumCreatinineResult&quot;(QualifyingEncounter)\r\n      and LowCreatinineTest.value = &quot;LowestSerumCreatinineResult&quot;(QualifyingEncounter)\r\n      and &quot;1.5IncreaseInCreatinine&quot;(QualifyingEncounter) &gt;= LowCreatinineTest.value\r\n      and LowCreatinineTestTime 7 days or less before HighCreatinineTestTime\r\n      and LowCreatinineTestTime during HospitalWithObservationPeriod\r\n      and HighCreatinineTestTime during Interval[start of HospitalWithObservationPeriod + 48 hours, start of HospitalWithObservationPeriod + 30 days]\r\n      and HighCreatinineTestTime during HospitalWithObservationPeriod\r\n    return QualifyingEncounter\r\n\r\n/*\r\ndefine &quot;Encounter with 1.5 Times Serum Creatinine Increase&quot;:\r\n  from\r\n    &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter,\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] CreatinineTest\r\n  let \r\n    LowestCreatinineTestWithin7DaysPrior: &quot;LowestSerumCreatinineWithin7DaysPrior&quot;(QualifyingEncounter, CreatinineTest),\r\n    CreatinineTestTime: CreatinineTest.effective.earliest(),\r\n    HospitalWithObservationPeriod: QualifyingEncounter.hospitalizationWithObservation()\r\n  where \r\n    CreatinineTest.value &gt;= LowestCreatinineTestWithin7DaysPrior * 1.5\r\n    and CreatinineTest.value &gt; &quot;Serum Creatinine Normal&quot;\r\n    and CreatinineTestTime during Interval[start of HospitalWithObservationPeriod + 48 hours, start of HospitalWithObservationPeriod + 30 days]\r\n  return QualifyingEncounter*/\r\n            \r\n\r\n// -------------------------------- Supporting Functions  for Creatinine calculations  -----------------------------\r\n\r\n// Supports Denominator Exclusion clause 1\r\n\r\n\r\n\r\n\r\ndefine function &quot;CreatinineLabTestwithResultwithinFirst48Hours&quot;(QualifyingEncounter Encounter):\r\n  from\r\n    [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] CreatinineTest\r\n    where CreatinineTest.value is not null\r\n      and CreatinineTest.effective.earliest ( ) during Interval[start of QualifyingEncounter.hospitalizationWithObservation ( ), start of QualifyingEncounter.hospitalizationWithObservation ( ) + 48 hours]\r\n      and CreatinineTest.effective.earliest ( ) during QualifyingEncounter.hospitalizationWithObservation ( )\r\n      and CreatinineTest.status in { 'final', 'amended', 'corrected' }\r\n    return CreatinineTest\r\n\r\n// eGFR functions return as decimal value rather than Quantity\r\n// Supports Denominator Exclusion clause 2\r\n// Supports risk variable &quot;Risk Variable Estimated Glomerular Filtration Rate for Females&quot;\r\n\r\n\r\n\r\n\r\ndefine function &quot;FemaleeGFR&quot;(QualifyingEncounter Encounter):\r\n  if Patient.sex = '248152002' then ( 142 * Min({(&quot;IndexCreatinine&quot;(QualifyingEncounter).value / 0.7), 1 }) ^ ( - 0.241 ) * Max({(&quot;IndexCreatinine&quot;(QualifyingEncounter).value / 0.7), 1 }) ^ ( - 1.200 ) * 0.9938 ^ ( AgeInYearsAt(start of QualifyingEncounter.hospitalizationWithObservation()) ) * 1.012 ) \r\n    else null\r\n\r\n// eGFR functions return as decimal value rather than Quantity\r\n// Supports Denominator Exclusion clause 2\r\n// Supports risk variable &quot;Risk Variable Estimated Glomerular Filtration Rate for Females&quot;\r\n\r\n\r\n\r\n\r\ndefine function &quot;MaleeGFR&quot;(QualifyingEncounter Encounter):\r\n  if Patient.sex = '248153007' then ( 142 * Min({(&quot;IndexCreatinine&quot;(QualifyingEncounter).value / 0.9), 1 }) ^ ( - 0.302 ) * Max({(&quot;IndexCreatinine&quot;(QualifyingEncounter).value / 0.9), 1 }) ^ ( - 1.200 ) * 0.9938 ^ ( AgeInYearsAt(start of QualifyingEncounter.hospitalizationWithObservation()) ) ) \r\n    else null\r\n\r\n\r\n// Used in GFR calculations, above\r\n\r\n\r\ndefine function &quot;IndexCreatinine&quot;(QualifyingEncounter Encounter):\r\n  Coalesce(&quot;LowestSerumCreatinineIn24Hours&quot;(QualifyingEncounter), singleton from &quot;FirstSerumCreatinineIn48Hours&quot;(QualifyingEncounter))  \r\n\r\n// Supports IndexCreatinine function  \r\n\r\n\r\ndefine function &quot;LowestSerumCreatinineIn24Hours&quot;(QualifyingEncounter Encounter):\r\n  Min((from\r\n        &quot;Qualifying Creatinine Lab Result by Time&quot; LabTestsLow\r\n        let LabResult: LabTestsLow.CrLabResult\r\n        where LabTestsLow.CrEncInPtId = QualifyingEncounter.id\r\n          and LabTestsLow.CrLabTime during Interval[start of QualifyingEncounter.hospitalizationWithObservation(), start of QualifyingEncounter.hospitalizationWithObservation() + 24 hours]\r\n    ).CrLabResult\r\n  ) \r\n\r\n// Find result from earliest time in 48 hrs\r\n// Supports IndexCreatinine function\r\n\r\n\r\n\r\ndefine function &quot;FirstSerumCreatinineIn48Hours&quot;(QualifyingEncounter Encounter):\r\n  from\r\n    &quot;Qualifying Creatinine Lab Result by Time&quot; LabTests\r\n    let LabResult: LabTests.CrLabResult\r\n    where ( &quot;EarliestSerumCreatinineTimeIn48Hours&quot;(QualifyingEncounter) = LabTests.CrLabTime )\r\n    return LabResult as Quantity\r\n\r\n\r\n// Find earliest time in 48 hrs\r\n// Supports FirstSerumCreatinineIn48Hours function\r\n\r\n\r\n\r\ndefine function &quot;EarliestSerumCreatinineTimeIn48Hours&quot;(QualifyingEncounter Encounter):\r\n  ( Min((from\r\n          &quot;Qualifying Creatinine Lab Result by Time&quot; LabTests48\r\n          let LabResult48: LabTests48.CrLabResult\r\n          where LabTests48.CrEncInPtId = QualifyingEncounter.id\r\n            and LabTests48.CrLabTime during Interval[start of QualifyingEncounter.hospitalizationWithObservation(), start of QualifyingEncounter.hospitalizationWithObservation() + 48 hours]\r\n      ).CrLabTime\r\n    )\r\n  )\r\n\r\n// Supports Denominator Exclusion clause 3\r\n\r\n\r\ndefine function &quot;EarliestSerumCreatinineResult&quot;(QualifyingEncounter Encounter):\r\n  from\r\n    &quot;Qualifying Creatinine Lab Result by Time&quot; LabTests\r\n    let LabResult: LabTests.CrLabResult\r\n    where ( &quot;EarliestSerumCreatinineTime&quot;(QualifyingEncounter) = LabTests.CrLabTime )\r\n    return LabResult as Quantity\r\n\r\n//  Supports Denominator Exclusion clause 3 via &quot;EarliestSerumCreatinineResult&quot; function  \r\n\r\n\r\ndefine function &quot;EarliestSerumCreatinineTime&quot;(QualifyingEncounter Encounter):\r\n  ( Min((from\r\n          &quot;Qualifying Creatinine Lab Result by Time&quot; LabTestsEarly\r\n          let LabResultEarly: LabTestsEarly.CrLabResult\r\n          where LabTestsEarly.CrEncInPtId = QualifyingEncounter.id\r\n      ).CrLabTime\r\n    )\r\n  )\r\n\r\n// Not used anywhere\r\n\r\n\r\ndefine function &quot;SerumCreatinineSequencebyTime&quot;(QualifyingEncounter Encounter):\r\n  [&quot;LaboratoryResultObservation&quot;: &quot;Creatinine Mass Per Volume&quot;] CreatinineTestByTime\r\n    let HospitalWithObservation: QualifyingEncounter.hospitalization ( )\r\n    where CreatinineTestByTime.effective.earliest ( ) during HospitalWithObservation\r\n      and CreatinineTestByTime.value is not null\r\n      and CreatinineTestByTime.isLaboratory ( )\r\n      and CreatinineTestByTime.status in { 'final', 'amended', 'corrected' }\r\n    return CreatinineTestByTime\r\n\r\n// The following functions work with Cr result as Quantity (not decimal, but Quantity value is decimal)\r\n\r\n// Supporting Denominator Exclusion clause 4 via &quot;Encounter with 2 Times Serum Creatinine Increase&quot;\r\n// Supporting Numerator via &quot;Encounter with 2 Times Serum Creatinine Increase&quot;\r\n\r\n\r\n\r\n\r\ndefine function &quot;HighestSerumCreatinineResult&quot;(QualifyingEncounter Encounter):\r\n  ( Max((from\r\n          &quot;Qualifying Creatinine Lab Result by Time&quot; LabTests\r\n          let LabResult: LabTests.CrLabResult\r\n          where LabTests.CrEncInPtId = QualifyingEncounter.id\r\n      ).CrLabResult\r\n    )\r\n  )\r\n\r\n// Supporting Denominator Exclusion clause 4 via &quot;Encounter with 1.5 Times Serum Creatinine Increase&quot;\r\n// Supporting Numerator  via &quot;Encounter with 1.5 Times Serum Creatinine Increase&quot;             \r\n\r\n\r\n\r\ndefine function &quot;1.5IncreaseInCreatinine&quot;(QualifyingEncounter Encounter):\r\n  &quot;HighestSerumCreatinineResult&quot;(QualifyingEncounter) / 1.5\r\n\r\n// Supporting Denominator Exclusion clause 4 via &quot;Encounter with 1.5 Times Serum Creatinine Increase&quot;\r\n// Supporting Numerator  via &quot;Encounter with 1.5 Times Serum Creatinine Increase&quot;             \r\n\r\n\r\n\r\ndefine function &quot;2.0IncreaseInCreatinine&quot;(QualifyingEncounter Encounter):\r\n  &quot;HighestSerumCreatinineResult&quot;(QualifyingEncounter) / 2\r\n\r\n// Supporting Denominator Exclusion clause 3 via &quot;Increase of 0.3 or More Using Lowest Creatinine within 24 Hours&quot;\r\n// and clause 4 via &quot;Encounter with 1.5 Times Serum Creatinine Increase&quot;\r\n// Supporting Numerator  via &quot;Encounter with 1.5 Times Serum Creatinine Increase&quot;             \r\n\r\n\r\n\r\n\r\ndefine function &quot;LowestSerumCreatinineResult&quot;(QualifyingEncounter Encounter):\r\n  ( Min((from\r\n          &quot;Qualifying Creatinine Lab Result by Time&quot; LabTests\r\n          let LabResult: LabTests.CrLabResult\r\n          where LabTests.CrEncInPtId = QualifyingEncounter.id\r\n      ).CrLabResult\r\n    )\r\n  )\r\n\r\n// -------------------------------- Risk Variable Definitions  -----------------------------\r\n\r\n\r\ndefine &quot;Risk Variable Estimated Glomerular Filtration Rate for Females&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    return Tuple {\r\n      encounterId: QualifyingEncounter.id,\r\n      eGFR: &quot;FemaleeGFR&quot;(QualifyingEncounter)\r\n    }\r\n\r\ndefine &quot;Risk Variable Estimated Glomerular Filtration Rate for Males&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    return Tuple {\r\n      encounterId: QualifyingEncounter.id,\r\n      eGFR: &quot;MaleeGFR&quot;(QualifyingEncounter)\r\n    }\r\n\r\ndefine &quot;Risk Variable All Encounter Diagnoses with POA Indication&quot;:\r\n  from\r\n    &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter,\r\n    [Claim] claim\r\n    where claim.status = 'active'\r\n      and claim.use = 'claim'\r\n      and exists ( claim.item I\r\n          where I.encounter.references ( QualifyingEncounter )\r\n            and exists ( claim.diagnosis D\r\n                where D.sequence in claim.item.diagnosisSequence\r\n                  and D.onAdmission in &quot;Present on Admission or Clinically Undetermined&quot;\r\n            )\r\n      )\r\n\r\ndefine &quot;Risk Variable First Heart Rate in Encounter&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    return Tuple {\r\n      encounterId: QualifyingEncounter.id,\r\n      firstHeartRate: &quot;FirstHeartRate&quot;(QualifyingEncounter)\r\n    }\r\n\r\ndefine &quot;Risk Variable First Respiratory Rate in Encounter&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    return Tuple {\r\n      encounterId: QualifyingEncounter.id,\r\n      firstRespiratoryRate: &quot;FirstRespiratoryRate&quot;(QualifyingEncounter)\r\n    }\r\n\r\ndefine &quot;Risk Variable First Systolic Blood Pressure in Encounter&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    return Tuple {\r\n      encounterId: QualifyingEncounter.id,\r\n      firstSystolicBP: &quot;FirstSystolicBloodPressure&quot;(QualifyingEncounter)\r\n    }\r\n\r\ndefine &quot;Risk Variable First Temperature in Encounter&quot;:\r\n  &quot;Encounter with Creatinine and without Obstetrical Conditions&quot; QualifyingEncounter\r\n    return Tuple {\r\n      encounterId: QualifyingEncounter.id,\r\n      firstTemperature: &quot;FirstBodyTemperature&quot;(QualifyingEncounter)\r\n    }\r\n\r\n// -------------------------------- Risk Variable supportin functions  -----------------------------\r\n\r\n\r\ndefine function &quot;FirstBodyTemperature&quot;(QualifyingEncounter Encounter):\r\n  First([&quot;USCoreBodyTemperatureProfile&quot;: &quot;Body temperature&quot;] FirstTemperature\r\n      where FirstTemperature.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\r\n        and FirstTemperature.value is not null\r\n      sort by effective.earliest()\r\n  ).value as Quantity\r\n\r\ndefine function &quot;FirstHeartRate&quot;(QualifyingEncounter Encounter):\r\n  First([&quot;USCoreHeartRateProfile&quot;: &quot;Heart rate&quot;] FirstHeartBeats\r\n      where FirstHeartBeats.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\r\n        and FirstHeartBeats.value is not null\r\n      sort by effective.earliest()\r\n  ).value as Quantity\r\n\r\ndefine function &quot;FirstRespiratoryRate&quot;(QualifyingEncounter Encounter):\r\n  First([&quot;USCoreRespiratoryRateProfile&quot;: &quot;Respiratory rate&quot;] FirstRespiration\r\n      where FirstRespiration.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\r\n        and FirstRespiration.value is not null\r\n      sort by effective.earliest()\r\n  ).value as Quantity\r\n\r\ndefine &quot;Qualifying Systolic Blood Pressure Reading&quot;:\r\n  [&quot;USCoreBloodPressureProfile&quot;] BloodPressure\r\n    where BloodPressure.effective.earliest ( ) during day of &quot;Measurement Period&quot;\r\n\r\ndefine function &quot;FirstSystolicBloodPressure&quot;(QualifyingEncounter Encounter):\r\n  First(&quot;Qualifying Systolic Blood Pressure Reading&quot; SBPReading\r\n      where SBPReading.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\r\n      return singleton from(SBPReading.component SBPComponent\r\n          where SBPComponent.code ~ &quot;Systolic blood pressure&quot;\r\n          return SBPComponent.value as Quantity\r\n      )\r\n  )\r\n/* \r\ndefine function &quot;FirstSystolicBloodPressureTest&quot;(QualifyingEncounter Encounter ):\r\n  First([&quot;USCoreBloodPressureProfile&quot;: &quot;Systolic blood pressure&quot;] FirstSystolic\r\n      where FirstSystolic.effective.earliest() during QualifyingEncounter.hospitalizationWithObservation()\r\n        and FirstSystolic.value is not null\r\n      sort by effective.earliest()\r\n  ).value as Quantity\r\n*/\r\n\r\n// --------------------------------- Temporary debugging defines should go here ---------------------------------------------------\r\n\r\n</code></pre></td></tr>\n            </table>\n          </td>\n        </tr>\n        \n        \n        \n    </table>\n</div>"
  },
  "contained" : [
    {
      "resourceType" : "Parameters",
      "id" : "options",
      "parameter" : [
        {
          "name" : "translatorVersion",
          "valueString" : "3.25.0"
        },
        {
          "name" : "option",
          "valueString" : "EnableAnnotations"
        },
        {
          "name" : "option",
          "valueString" : "EnableLocators"
        },
        {
          "name" : "option",
          "valueString" : "DisableListDemotion"
        },
        {
          "name" : "option",
          "valueString" : "DisableListPromotion"
        },
        {
          "name" : "format",
          "valueString" : "JSON"
        },
        {
          "name" : "format",
          "valueString" : "XML"
        },
        {
          "name" : "analyzeDataRequirements",
          "valueBoolean" : false
        },
        {
          "name" : "collapseDataRequirements",
          "valueBoolean" : false
        },
        {
          "name" : "compatibilityLevel",
          "valueString" : "1.5"
        },
        {
          "name" : "enableCqlOnly",
          "valueBoolean" : false
        },
        {
          "name" : "errorLevel",
          "valueString" : "Info"
        },
        {
          "name" : "signatureLevel",
          "valueString" : "Overloads"
        },
        {
          "name" : "validateUnits",
          "valueBoolean" : true
        },
        {
          "name" : "verifyOnly",
          "valueBoolean" : false
        }
      ]
    }
  ],
  "extension" : [
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode",
      "valueCoding" : {
        "system" : "http://snomed.info/sct",
        "code" : "248152002",
        "display" : "Female (finding)"
      }
    },
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode",
      "valueCoding" : {
        "system" : "http://snomed.info/sct",
        "code" : "248153007",
        "display" : "Male (finding)"
      }
    },
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode",
      "valueCoding" : {
        "system" : "http://loinc.org",
        "code" : "8867-4",
        "display" : "Heart rate"
      }
    },
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode",
      "valueCoding" : {
        "system" : "http://loinc.org",
        "code" : "9279-1",
        "display" : "Respiratory rate"
      }
    },
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/cqf-directReferenceCode",
      "valueCoding" : {
        "system" : "http://loinc.org",
        "code" : "8480-6",
        "display" : "Systolic blood pressure"
      }
    },
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/cqf-cqlOptions",
      "valueReference" : {
        "reference" : "#options"
      }
    }
  ],
  "url" : "https://madie.cms.gov/Library/CMS832HHAKIFHIR",
  "identifier" : [
    {
      "use" : "official",
      "system" : "https://madie.cms.gov/login",
      "value" : "CMS832HHAKIFHIR"
    }
  ],
  "version" : "0.2.000",
  "name" : "CMS832HHAKIFHIR",
  "title" : "CMS832HHAKIFHIR",
  "status" : "active",
  "experimental" : false,
  "type" : {
    "coding" : [
      {
        "system" : "http://terminology.hl7.org/CodeSystem/library-type",
        "code" : "logic-library"
      }
    ]
  },
  "date" : "2025-05-27T15:45:19+00:00",
  "publisher" : "Centers for Medicare & Medicaid Services (CMS)",
  "description" : "CMS832HHAKIFHIR",
  "content" : [
    {
      "contentType" : "text/cql",
      "data" : "bGlicmFyeSBDTVM4MzJISEFLSUZISVIgdmVyc2lvbiAnMC4yLjAwMCcNCg0KdXNpbmcgUUlDb3JlIHZlcnNpb24gJzYuMC4wJw0KDQppbmNsdWRlIEZISVJIZWxwZXJzIHZlcnNpb24gJzQuNC4wMDAnIGNhbGxlZCBGSElSSGVscGVycw0KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNS4xLjAwMCcgY2FsbGVkIFNERQ0KaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnNC4xLjAwMCcgY2FsbGVkIENRTUNvbW1vbg0KaW5jbHVkZSBRSUNvcmVDb21tb24gdmVyc2lvbiAnNC4wLjAwMCcgY2FsbGVkIFFJQ29yZUNvbW1vbg0KaW5jbHVkZSBDdW11bGF0aXZlTWVkaWNhdGlvbkR1cmF0aW9uIHZlcnNpb24gJzUuMC4wMDAnIGNhbGxlZCBDTUQNCmluY2x1ZGUgSG9zcGl0YWxIYXJtIHZlcnNpb24gJzIuNS4wMDAnIGNhbGxlZCBIb3NwaXRhbEhhcm0NCg0KY29kZXN5c3RlbSAiU05PTUVEQ1QiOiAnaHR0cDovL3Nub21lZC5pbmZvL3NjdCcNCmNvZGVzeXN0ZW0gIkxPSU5DIjogJ2h0dHA6Ly9sb2luYy5vcmcnDQoNCnZhbHVlc2V0ICJCb2R5IHRlbXBlcmF0dXJlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTA0NS4xNTInDQp2YWx1ZXNldCAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjIxJw0KdmFsdWVzZXQgIkVtZXJnZW5jeSBEZXBhcnRtZW50IFZpc2l0IjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzg4My4zLjExNy4xLjcuMS4yOTInDQp2YWx1ZXNldCAiRW5jb3VudGVyIElucGF0aWVudCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy42NjYuNS4zMDcnDQp2YWx1ZXNldCAiR2xvbWVydWxhciBGaWx0cmF0aW9uIFJhdGUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjE3LjQwNzcuMi4yMDM4Jw0KdmFsdWVzZXQgIkhpZ2ggUmlzayBEaWFnbm9zaXMgZm9yIEFLSSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTInDQp2YWx1ZXNldCAiSGlnaCBSaXNrIFByb2NlZHVyZXMgZm9yIEFLSSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTknDQp2YWx1ZXNldCAiSG9zcGl0YWwgQmFzZWQgRGlhbHlzaXMgU2VydmljZXMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjE5OScNCnZhbHVlc2V0ICJPYnNlcnZhdGlvbiBTZXJ2aWNlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExMTEuMTQzJw0KdmFsdWVzZXQgIk9ic3RldHJpY3MgYW5kIFZURSBPYnN0ZXRyaWNzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4zMycNCnZhbHVlc2V0ICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExNDcuMTk3Jw0KDQpjb2RlICJGZW1hbGUgKGZpbmRpbmcpIjogJzI0ODE1MjAwMicgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ0ZlbWFsZScNCmNvZGUgIk1hbGUgKGZpbmRpbmcpIjogJzI0ODE1MzAwNycgZnJvbSAiU05PTUVEQ1QiIGRpc3BsYXkgJ01hbGUnDQpjb2RlICJIZWFydCByYXRlIjogJzg4NjctNCcgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ0hlYXJ0IHJhdGUnDQpjb2RlICJSZXNwaXJhdG9yeSByYXRlIjogJzkyNzktMScgZnJvbSAiTE9JTkMiIGRpc3BsYXkgJ1Jlc3BpcmF0b3J5IHJhdGUnDQpjb2RlICJTeXN0b2xpYyBibG9vZCBwcmVzc3VyZSI6ICc4NDgwLTYnIGZyb20gIkxPSU5DIiBkaXNwbGF5ICdTeXN0b2xpYyBibG9vZCBwcmVzc3VyZScNCg0KcGFyYW1ldGVyICJNZWFzdXJlbWVudCBQZXJpb2QiIEludGVydmFsPERhdGVUaW1lPg0KDQpjb250ZXh0IFBhdGllbnQNCg0KZGVmaW5lICJTREUgRXRobmljaXR5IjoNCiAgU0RFLiJTREUgRXRobmljaXR5Ig0KDQpkZWZpbmUgIlNERSBQYXllciI6DQogIFNERS4iU0RFIFBheWVyIg0KDQpkZWZpbmUgIlNERSBSYWNlIjoNCiAgU0RFLiJTREUgUmFjZSINCg0KZGVmaW5lICJTREUgU2V4IjoNCiAgU0RFLiJTREUgU2V4Ig0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQb3B1bGF0aW9uIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KZGVmaW5lICJJbml0aWFsIFBvcHVsYXRpb24iOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIg0KDQpkZWZpbmUgIkRlbm9taW5hdG9yIjoNCiAgIkluaXRpYWwgUG9wdWxhdGlvbiINCg0KZGVmaW5lICJEZW5vbWluYXRvciBFeGNsdXNpb24iOg0KICAiRW5jb3VudGVyIHdpdGggTGVzcyBUaGFuIDIgQ3JlYXRpbmluZSBSZXN1bHRzIHdpdGhpbiA0OCBIb3VycyBvZiBBcnJpdmFsIiAvLyBjbGF1c2UgMQ0KICAgIA0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBJbmRleCBlR0ZSIExlc3MgVGhhbiA2MCB3aXRoaW4gRmlyc3QgNDggSG91cnMiICAgICAvLyBjbGF1c2UgMg0KICAgIA0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCAwLjMgbWcgZEwgb3IgTW9yZSBJbmNyZWFzZSBpbiBDcmVhdGluaW5lIiAgICAgICAgICAvLyBjbGF1c2UgMw0KICAgIA0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBLaWRuZXkgRGlhbHlzaXMgU3RhcnRlZCA0OCBIb3VycyBvciBMZXNzIEFmdGVyIEFycml2YWwgd2l0aG91dCBIaWdoIENyZWF0aW5pbmUiICAvLyBjbGF1c2UgNA0KICAgIA0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBIaWdoIFJpc2sgRGlhZ25vc2lzIGZvciBBS0kiICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGF1c2UgNQ0KICAgIA0KICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBIaWdoIFJpc2sgUHJvY2VkdXJlcyBmb3IgQUtJIiAgICAgICAgICAgICAgICAgICAgICAvLyBjbGF1c2UgNiANCg0KDQpkZWZpbmUgIk51bWVyYXRvciI6DQogICJFbmNvdW50ZXIgd2l0aCAyIFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiIC8vIGNsYXVzZSAxDQogICAgDQogICAgdW5pb24gIkVuY291bnRlciB3aXRoIEtpZG5leSBEaWFseXNpcyBTdGFydGVkIE1vcmUgVGhhbiA0OCBIb3VycyBBZnRlciBBcnJpdmFsIHdpdGhvdXQgSGlnaCBDcmVhdGluaW5lIiAgIC8vIGNsYXVzZSAyDQoNCg0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdXBwb3J0aW5nIERlZmluaXRpb25zIGZvciBJbml0aWFsIFBvcHVsYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KLy8gU3VwcG9ydHMgSW5pdGlhbCBQb3B1bGF0aW9uDQovLyBVc2VkIGluIG90aGVyIGRlZmluaXRpb25zIHRocm91Z2hvdXQNCg0KDQoNCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyI6DQogICJJbnBhdGllbnQgRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSIgRW5jb3VudGVyV2l0aENyZWF0aW5pbmUNCiAgICB3aGVyZSBub3QgZXhpc3RzICggKCBFbmNvdW50ZXJXaXRoQ3JlYXRpbmluZS5lbmNvdW50ZXJEaWFnbm9zaXMgKCApICkgRW5jb3VudGVyRGlhZ25vc2lzDQogICAgICAgIHdoZXJlIEVuY291bnRlckRpYWdub3Npcy5jb2RlIGluICJPYnN0ZXRyaWNzIGFuZCBWVEUgT2JzdGV0cmljcyINCiAgICApDQoNCg0KLy8gU3VwcG9ydHMgSW5pdGlhbCBQb3B1bGF0aW9uDQoNCg0KZGVmaW5lICJJbnBhdGllbnQgRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSI6DQogIGZyb20NCiAgICAiRW5jb3VudGVyIHdpdGggQWdlIDE4IGFuZCBMZW5ndGggb2YgU3RheSA0OCBIb3VycyBvciBNb3JlIiBFbmNvdW50ZXI0OEhvdXJzLA0KICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gQ3JlYXRpbmluZVRlc3QNCiAgICBsZXQgSG9zcGl0YWxpemF0aW9uUGVyaW9kOiBFbmNvdW50ZXI0OEhvdXJzLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICksDQogICAgQ3JlYXRpbmluZVRlc3RTdGFydDogQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKQ0KICAgIHdoZXJlIENyZWF0aW5pbmVUZXN0LnZhbHVlIGlzIG5vdCBudWxsDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RTdGFydCBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uUGVyaW9kICsgNDggaG91cnMsIGVuZCBvZiBIb3NwaXRhbGl6YXRpb25QZXJpb2RdDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgcmV0dXJuIEVuY291bnRlcjQ4SG91cnMNCiAgICAgICAgICAgICAgICANCi8vIFN1cHBvcnRzIEluaXRpYWwgUG9wdWxhdGlvbg0KDQovKg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBBZ2UgMTggYW5kIExlbmd0aCBvZiBTdGF5IDQ4IEhvdXJzIG9yIE1vcmUiOg0KICBbIkVuY291bnRlciI6ICJFbmNvdW50ZXIgSW5wYXRpZW50Il0gSW5wYXRpZW50RW5jb3VudGVyDQogICAgICAgICAgICAgICAgICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5wZXJpb2QgZW5kcyBkdXJpbmcgZGF5IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiDQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kKT49IDE4DQogICAgICAgICAgICAgICAgICAgICAgICBhbmQgKCBkdXJhdGlvbiBpbiBob3VycyBvZiBJbnBhdGllbnRFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkgPj0gNDggKSovIA0KDQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBBZ2UgMTggYW5kIExlbmd0aCBvZiBTdGF5IDQ4IEhvdXJzIG9yIE1vcmUiOg0KICBbIkVuY291bnRlciI6ICJFbmNvdW50ZXIgSW5wYXRpZW50Il0gSW5wYXRpZW50RW5jb3VudGVyDQogICAgd2hlcmUgUGF0aWVudC5zZXggaW4geyAnMjQ4MTUzMDA3JywgJzI0ODE1MjAwMicgfQ0KICAgICAgYW5kIElucGF0aWVudEVuY291bnRlci5wZXJpb2QgZW5kcyBkdXJpbmcgZGF5IG9mICJNZWFzdXJlbWVudCBQZXJpb2QiDQogICAgICBhbmQgQWdlSW5ZZWFyc0F0KGRhdGUgZnJvbSBzdGFydCBvZiBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kKSA+PSAxOA0KICAgICAgYW5kICggZHVyYXRpb24gaW4gaG91cnMgb2YgSW5wYXRpZW50RW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkgPj0gNDggKQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdXBwb3J0aW5nIERlZmluaXRpb25zIGZvciBEZW5vbWluYXRvciBFeGNsdXNpb24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8vIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgMQ0KDQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBMZXNzIFRoYW4gMiBDcmVhdGluaW5lIFJlc3VsdHMgd2l0aGluIDQ4IEhvdXJzIG9mIEFycml2YWwiOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgd2hlcmUgKCBDb3VudCgiQ3JlYXRpbmluZUxhYlRlc3R3aXRoUmVzdWx0d2l0aGluRmlyc3Q0OEhvdXJzIihRdWFsaWZ5aW5nRW5jb3VudGVyKSkgPCAyICkgDQoNCi8vIERlbm9ubWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDINCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIEluZGV4IGVHRlIgTGVzcyBUaGFuIDYwIHdpdGhpbiBGaXJzdCA0OCBIb3VycyI6DQogICJNYWxlIEVuY291bnRlciB3aXRoIGVHRlIgTGVzcyBUaGFuIDYwIg0KICAgIHVuaW9uICJGZW1hbGUgRW5jb3VudGVyIHdpdGggZUdGUiBMZXNzIFRoYW4gNjAiDQoNCi8vIFN1cHBvcnRpbmcgRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSAyICAgIA0KDQoNCmRlZmluZSAiRmVtYWxlIEVuY291bnRlciB3aXRoIGVHRlIgTGVzcyBUaGFuIDYwIjoNCiAgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcg0KICAgIHdoZXJlICJGZW1hbGVlR0ZSIihRdWFsaWZ5aW5nRW5jb3VudGVyKSBpcyBub3QgbnVsbA0KICAgICAgYW5kICJGZW1hbGVlR0ZSIihRdWFsaWZ5aW5nRW5jb3VudGVyKSBhcyBEZWNpbWFsIDwgNjANCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDIgIA0KDQoNCmRlZmluZSAiTWFsZSBFbmNvdW50ZXIgd2l0aCBlR0ZSIExlc3MgVGhhbiA2MCI6DQogICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXINCiAgICB3aGVyZSAiTWFsZWVHRlIiKFF1YWxpZnlpbmdFbmNvdW50ZXIpIGlzIG5vdCBudWxsDQogICAgICBhbmQgIk1hbGVlR0ZSIihRdWFsaWZ5aW5nRW5jb3VudGVyKSBhcyBEZWNpbWFsIDwgNjANCg0KLy8gRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSAzICAoQ29hbGVzY2UgZG9lc24ndCBzZWVtIHRvIHdvcmsgYXMgaW50ZW5kZWQpDQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCAwLjMgbWcgZEwgb3IgTW9yZSBJbmNyZWFzZSBpbiBDcmVhdGluaW5lIjoNCiAgIkluY3JlYXNlIG9mIDAuMyBvciBNb3JlIFVzaW5nIExvd2VzdCBDcmVhdGluaW5lIHdpdGhpbiAyNCBIb3VycyINCiAgICB1bmlvbiAiSW5jcmVhc2Ugb2YgMC4zIG9yIE1vcmUgVXNpbmcgRmlyc3QgQ3JlYXRpbmluZSB3aXRoaW4gRmlyc3QgNDggSG91cnMiDQoNCiAgIA0KLy9kZWZpbmUgIkVuY291bnRlciB3aXRoIDAuMyBtZyBkTCBvciBNb3JlIEluY3JlYXNlIGluIENyZWF0aW5pbmUiOg0KICAvL0NvYWxlc2NlKCJJbmNyZWFzZSBvZiAwLjMgb3IgTW9yZSBVc2luZyBMb3dlc3QgQ3JlYXRpbmluZSB3aXRoaW4gMjQgSG91cnMiLCJJbmNyZWFzZSBvZiAwLjMgb3IgTW9yZSBVc2luZyBGaXJzdCBDcmVhdGluaW5lIHdpdGhpbiBGaXJzdCA0OCBIb3VycyIpDQoNCi8qDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIDAuMyBtZyBkTCBvciBNb3JlIEluY3JlYXNlIGluIENyZWF0aW5pbmUiOg0KICBjYXNlDQogICAgd2hlbiAiSW5jcmVhc2Ugb2YgMC4zIG9yIE1vcmUgVXNpbmcgTG93ZXN0IENyZWF0aW5pbmUgd2l0aGluIDI0IEhvdXJzIiBpcyBub3QgbnVsbA0KICAgICAgdGhlbiAiSW5jcmVhc2Ugb2YgMC4zIG9yIE1vcmUgVXNpbmcgTG93ZXN0IENyZWF0aW5pbmUgd2l0aGluIDI0IEhvdXJzIg0KICAgIHdoZW4gIkluY3JlYXNlIG9mIDAuMyBvciBNb3JlIFVzaW5nIEZpcnN0IENyZWF0aW5pbmUgd2l0aGluIEZpcnN0IDQ4IEhvdXJzIiBpcyBub3QgbnVsbA0KICAgICAgdGhlbiAiSW5jcmVhc2Ugb2YgMC4zIG9yIE1vcmUgVXNpbmcgRmlyc3QgQ3JlYXRpbmluZSB3aXRoaW4gRmlyc3QgNDggSG91cnMiDQogICAgZWxzZSBudWxsDQogIGVuZCAqLw0KDQogIA0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDMNCg0KDQoNCg0KDQpkZWZpbmUgIkluY3JlYXNlIG9mIDAuMyBvciBNb3JlIFVzaW5nIExvd2VzdCBDcmVhdGluaW5lIHdpdGhpbiAyNCBIb3VycyI6DQogIGZyb20NCiAgICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLA0KICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LA0KICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHQNCiAgICBsZXQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0VGltZTogSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksDQogICAgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lOiBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdC5lZmZlY3RpdmUuZWFybGllc3QgKCApLA0KICAgIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkNCiAgICB3aGVyZSBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgICBhbmQgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHQuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgICBhbmQgKCAoIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ICkgLSAoIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdC52YWx1ZSBhcyBRdWFudGl0eSApICkgPiAwLjI5OSAnbWcvZEwnDQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LnZhbHVlID0gIkxvd2VzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlcikNCiAgICAgIGFuZCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBJbnRlcnZhbFtTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgLSA0OCBob3VycywgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lXQ0KICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kDQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMjQgaG91cnNdDQogICAgICBhbmQgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgICAgYW5kIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnNdDQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmlkICE9IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmlkDQogICAgcmV0dXJuIFF1YWxpZnlpbmdFbmNvdW50ZXINCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDMgICAgICAgICAgICANCg0KDQpkZWZpbmUgIkluY3JlYXNlIG9mIDAuMyBvciBNb3JlIFVzaW5nIEZpcnN0IENyZWF0aW5pbmUgd2l0aGluIEZpcnN0IDQ4IEhvdXJzIjoNCiAgZnJvbQ0KICAgICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQsDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdA0KICAgIGxldCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lOiBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSwNCiAgICBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWU6IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksDQogICAgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQ0KICAgIHdoZXJlIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgIGFuZCBTdWJzZXF1ZW50Q3JlYXRpbmluZUxhYlJlc3VsdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgIGFuZCAoICggU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHQudmFsdWUgYXMgUXVhbnRpdHkgKSAtICggSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ICkgKSA+IDAuMjk5ICdtZy9kTCcNCiAgICAgIGFuZCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHQudmFsdWUgYXMgUXVhbnRpdHkgPSBzaW5nbGV0b24gZnJvbSAiRWFybGllc3RTZXJ1bUNyZWF0aW5pbmVSZXN1bHQiKFF1YWxpZnlpbmdFbmNvdW50ZXIpDQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIC0gNDggaG91cnMsIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZV0NCiAgICAgIGFuZCBJbmRleENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgICAgYW5kIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnNdDQogICAgICBhbmQgU3Vic2VxdWVudENyZWF0aW5pbmVMYWJSZXN1bHRUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgICAgYW5kIEluZGV4Q3JlYXRpbmluZUxhYlJlc3VsdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kLCBzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzXQ0KICAgICAgYW5kIFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0VGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnNdDQogICAgICBhbmQgSW5kZXhDcmVhdGluaW5lTGFiUmVzdWx0LmlkICE9IFN1YnNlcXVlbnRDcmVhdGluaW5lTGFiUmVzdWx0LmlkDQogICAgcmV0dXJuIFF1YWxpZnlpbmdFbmNvdW50ZXINCiANCi8vIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgNA0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgNDggSG91cnMgb3IgTGVzcyBBZnRlciBBcnJpdmFsIHdpdGhvdXQgSGlnaCBDcmVhdGluaW5lIjoNCiAgIkVuY291bnRlciB3aXRoIEtpZG5leSBEaWFseXNpcyBTdGFydGVkIDQ4IEhvdXJzIG9yIExlc3MgQWZ0ZXIgQXJyaXZhbCIgRW5jb3VudGVyV2l0aEtpZG5leURpYWx5c2lzNDhIb3Vyc09yQWZ0ZXINCiAgICB3aGVyZSBub3QgKCBleGlzdHMgKCAiRW5jb3VudGVyIHdpdGggMiBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIiBFbmNvdW50ZXJXaXRoSGlnaENyZWF0aW5pbmUNCiAgICAgICAgICB3aGVyZSAoIEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZS5wZXJpb2QgaW5jbHVkZXMgRW5jb3VudGVyV2l0aEtpZG5leURpYWx5c2lzNDhIb3Vyc09yQWZ0ZXIucGVyaW9kICkNCiAgICAgICkNCiAgICApDQogDQovLyBTdXBwb3J0aW5nIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgNA0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgNDggSG91cnMgb3IgTGVzcyBBZnRlciBBcnJpdmFsIjoNCiAgZnJvbQ0KICAgIFsiUHJvY2VkdXJlIjogIkhvc3BpdGFsIEJhc2VkIERpYWx5c2lzIFNlcnZpY2VzIl0gRGlhbHlzaXMsDQogICAgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcg0KICAgIGxldCBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZDogUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApDQogICAgd2hlcmUgRGlhbHlzaXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnNdDQogICAgICBhbmQgRGlhbHlzaXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QNCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcg0KDQoNCi8vIFN1cHBvcnRpbmcgRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSA0DQovLyBBbHNvIFN1cHBvcnRpbmcgTnVtZXJhdG9yIGNsYXVzZSAxDQoNCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIDIgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSI6DQogIGZyb20NCiAgICAiRW5jb3VudGVyIHdpdGggMS41IFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiIEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZSwNCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIEhpZ2hDcmVhdGluaW5lVGVzdCwNCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIExvd0NyZWF0aW5pbmVUZXN0DQogICAgbGV0IExvd0NyZWF0aW5pbmVUZXN0VGltZTogTG93Q3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSwNCiAgICBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lOiBIaWdoQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSwNCiAgICBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZDogRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkNCiAgICB3aGVyZSAoIEhpZ2hDcmVhdGluaW5lVGVzdC52YWx1ZSA+ICJTZXJ1bSBDcmVhdGluaW5lIE5vcm1hbCIgKQ0KICAgICAgYW5kIExvd0NyZWF0aW5pbmVUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQ0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3QudmFsdWUgPSAiSGlnaGVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lKQ0KICAgICAgYW5kIExvd0NyZWF0aW5pbmVUZXN0LnZhbHVlID0gIkxvd2VzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lKQ0KICAgICAgYW5kICggSGlnaENyZWF0aW5pbmVUZXN0LnZhbHVlIGFzIFF1YW50aXR5ICkgPj0gKCBMb3dDcmVhdGluaW5lVGVzdC52YWx1ZSBhcyBRdWFudGl0eSApDQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3RUaW1lIDcgZGF5cyBvciBsZXNzIGJlZm9yZSBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lDQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnMsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMzAgZGF5c10NCiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgIHJldHVybiBFbmNvdW50ZXJXaXRoSGlnaENyZWF0aW5pbmUNCg0KDQoNCi8vIFN1cHBvcnRzICJFbmNvdW50ZXIgd2l0aCAyIFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiDQovLyBTdXBwb3J0cyAiRW5jb3VudGVyIHdpdGggMS41IFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiDQoNCg0KDQpkZWZpbmUgIlNlcnVtIENyZWF0aW5pbmUgTm9ybWFsIjoNCiAgaWYgKCBQYXRpZW50LnNleCA9ICcyNDgxNTIwMDInICkgdGhlbiAxLjAyICdtZy9kTCcgDQogICAgZWxzZSAxLjE4ICdtZy9kTCcgDQoNCg0KLy8gRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSA1DQoNCg0KZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIaWdoIFJpc2sgRGlhZ25vc2lzIGZvciBBS0kiOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgd2hlcmUgZXhpc3RzICggKCBRdWFsaWZ5aW5nRW5jb3VudGVyLmVuY291bnRlckRpYWdub3NpcyAoICkgKSBFbmNvdW50ZXJEaWFnbm9zaXMNCiAgICAgICAgd2hlcmUgKCBFbmNvdW50ZXJEaWFnbm9zaXMuY29kZSBpbiAiSGlnaCBSaXNrIERpYWdub3NpcyBmb3IgQUtJIiApDQogICAgKQ0KDQoNCi8vIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgNg0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggSGlnaCBSaXNrIFByb2NlZHVyZXMgZm9yIEFLSSI6DQogICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXINCiAgICB3aXRoIFsiUHJvY2VkdXJlIjogIkhpZ2ggUmlzayBQcm9jZWR1cmVzIGZvciBBS0kiXSBIaWdoUmlza1Byb2NlZHVyZXMNCiAgICAgIHN1Y2ggdGhhdCBIaWdoUmlza1Byb2NlZHVyZXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApDQoNCg0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3VwcG9ydGluZyBEZWZpbml0aW9ucyBmb3IgTnVtZXJhdG9yICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQovLyBOdW1lcmF0b3IgY2xhdXNlIDE6ICBTZWUgIkVuY291bnRlciB3aXRoIDIgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSINCg0KLy8gTnVtZXJhdG9yIHVuaW9uIGNsYXVzZSAyDQoNCg0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgTW9yZSBUaGFuIDQ4IEhvdXJzIEFmdGVyIEFycml2YWwgd2l0aG91dCBIaWdoIENyZWF0aW5pbmUiOg0KICAiRW5jb3VudGVyIHdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgTW9yZSBUaGFuIDQ4IEhvdXJzIEFmdGVyIEFycml2YWwiIEVuY291bnRlcldpdGhEaWFseXNpc0FmdGVyNDhIb3Vycw0KICAgIHdoZXJlIG5vdCAoIGV4aXN0cyAoICJFbmNvdW50ZXIgd2l0aCAyIFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiIEVuY291bnRlcldpdGhIaWdoQ3JlYXRpbmluZQ0KICAgICAgICAgIHdoZXJlICggRW5jb3VudGVyV2l0aEhpZ2hDcmVhdGluaW5lLnBlcmlvZCBpbmNsdWRlcyBFbmNvdW50ZXJXaXRoRGlhbHlzaXNBZnRlcjQ4SG91cnMucGVyaW9kICkNCiAgICAgICkNCiAgICApDQoNCi8vIFN1cHBvcnRzIE51bWVyYXRvciB1bmlvbiBjbGF1c2UgMg0KDQoNCmRlZmluZSAiRW5jb3VudGVyIHdpdGggS2lkbmV5IERpYWx5c2lzIFN0YXJ0ZWQgTW9yZSBUaGFuIDQ4IEhvdXJzIEFmdGVyIEFycml2YWwiOg0KICBmcm9tDQogICAgWyJQcm9jZWR1cmUiOiAiSG9zcGl0YWwgQmFzZWQgRGlhbHlzaXMgU2VydmljZXMiXSBEaWFseXNpcywNCiAgICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgbGV0IEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkNCiAgICB3aGVyZSBEaWFseXNpcy5wZXJmb3JtZWQudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZCArIDQ4IGhvdXJzLCBlbmQgb2YgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2RdDQogICAgICBhbmQgRGlhbHlzaXMucGVyZm9ybWVkLnRvSW50ZXJ2YWwgKCApIHN0YXJ0cyBkdXJpbmcgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2QNCiAgICByZXR1cm4gUXVhbGlmeWluZ0VuY291bnRlcg0KDQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN1cHBvcnRpbmcgRGVmaW5pdGlvbnMgZm9yIENyZWF0aW5pbmUgY2FsY3VsYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8vIFVzZWQgdGhyb3VnaG91dCBjcmVhdGluaW5lIGZ1bmN0aW9ucyBhbmQgZGVmaW5lcyAgDQoNCg0KDQpkZWZpbmUgIlF1YWxpZnlpbmcgQ3JlYXRpbmluZSBMYWIgUmVzdWx0IGJ5IFRpbWUiOg0KICBmcm9tDQogICAgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlciwNCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJDcmVhdGluaW5lIE1hc3MgUGVyIFZvbHVtZSJdIENyZWF0aW5pbmVUZXN0QnlUaW1lDQogICAgbGV0IENyRW5jSWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsDQogICAgQ3JIb3NwUGVyaW9kOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICksDQogICAgQ3JMYWJJZDogQ3JlYXRpbmluZVRlc3RCeVRpbWUuaWQsDQogICAgQ3JUaW1lOiBDcmVhdGluaW5lVGVzdEJ5VGltZS5lZmZlY3RpdmUuZWFybGllc3QgKCApLA0KICAgIENyVGltZUlzc3VlZDogQ3JlYXRpbmluZVRlc3RCeVRpbWUuaXNzdWVkLA0KICAgIENyUmVzdWx0OiBDcmVhdGluaW5lVGVzdEJ5VGltZS52YWx1ZSBhcyBRdWFudGl0eSwNCiAgICBDclJlc3VsdFZhbHVlOiBDclJlc3VsdC52YWx1ZSwNCiAgICBDclJlc3VsdFVuaXQ6IENyUmVzdWx0LnVuaXQNCiAgICB3aGVyZSBDclRpbWUgZHVyaW5nIENySG9zcFBlcmlvZA0KICAgICAgYW5kIENyZWF0aW5pbmVUZXN0QnlUaW1lLmlzTGFib3JhdG9yeSAoICkNCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdEJ5VGltZS5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICAgIGFuZCBDclJlc3VsdFVuaXQgPSAnbWcvZEwnDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUudmFsdWUgaXMgbm90IG51bGwNCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdEJ5VGltZS52YWx1ZSBhcyBRdWFudGl0eSA+IDAgJ21nL2RMJw0KICAgIHJldHVybiBUdXBsZSB7DQogICAgICBDckVuY0luUHRJZDogQ3JFbmNJZCwNCiAgICAgIENySG9zcGl0YWxpemF0aW9uOiBDckhvc3BQZXJpb2QsDQogICAgICBDckxhYk9ic0lkOiBDckxhYklkLA0KLy8gICAgICAgICAgICAgICAgICAgIExhYkNhdGVnb3J5OiBDcmVhdGluaW5lVGVzdEJ5UXVhbnRpdHkuaXNMYWJvcmF0b3J5KCksDQogICAgICANCiAgICAgIENyTGFiT2JzQ2F0ZWdvcnk6IGlmIENyZWF0aW5pbmVUZXN0QnlUaW1lLmlzTGFib3JhdG9yeSAoICkgdGhlbiAnbGFib3JhdG9yeScgDQogICAgICAgIGVsc2UgQ3JlYXRpbmluZVRlc3RCeVRpbWUuaXNMYWJvcmF0b3J5ICggKSwNCiAgICAgIENyTGFiT2JzU3RhdHVzOiBDcmVhdGluaW5lVGVzdEJ5VGltZS5zdGF0dXMsDQogICAgICBDckxhYlJlc3VsdDogQ3JSZXN1bHQsDQogICAgICBDckxhYlJlc3VsdFVuaXQ6IENyUmVzdWx0VW5pdCwNCiAgICAgIENyTGFiUmVzdWx0VmFsdWU6IENyUmVzdWx0VmFsdWUsDQogICAgICBDckxhYlRpbWU6IENyVGltZSwNCiAgICAgIENyTGFiVGltZUlzc3VlZDogQ3JUaW1lSXNzdWVkDQogICAgfQ0KICAgIHNvcnQgYnkgQ3JMYWJUaW1lICANCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDQNCi8vIFN1cHBvcnRpbmcgTnVtZXJhdG9yICAgICAgICAgICAgICAgDQoNCg0KDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIDEuNSBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIjoNCiAgZnJvbQ0KICAgICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBIaWdoQ3JlYXRpbmluZVRlc3QsDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBMb3dDcmVhdGluaW5lVGVzdA0KICAgIGxldCBMb3dDcmVhdGluaW5lVGVzdFRpbWU6IExvd0NyZWF0aW5pbmVUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksDQogICAgSGlnaENyZWF0aW5pbmVUZXN0VGltZTogSGlnaENyZWF0aW5pbmVUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksDQogICAgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQ0KICAgIHdoZXJlICggSGlnaENyZWF0aW5pbmVUZXN0LnZhbHVlID4gIlNlcnVtIENyZWF0aW5pbmUgTm9ybWFsIiApDQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgICBhbmQgSGlnaENyZWF0aW5pbmVUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQ0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdC52YWx1ZSA9ICJIaWdoZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0IihRdWFsaWZ5aW5nRW5jb3VudGVyKQ0KICAgICAgYW5kIExvd0NyZWF0aW5pbmVUZXN0LnZhbHVlID0gIkxvd2VzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlcikNCiAgICAgIGFuZCAiMS41SW5jcmVhc2VJbkNyZWF0aW5pbmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpID49IExvd0NyZWF0aW5pbmVUZXN0LnZhbHVlDQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3RUaW1lIDcgZGF5cyBvciBsZXNzIGJlZm9yZSBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lDQogICAgICBhbmQgTG93Q3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgICAgYW5kIEhpZ2hDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnMsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMzAgZGF5c10NCiAgICAgIGFuZCBIaWdoQ3JlYXRpbmluZVRlc3RUaW1lIGR1cmluZyBIb3NwaXRhbFdpdGhPYnNlcnZhdGlvblBlcmlvZA0KICAgIHJldHVybiBRdWFsaWZ5aW5nRW5jb3VudGVyDQoNCi8qDQpkZWZpbmUgIkVuY291bnRlciB3aXRoIDEuNSBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIjoNCiAgZnJvbQ0KICAgICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXIsDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBDcmVhdGluaW5lVGVzdA0KICBsZXQgDQogICAgTG93ZXN0Q3JlYXRpbmluZVRlc3RXaXRoaW43RGF5c1ByaW9yOiAiTG93ZXN0U2VydW1DcmVhdGluaW5lV2l0aGluN0RheXNQcmlvciIoUXVhbGlmeWluZ0VuY291bnRlciwgQ3JlYXRpbmluZVRlc3QpLA0KICAgIENyZWF0aW5pbmVUZXN0VGltZTogQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0KCksDQogICAgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkNCiAgd2hlcmUgDQogICAgQ3JlYXRpbmluZVRlc3QudmFsdWUgPj0gTG93ZXN0Q3JlYXRpbmluZVRlc3RXaXRoaW43RGF5c1ByaW9yICogMS41DQogICAgYW5kIENyZWF0aW5pbmVUZXN0LnZhbHVlID4gIlNlcnVtIENyZWF0aW5pbmUgTm9ybWFsIg0KICAgIGFuZCBDcmVhdGluaW5lVGVzdFRpbWUgZHVyaW5nIEludGVydmFsW3N0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgNDggaG91cnMsIHN0YXJ0IG9mIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uUGVyaW9kICsgMzAgZGF5c10NCiAgcmV0dXJuIFF1YWxpZnlpbmdFbmNvdW50ZXIqLw0KICAgICAgICAgICAgDQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN1cHBvcnRpbmcgRnVuY3Rpb25zICBmb3IgQ3JlYXRpbmluZSBjYWxjdWxhdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCi8vIFN1cHBvcnRzIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgMQ0KDQoNCg0KDQpkZWZpbmUgZnVuY3Rpb24gIkNyZWF0aW5pbmVMYWJUZXN0d2l0aFJlc3VsdHdpdGhpbkZpcnN0NDhIb3VycyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBmcm9tDQogICAgWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiQ3JlYXRpbmluZSBNYXNzIFBlciBWb2x1bWUiXSBDcmVhdGluaW5lVGVzdA0KICAgIHdoZXJlIENyZWF0aW5pbmVUZXN0LnZhbHVlIGlzIG5vdCBudWxsDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLCBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkgKyA0OCBob3Vyc10NCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkNCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0NCiAgICByZXR1cm4gQ3JlYXRpbmluZVRlc3QNCg0KLy8gZUdGUiBmdW5jdGlvbnMgcmV0dXJuIGFzIGRlY2ltYWwgdmFsdWUgcmF0aGVyIHRoYW4gUXVhbnRpdHkNCi8vIFN1cHBvcnRzIERlbm9taW5hdG9yIEV4Y2x1c2lvbiBjbGF1c2UgMg0KLy8gU3VwcG9ydHMgcmlzayB2YXJpYWJsZSAiUmlzayBWYXJpYWJsZSBFc3RpbWF0ZWQgR2xvbWVydWxhciBGaWx0cmF0aW9uIFJhdGUgZm9yIEZlbWFsZXMiDQoNCg0KDQoNCmRlZmluZSBmdW5jdGlvbiAiRmVtYWxlZUdGUiIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBpZiBQYXRpZW50LnNleCA9ICcyNDgxNTIwMDInIHRoZW4gKCAxNDIgKiBNaW4oeygiSW5kZXhDcmVhdGluaW5lIihRdWFsaWZ5aW5nRW5jb3VudGVyKS52YWx1ZSAvIDAuNyksIDEgfSkgXiAoIC0gMC4yNDEgKSAqIE1heCh7KCJJbmRleENyZWF0aW5pbmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpLnZhbHVlIC8gMC43KSwgMSB9KSBeICggLSAxLjIwMCApICogMC45OTM4IF4gKCBBZ2VJblllYXJzQXQoc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKSkgKSAqIDEuMDEyICkgDQogICAgZWxzZSBudWxsDQoNCi8vIGVHRlIgZnVuY3Rpb25zIHJldHVybiBhcyBkZWNpbWFsIHZhbHVlIHJhdGhlciB0aGFuIFF1YW50aXR5DQovLyBTdXBwb3J0cyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDINCi8vIFN1cHBvcnRzIHJpc2sgdmFyaWFibGUgIlJpc2sgVmFyaWFibGUgRXN0aW1hdGVkIEdsb21lcnVsYXIgRmlsdHJhdGlvbiBSYXRlIGZvciBGZW1hbGVzIg0KDQoNCg0KDQpkZWZpbmUgZnVuY3Rpb24gIk1hbGVlR0ZSIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogIGlmIFBhdGllbnQuc2V4ID0gJzI0ODE1MzAwNycgdGhlbiAoIDE0MiAqIE1pbih7KCJJbmRleENyZWF0aW5pbmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpLnZhbHVlIC8gMC45KSwgMSB9KSBeICggLSAwLjMwMiApICogTWF4KHsoIkluZGV4Q3JlYXRpbmluZSIoUXVhbGlmeWluZ0VuY291bnRlcikudmFsdWUgLyAwLjkpLCAxIH0pIF4gKCAtIDEuMjAwICkgKiAwLjk5MzggXiAoIEFnZUluWWVhcnNBdChzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpKSApICkgDQogICAgZWxzZSBudWxsDQoNCg0KLy8gVXNlZCBpbiBHRlIgY2FsY3VsYXRpb25zLCBhYm92ZQ0KDQoNCmRlZmluZSBmdW5jdGlvbiAiSW5kZXhDcmVhdGluaW5lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogIENvYWxlc2NlKCJMb3dlc3RTZXJ1bUNyZWF0aW5pbmVJbjI0SG91cnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIpLCBzaW5nbGV0b24gZnJvbSAiRmlyc3RTZXJ1bUNyZWF0aW5pbmVJbjQ4SG91cnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIpKSAgDQoNCi8vIFN1cHBvcnRzIEluZGV4Q3JlYXRpbmluZSBmdW5jdGlvbiAgDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJMb3dlc3RTZXJ1bUNyZWF0aW5pbmVJbjI0SG91cnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgTWluKChmcm9tDQogICAgICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBieSBUaW1lIiBMYWJUZXN0c0xvdw0KICAgICAgICBsZXQgTGFiUmVzdWx0OiBMYWJUZXN0c0xvdy5DckxhYlJlc3VsdA0KICAgICAgICB3aGVyZSBMYWJUZXN0c0xvdy5DckVuY0luUHRJZCA9IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQNCiAgICAgICAgICBhbmQgTGFiVGVzdHNMb3cuQ3JMYWJUaW1lIGR1cmluZyBJbnRlcnZhbFtzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpLCBzdGFydCBvZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpICsgMjQgaG91cnNdDQogICAgKS5DckxhYlJlc3VsdA0KICApIA0KDQovLyBGaW5kIHJlc3VsdCBmcm9tIGVhcmxpZXN0IHRpbWUgaW4gNDggaHJzDQovLyBTdXBwb3J0cyBJbmRleENyZWF0aW5pbmUgZnVuY3Rpb24NCg0KDQoNCmRlZmluZSBmdW5jdGlvbiAiRmlyc3RTZXJ1bUNyZWF0aW5pbmVJbjQ4SG91cnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgZnJvbQ0KICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBieSBUaW1lIiBMYWJUZXN0cw0KICAgIGxldCBMYWJSZXN1bHQ6IExhYlRlc3RzLkNyTGFiUmVzdWx0DQogICAgd2hlcmUgKCAiRWFybGllc3RTZXJ1bUNyZWF0aW5pbmVUaW1lSW40OEhvdXJzIihRdWFsaWZ5aW5nRW5jb3VudGVyKSA9IExhYlRlc3RzLkNyTGFiVGltZSApDQogICAgcmV0dXJuIExhYlJlc3VsdCBhcyBRdWFudGl0eQ0KDQoNCi8vIEZpbmQgZWFybGllc3QgdGltZSBpbiA0OCBocnMNCi8vIFN1cHBvcnRzIEZpcnN0U2VydW1DcmVhdGluaW5lSW40OEhvdXJzIGZ1bmN0aW9uDQoNCg0KDQpkZWZpbmUgZnVuY3Rpb24gIkVhcmxpZXN0U2VydW1DcmVhdGluaW5lVGltZUluNDhIb3VycyIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICAoIE1pbigoZnJvbQ0KICAgICAgICAgICJRdWFsaWZ5aW5nIENyZWF0aW5pbmUgTGFiIFJlc3VsdCBieSBUaW1lIiBMYWJUZXN0czQ4DQogICAgICAgICAgbGV0IExhYlJlc3VsdDQ4OiBMYWJUZXN0czQ4LkNyTGFiUmVzdWx0DQogICAgICAgICAgd2hlcmUgTGFiVGVzdHM0OC5DckVuY0luUHRJZCA9IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQNCiAgICAgICAgICAgIGFuZCBMYWJUZXN0czQ4LkNyTGFiVGltZSBkdXJpbmcgSW50ZXJ2YWxbc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKSwgc3RhcnQgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKSArIDQ4IGhvdXJzXQ0KICAgICAgKS5DckxhYlRpbWUNCiAgICApDQogICkNCg0KLy8gU3VwcG9ydHMgRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSAzDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJFYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBmcm9tDQogICAgIlF1YWxpZnlpbmcgQ3JlYXRpbmluZSBMYWIgUmVzdWx0IGJ5IFRpbWUiIExhYlRlc3RzDQogICAgbGV0IExhYlJlc3VsdDogTGFiVGVzdHMuQ3JMYWJSZXN1bHQNCiAgICB3aGVyZSAoICJFYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVRpbWUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpID0gTGFiVGVzdHMuQ3JMYWJUaW1lICkNCiAgICByZXR1cm4gTGFiUmVzdWx0IGFzIFF1YW50aXR5DQoNCi8vICBTdXBwb3J0cyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDMgdmlhICJFYXJsaWVzdFNlcnVtQ3JlYXRpbmluZVJlc3VsdCIgZnVuY3Rpb24gIA0KDQoNCmRlZmluZSBmdW5jdGlvbiAiRWFybGllc3RTZXJ1bUNyZWF0aW5pbmVUaW1lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogICggTWluKChmcm9tDQogICAgICAgICAgIlF1YWxpZnlpbmcgQ3JlYXRpbmluZSBMYWIgUmVzdWx0IGJ5IFRpbWUiIExhYlRlc3RzRWFybHkNCiAgICAgICAgICBsZXQgTGFiUmVzdWx0RWFybHk6IExhYlRlc3RzRWFybHkuQ3JMYWJSZXN1bHQNCiAgICAgICAgICB3aGVyZSBMYWJUZXN0c0Vhcmx5LkNyRW5jSW5QdElkID0gUXVhbGlmeWluZ0VuY291bnRlci5pZA0KICAgICAgKS5DckxhYlRpbWUNCiAgICApDQogICkNCg0KLy8gTm90IHVzZWQgYW55d2hlcmUNCg0KDQpkZWZpbmUgZnVuY3Rpb24gIlNlcnVtQ3JlYXRpbmluZVNlcXVlbmNlYnlUaW1lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkNyZWF0aW5pbmUgTWFzcyBQZXIgVm9sdW1lIl0gQ3JlYXRpbmluZVRlc3RCeVRpbWUNCiAgICBsZXQgSG9zcGl0YWxXaXRoT2JzZXJ2YXRpb246IFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uICggKQ0KICAgIHdoZXJlIENyZWF0aW5pbmVUZXN0QnlUaW1lLmVmZmVjdGl2ZS5lYXJsaWVzdCAoICkgZHVyaW5nIEhvc3BpdGFsV2l0aE9ic2VydmF0aW9uDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUudmFsdWUgaXMgbm90IG51bGwNCiAgICAgIGFuZCBDcmVhdGluaW5lVGVzdEJ5VGltZS5pc0xhYm9yYXRvcnkgKCApDQogICAgICBhbmQgQ3JlYXRpbmluZVRlc3RCeVRpbWUuc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9DQogICAgcmV0dXJuIENyZWF0aW5pbmVUZXN0QnlUaW1lDQoNCi8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdvcmsgd2l0aCBDciByZXN1bHQgYXMgUXVhbnRpdHkgKG5vdCBkZWNpbWFsLCBidXQgUXVhbnRpdHkgdmFsdWUgaXMgZGVjaW1hbCkNCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDQgdmlhICJFbmNvdW50ZXIgd2l0aCAyIFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiDQovLyBTdXBwb3J0aW5nIE51bWVyYXRvciB2aWEgIkVuY291bnRlciB3aXRoIDIgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSINCg0KDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJIaWdoZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0IihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogICggTWF4KChmcm9tDQogICAgICAgICAgIlF1YWxpZnlpbmcgQ3JlYXRpbmluZSBMYWIgUmVzdWx0IGJ5IFRpbWUiIExhYlRlc3RzDQogICAgICAgICAgbGV0IExhYlJlc3VsdDogTGFiVGVzdHMuQ3JMYWJSZXN1bHQNCiAgICAgICAgICB3aGVyZSBMYWJUZXN0cy5DckVuY0luUHRJZCA9IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQNCiAgICAgICkuQ3JMYWJSZXN1bHQNCiAgICApDQogICkNCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDQgdmlhICJFbmNvdW50ZXIgd2l0aCAxLjUgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSINCi8vIFN1cHBvcnRpbmcgTnVtZXJhdG9yICB2aWEgIkVuY291bnRlciB3aXRoIDEuNSBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIiAgICAgICAgICAgICANCg0KDQoNCmRlZmluZSBmdW5jdGlvbiAiMS41SW5jcmVhc2VJbkNyZWF0aW5pbmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgIkhpZ2hlc3RTZXJ1bUNyZWF0aW5pbmVSZXN1bHQiKFF1YWxpZnlpbmdFbmNvdW50ZXIpIC8gMS41DQoNCi8vIFN1cHBvcnRpbmcgRGVub21pbmF0b3IgRXhjbHVzaW9uIGNsYXVzZSA0IHZpYSAiRW5jb3VudGVyIHdpdGggMS41IFRpbWVzIFNlcnVtIENyZWF0aW5pbmUgSW5jcmVhc2UiDQovLyBTdXBwb3J0aW5nIE51bWVyYXRvciAgdmlhICJFbmNvdW50ZXIgd2l0aCAxLjUgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSIgICAgICAgICAgICAgDQoNCg0KDQpkZWZpbmUgZnVuY3Rpb24gIjIuMEluY3JlYXNlSW5DcmVhdGluaW5lIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogICJIaWdoZXN0U2VydW1DcmVhdGluaW5lUmVzdWx0IihRdWFsaWZ5aW5nRW5jb3VudGVyKSAvIDINCg0KLy8gU3VwcG9ydGluZyBEZW5vbWluYXRvciBFeGNsdXNpb24gY2xhdXNlIDMgdmlhICJJbmNyZWFzZSBvZiAwLjMgb3IgTW9yZSBVc2luZyBMb3dlc3QgQ3JlYXRpbmluZSB3aXRoaW4gMjQgSG91cnMiDQovLyBhbmQgY2xhdXNlIDQgdmlhICJFbmNvdW50ZXIgd2l0aCAxLjUgVGltZXMgU2VydW0gQ3JlYXRpbmluZSBJbmNyZWFzZSINCi8vIFN1cHBvcnRpbmcgTnVtZXJhdG9yICB2aWEgIkVuY291bnRlciB3aXRoIDEuNSBUaW1lcyBTZXJ1bSBDcmVhdGluaW5lIEluY3JlYXNlIiAgICAgICAgICAgICANCg0KDQoNCg0KZGVmaW5lIGZ1bmN0aW9uICJMb3dlc3RTZXJ1bUNyZWF0aW5pbmVSZXN1bHQiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgKCBNaW4oKGZyb20NCiAgICAgICAgICAiUXVhbGlmeWluZyBDcmVhdGluaW5lIExhYiBSZXN1bHQgYnkgVGltZSIgTGFiVGVzdHMNCiAgICAgICAgICBsZXQgTGFiUmVzdWx0OiBMYWJUZXN0cy5DckxhYlJlc3VsdA0KICAgICAgICAgIHdoZXJlIExhYlRlc3RzLkNyRW5jSW5QdElkID0gUXVhbGlmeWluZ0VuY291bnRlci5pZA0KICAgICAgKS5DckxhYlJlc3VsdA0KICAgICkNCiAgKQ0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSaXNrIFZhcmlhYmxlIERlZmluaXRpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFc3RpbWF0ZWQgR2xvbWVydWxhciBGaWx0cmF0aW9uIFJhdGUgZm9yIEZlbWFsZXMiOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgcmV0dXJuIFR1cGxlIHsNCiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLA0KICAgICAgZUdGUjogIkZlbWFsZWVHRlIiKFF1YWxpZnlpbmdFbmNvdW50ZXIpDQogICAgfQ0KDQpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRXN0aW1hdGVkIEdsb21lcnVsYXIgRmlsdHJhdGlvbiBSYXRlIGZvciBNYWxlcyI6DQogICJFbmNvdW50ZXIgd2l0aCBDcmVhdGluaW5lIGFuZCB3aXRob3V0IE9ic3RldHJpY2FsIENvbmRpdGlvbnMiIFF1YWxpZnlpbmdFbmNvdW50ZXINCiAgICByZXR1cm4gVHVwbGUgew0KICAgICAgZW5jb3VudGVySWQ6IFF1YWxpZnlpbmdFbmNvdW50ZXIuaWQsDQogICAgICBlR0ZSOiAiTWFsZWVHRlIiKFF1YWxpZnlpbmdFbmNvdW50ZXIpDQogICAgfQ0KDQpkZWZpbmUgIlJpc2sgVmFyaWFibGUgQWxsIEVuY291bnRlciBEaWFnbm9zZXMgd2l0aCBQT0EgSW5kaWNhdGlvbiI6DQogIGZyb20NCiAgICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyLA0KICAgIFtDbGFpbV0gY2xhaW0NCiAgICB3aGVyZSBjbGFpbS5zdGF0dXMgPSAnYWN0aXZlJw0KICAgICAgYW5kIGNsYWltLnVzZSA9ICdjbGFpbScNCiAgICAgIGFuZCBleGlzdHMgKCBjbGFpbS5pdGVtIEkNCiAgICAgICAgICB3aGVyZSBJLmVuY291bnRlci5yZWZlcmVuY2VzICggUXVhbGlmeWluZ0VuY291bnRlciApDQogICAgICAgICAgICBhbmQgZXhpc3RzICggY2xhaW0uZGlhZ25vc2lzIEQNCiAgICAgICAgICAgICAgICB3aGVyZSBELnNlcXVlbmNlIGluIGNsYWltLml0ZW0uZGlhZ25vc2lzU2VxdWVuY2UNCiAgICAgICAgICAgICAgICAgIGFuZCBELm9uQWRtaXNzaW9uIGluICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCINCiAgICAgICAgICAgICkNCiAgICAgICkNCg0KZGVmaW5lICJSaXNrIFZhcmlhYmxlIEZpcnN0IEhlYXJ0IFJhdGUgaW4gRW5jb3VudGVyIjoNCiAgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcg0KICAgIHJldHVybiBUdXBsZSB7DQogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwNCiAgICAgIGZpcnN0SGVhcnRSYXRlOiAiRmlyc3RIZWFydFJhdGUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpDQogICAgfQ0KDQpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgUmVzcGlyYXRvcnkgUmF0ZSBpbiBFbmNvdW50ZXIiOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgcmV0dXJuIFR1cGxlIHsNCiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLA0KICAgICAgZmlyc3RSZXNwaXJhdG9yeVJhdGU6ICJGaXJzdFJlc3BpcmF0b3J5UmF0ZSIoUXVhbGlmeWluZ0VuY291bnRlcikNCiAgICB9DQoNCmRlZmluZSAiUmlzayBWYXJpYWJsZSBGaXJzdCBTeXN0b2xpYyBCbG9vZCBQcmVzc3VyZSBpbiBFbmNvdW50ZXIiOg0KICAiRW5jb3VudGVyIHdpdGggQ3JlYXRpbmluZSBhbmQgd2l0aG91dCBPYnN0ZXRyaWNhbCBDb25kaXRpb25zIiBRdWFsaWZ5aW5nRW5jb3VudGVyDQogICAgcmV0dXJuIFR1cGxlIHsNCiAgICAgIGVuY291bnRlcklkOiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkLA0KICAgICAgZmlyc3RTeXN0b2xpY0JQOiAiRmlyc3RTeXN0b2xpY0Jsb29kUHJlc3N1cmUiKFF1YWxpZnlpbmdFbmNvdW50ZXIpDQogICAgfQ0KDQpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRmlyc3QgVGVtcGVyYXR1cmUgaW4gRW5jb3VudGVyIjoNCiAgIkVuY291bnRlciB3aXRoIENyZWF0aW5pbmUgYW5kIHdpdGhvdXQgT2JzdGV0cmljYWwgQ29uZGl0aW9ucyIgUXVhbGlmeWluZ0VuY291bnRlcg0KICAgIHJldHVybiBUdXBsZSB7DQogICAgICBlbmNvdW50ZXJJZDogUXVhbGlmeWluZ0VuY291bnRlci5pZCwNCiAgICAgIGZpcnN0VGVtcGVyYXR1cmU6ICJGaXJzdEJvZHlUZW1wZXJhdHVyZSIoUXVhbGlmeWluZ0VuY291bnRlcikNCiAgICB9DQoNCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJpc2sgVmFyaWFibGUgc3VwcG9ydGluIGZ1bmN0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQpkZWZpbmUgZnVuY3Rpb24gIkZpcnN0Qm9keVRlbXBlcmF0dXJlIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6DQogIEZpcnN0KFsiVVNDb3JlQm9keVRlbXBlcmF0dXJlUHJvZmlsZSI6ICJCb2R5IHRlbXBlcmF0dXJlIl0gRmlyc3RUZW1wZXJhdHVyZQ0KICAgICAgd2hlcmUgRmlyc3RUZW1wZXJhdHVyZS5lZmZlY3RpdmUuZWFybGllc3QoKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKQ0KICAgICAgICBhbmQgRmlyc3RUZW1wZXJhdHVyZS52YWx1ZSBpcyBub3QgbnVsbA0KICAgICAgc29ydCBieSBlZmZlY3RpdmUuZWFybGllc3QoKQ0KICApLnZhbHVlIGFzIFF1YW50aXR5DQoNCmRlZmluZSBmdW5jdGlvbiAiRmlyc3RIZWFydFJhdGUiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToNCiAgRmlyc3QoWyJVU0NvcmVIZWFydFJhdGVQcm9maWxlIjogIkhlYXJ0IHJhdGUiXSBGaXJzdEhlYXJ0QmVhdHMNCiAgICAgIHdoZXJlIEZpcnN0SGVhcnRCZWF0cy5lZmZlY3RpdmUuZWFybGllc3QoKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKQ0KICAgICAgICBhbmQgRmlyc3RIZWFydEJlYXRzLnZhbHVlIGlzIG5vdCBudWxsDQogICAgICBzb3J0IGJ5IGVmZmVjdGl2ZS5lYXJsaWVzdCgpDQogICkudmFsdWUgYXMgUXVhbnRpdHkNCg0KZGVmaW5lIGZ1bmN0aW9uICJGaXJzdFJlc3BpcmF0b3J5UmF0ZSIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBGaXJzdChbIlVTQ29yZVJlc3BpcmF0b3J5UmF0ZVByb2ZpbGUiOiAiUmVzcGlyYXRvcnkgcmF0ZSJdIEZpcnN0UmVzcGlyYXRpb24NCiAgICAgIHdoZXJlIEZpcnN0UmVzcGlyYXRpb24uZWZmZWN0aXZlLmVhcmxpZXN0KCkgZHVyaW5nIFF1YWxpZnlpbmdFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uKCkNCiAgICAgICAgYW5kIEZpcnN0UmVzcGlyYXRpb24udmFsdWUgaXMgbm90IG51bGwNCiAgICAgIHNvcnQgYnkgZWZmZWN0aXZlLmVhcmxpZXN0KCkNCiAgKS52YWx1ZSBhcyBRdWFudGl0eQ0KDQpkZWZpbmUgIlF1YWxpZnlpbmcgU3lzdG9saWMgQmxvb2QgUHJlc3N1cmUgUmVhZGluZyI6DQogIFsiVVNDb3JlQmxvb2RQcmVzc3VyZVByb2ZpbGUiXSBCbG9vZFByZXNzdXJlDQogICAgd2hlcmUgQmxvb2RQcmVzc3VyZS5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBkYXkgb2YgIk1lYXN1cmVtZW50IFBlcmlvZCINCg0KZGVmaW5lIGZ1bmN0aW9uICJGaXJzdFN5c3RvbGljQmxvb2RQcmVzc3VyZSIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOg0KICBGaXJzdCgiUXVhbGlmeWluZyBTeXN0b2xpYyBCbG9vZCBQcmVzc3VyZSBSZWFkaW5nIiBTQlBSZWFkaW5nDQogICAgICB3aGVyZSBTQlBSZWFkaW5nLmVmZmVjdGl2ZS5lYXJsaWVzdCgpIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpDQogICAgICByZXR1cm4gc2luZ2xldG9uIGZyb20oU0JQUmVhZGluZy5jb21wb25lbnQgU0JQQ29tcG9uZW50DQogICAgICAgICAgd2hlcmUgU0JQQ29tcG9uZW50LmNvZGUgfiAiU3lzdG9saWMgYmxvb2QgcHJlc3N1cmUiDQogICAgICAgICAgcmV0dXJuIFNCUENvbXBvbmVudC52YWx1ZSBhcyBRdWFudGl0eQ0KICAgICAgKQ0KICApDQovKiANCmRlZmluZSBmdW5jdGlvbiAiRmlyc3RTeXN0b2xpY0Jsb29kUHJlc3N1cmVUZXN0IihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlciApOg0KICBGaXJzdChbIlVTQ29yZUJsb29kUHJlc3N1cmVQcm9maWxlIjogIlN5c3RvbGljIGJsb29kIHByZXNzdXJlIl0gRmlyc3RTeXN0b2xpYw0KICAgICAgd2hlcmUgRmlyc3RTeXN0b2xpYy5lZmZlY3RpdmUuZWFybGllc3QoKSBkdXJpbmcgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24oKQ0KICAgICAgICBhbmQgRmlyc3RTeXN0b2xpYy52YWx1ZSBpcyBub3QgbnVsbA0KICAgICAgc29ydCBieSBlZmZlY3RpdmUuZWFybGllc3QoKQ0KICApLnZhbHVlIGFzIFF1YW50aXR5DQoqLw0KDQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVtcG9yYXJ5IGRlYnVnZ2luZyBkZWZpbmVzIHNob3VsZCBnbyBoZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQo="
    }
  ]
}