Draft dQM CMS Content Implementation Guide
2025.1.0 - CI Build
Draft dQM CMS Content Implementation Guide, published by cqframework. This guide is not an authorized publication; it is the continuous build for version 2025.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/cqframework/dqm-content-cms-2025/ and changes regularly. See the Directory of published versions
| Draft as of 2026-09-19 |
{
"resourceType" : "Library",
"id" : "CMS1017FHIRHHFI",
"text" : {
"status" : "extensions",
"div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\">\n <table class=\"narrative-table\">\n <tbody>\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"metadata\"> </a>Metadata</th>\n\n\n</tr>\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Version</th>\n\n\n\n<td class=\"content-container\">1.1.000</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Status</th>\n\n\n\n<td class=\"content-container\">Draft</td>\n\n\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\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Type</th>\n\n\n\n<td class=\"content-container\">\n <a href=\"http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html\">http://terminology.hl7.org/CodeSystem/library-type</a>#logic-library\n\n\n</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n\n\n\n\n\n<tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\"><a name=\"parameters\"> </a>Parameters</th>\n\n\n</tr>\n\n\n<tr>\n\n\n<th scope=\"row\" class=\"row-header\">Parameter</th>\n\n\n\n<td class=\"content-container\">None</td>\n\n\n</tr>\n\n\n\n\n\n\n\n\n <tr>\n\n\n<th colspan=\"2\" scope=\"row\" class=\"row-header\">Library Content</th>\n\n\n</tr>\n \n \n <tr>\n <th scope=\"row\" class=\"row-header\">CQL Content</th>\n <td>\n <a name=\"cql-content\"> </a>\n <pre style=\"border: none;\" class=\"content-container highlight language-cql\"><code class=\"language-cql\">/*\nNOTE: For use by March 2026 US Realm Connectathon participants for internal use only. Not for use or distribution in commercial products.\n*/\nlibrary CMS1017FHIRHHFI version '1.1.000'\n\nusing USQualityCore version '0.1.0-cibuild'\nusing USCore version '6.1.0-derived'\nusing FHIR version '4.0.1'\n\ninclude hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers\ninclude hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon\ninclude hl7.fhir.us.cql.CumulativeMedicationDuration version '2.0.0-ballot' called CMD\ninclude hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCoreCommon\ninclude hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements\n\ninclude CQMCommon version '5.1.000' called CQMCommon\ninclude USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon\ninclude SupplementalDataElements version '6.1.000' called SDE\ninclude Status version '2.1.000' called Status\n\ncodesystem "LOINC": 'http://loinc.org'\n\nvalueset "Abnormal Weight Loss": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1258.2'\nvalueset "Anticoagulants for All Indications": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.22'\nvalueset "Antidepressants": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.163'\nvalueset "Antihypertensives": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.164'\nvalueset "Central Nervous System Depressants": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.134'\nvalueset "Coagulation Disorders": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.23'\nvalueset "Delirium, Dementia, and Other Psychoses": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.168'\nvalueset "Depression": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.169'\nvalueset "Diuretics": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.170'\nvalueset "Epilepsy": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.171'\nvalueset "Inpatient Falls": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.171'\nvalueset "Leukemia or Lymphoma": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.136'\nvalueset "Liver Disease Moderate to Severe": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.137'\nvalueset "Major Injuries": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.120'\nvalueset "Malignant Bone Disease": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.24'\nvalueset "Malnutrition": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1272.1'\nvalueset "Moderate Injuries": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.205'\nvalueset "Neurologic Movement and Related Disorders": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.174'\nvalueset "Not Present On Admission or Documentation Insufficient to Determine": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.198'\nvalueset "Obesity": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.162'\nvalueset "Opioids": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.120'\nvalueset "Osteoporosis": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1200.147'\nvalueset "Peripheral Neuropathy": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.175'\nvalueset "Present on Admission or Clinically Undetermined": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1147.197'\nvalueset "Stroke": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.176'\nvalueset "Suicide Attempt": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.130'\nvalueset "Emergency Department Visit": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.292'\nvalueset "Encounter Inpatient": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'\n\nparameter "Measurement Period" Interval<DateTime>\n default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)\n\ncontext Patient\n\ndefine "Qualifying Encounter":\n CQMCommon."Inpatient Encounter" InpatientEncounter\n where InpatientEncounter.hospitalizationWithObservation ( ).lengthInDays ( ) <= 120\n and AgeInYearsAt(date from start of InpatientEncounter.period) >= 18\n\ndefine "Initial Population":\n "Qualifying Encounter"\n\ndefine "Denominator":\n "Initial Population"\n\ndefine "Numerator":\n "Encounter Where A Fall And Major Injury Occurred Not POA"\n union "Encounter Where A Fall And Moderate Injury Occurred Not POA"\n\ndefine "Encounter Where A Fall And Moderate Injury Occurred Not POA":\n "Encounter With A Fall Not Present On Admission" FallOccurred\n where exists ( ( FallOccurred.claimDiagnosis ( ) ) ModerateFallOccurred\n where ( ModerateFallOccurred.onAdmission is null\n or ModerateFallOccurred.onAdmission in "Not Present On Admission or Documentation Insufficient to Determine"\n )\n and ( ModerateFallOccurred.diagnosis in "Moderate Injuries"\n or ModerateFallOccurred.diagnosis.getCondition ( ).code in "Moderate Injuries"\n )\n )\n\ndefine "Encounter Where A Fall And Major Injury Occurred Not POA":\n "Encounter With A Fall Not Present On Admission" FallOccurred\n where exists ( ( FallOccurred.claimDiagnosis ( ) ) MajorFallOccurred\n where ( MajorFallOccurred.onAdmission is null\n or MajorFallOccurred.onAdmission in "Not Present On Admission or Documentation Insufficient to Determine"\n )\n and ( MajorFallOccurred.diagnosis in "Major Injuries"\n or MajorFallOccurred.diagnosis.getCondition ( ).code in "Major Injuries"\n )\n )\n\ndefine "Encounter Where A Fall Occurred":\n "Encounter With A Fall Diagnosis" EncounterFallDiagnosis\n union "Encounter With A Fall Event" EncounterFallEvent\n\ndefine "Encounter With A Fall Not Present On Admission":\n "Encounter Where A Fall Occurred" EncounterFallDiagnosis\n where EncounterFallDiagnosis.hasDiagnosisNotPresentOnAdmissionOrNull ( "Inpatient Falls" )\n\ndefine "Encounter With A Fall Diagnosis":\n "Qualifying Encounter" QualifyingFall\n where QualifyingFall.reasonCode in "Inpatient Falls"\n or QualifyingFall.encountersDiagnosis ( ).code in "Inpatient Falls"\n\ndefine "Encounter With A Fall Event":\n "Qualifying Encounter" InpatientEncounter\n with [AdverseEvent: "Inpatient Falls"] FallsDocumentation\n such that Coalesce(FallsDocumentation.date, FallsDocumentation.recordedDate) during InpatientEncounter.hospitalizationWithObservation ( )\n\ndefine "Denominator Exclusions":\n "Encounter With A Fall Present On Admission"\n\ndefine "Numerator Exclusions":\n "Encounter With A Fall Present On Admission"\n\ndefine "Encounter With A Fall Present On Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Inpatient Falls", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Body Mass Index (BMI)":\n from\n ["USCore.BMIProfile"] BMI\n with "Qualifying Encounter" InpatientEncounter\n such that BMI.effective.toInterval ( ) starts during InpatientEncounter.hospitalizationWithObservation ( )\n and BMI.value is not null\n and BMI.status in { 'final', 'amended', 'corrected' }\n return BMI.value as Quantity\n\ndefine "Risk Variable All Encounter Diagnoses with Rank and POA Indication":\n from\n "Qualifying Encounter" InpatientEncounter\n let claim: ( [Claim] C\n where C.status = 'active'\n and C.use = 'claim'\n and exists ( C.item ClaimItem\n where ClaimItem.encounter.references ( InpatientEncounter )\n )\n ),\n claimItem: ( claim.item ClaimItem\n where ClaimItem.encounter.references ( InpatientEncounter )\n )\n return Tuple {\n encounterId: InpatientEncounter.id,\n diagnosis: claim.diagnosis,\n rank: claim.diagnosis.sequence,\n POA: claim.diagnosis Diag\n where Diag.onAdmission in "Present on Admission or Clinically Undetermined"\n or Diag.onAdmission in "Not Present On Admission or Documentation Insufficient to Determine"\n }\n\ndefine "Risk Variable Encounter with Abnormal Weight Loss or Malnutrition Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Abnormal Weight Loss", "Present on Admission or Clinically Undetermined" )\n or InpatientEncounter.isDiagnosisPresentOnAdmission ( "Malnutrition", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Anticoagulant Active at Admission":\n "Qualifying Encounter" InpatientEncounter\n with ["MedicationRequest": "Anticoagulants for All Indications"] Anticoagulants\n such that Anticoagulants.status in { 'active', 'completed' }\n and ( Anticoagulants.intent = 'order'\n or ( Anticoagulants.intent = 'plan'\n and Anticoagulants.subject.reference.getId ( ) = Patient.id\n )\n )\n and Anticoagulants.isCommunity ( )\n and Anticoagulants.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period\n\ndefine "Risk Variable Encounter with Anticoagulant Administration During Encounter":\n "Qualifying Encounter" InpatientEncounter\n with ["MedicationAdministration": "Anticoagulants for All Indications"] Anticoagulants\n such that Anticoagulants.effective.toInterval ( ) starts during InpatientEncounter.hospitalizationWithObservation ( )\n and Anticoagulants.status in { 'in-progress', 'completed' }\n\ndefine "Risk Variable Encounter with Antidepressant Active at Admission":\n "Qualifying Encounter" InpatientEncounter\n with ["MedicationRequest": "Antidepressants"] AntidepressantMed\n such that AntidepressantMed.status in { 'active', 'completed' }\n and ( AntidepressantMed.intent = 'order'\n or ( AntidepressantMed.intent = 'plan'\n and AntidepressantMed.subject.reference.getId ( ) = Patient.id\n )\n )\n and AntidepressantMed.isCommunity ( )\n and AntidepressantMed.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period\n\ndefine "Risk Variable Encounter with Antihypertensive Active at Admission":\n "Qualifying Encounter" InpatientEncounter\n with ["MedicationRequest": "Antihypertensives"] BPMed\n such that BPMed.status in { 'active', 'completed' }\n and ( BPMed.intent = 'order'\n or ( BPMed.intent = 'plan'\n and BPMed.subject.reference.getId ( ) = Patient.id\n )\n )\n and BPMed.isCommunity ( )\n and BPMed.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period\n\ndefine "Risk Variable Encounter with CNS Depressant Active at Admission":\n "Qualifying Encounter" InpatientEncounter\n with ["MedicationRequest": "Central Nervous System Depressants"] CNSMed\n such that CNSMed.status in { 'active', 'completed' }\n and ( CNSMed.intent = 'order'\n or ( CNSMed.intent = 'plan'\n and CNSMed.subject.reference.getId ( ) = Patient.id\n )\n )\n and CNSMed.isCommunity ( )\n and CNSMed.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period\n\ndefine "Risk Variable Encounter with Diuretic Active at Admission":\n "Qualifying Encounter" InpatientEncounter\n with ["MedicationRequest": "Diuretics"] DiureticMed\n such that DiureticMed.status in { 'active', 'completed' }\n and ( DiureticMed.intent = 'order'\n or ( DiureticMed.intent = 'plan'\n and DiureticMed.subject.reference.getId ( ) = Patient.id\n )\n )\n and DiureticMed.isCommunity ( )\n and DiureticMed.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period\n\ndefine "Risk Variable Encounter with Opioid Medication Active at Admission":\n "Qualifying Encounter" InpatientEncounter\n with ["MedicationRequest": "Opioids"] OpioidMed\n such that OpioidMed.status in { 'active', 'completed' }\n and ( OpioidMed.intent = 'order'\n or ( OpioidMed.intent = 'plan'\n and OpioidMed.subject.reference.getId ( ) = Patient.id\n )\n )\n and OpioidMed.isCommunity ( )\n and OpioidMed.medicationRequestPeriod ( ) overlaps before day of InpatientEncounter.period\n\ndefine "Risk Variable Encounter with Coagulation Disorder Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Coagulation Disorders", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Delirium or Dementia or Other Psychosis Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Delirium, Dementia, and Other Psychoses", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Depression Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Depression", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Epilepsy Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Epilepsy", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Leukemia or Lymphoma Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Leukemia or Lymphoma", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Liver Disease Moderate to Severe Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Liver Disease Moderate to Severe", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Malignant Bone Disease Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Malignant Bone Disease", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Neurologic Disorder Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Neurologic Movement and Related Disorders", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Obesity Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Obesity", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Osteoporosis Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Osteoporosis", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Peripheral Neuropathy Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Peripheral Neuropathy", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Stroke Present on Admission":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.isDiagnosisPresentOnAdmission ( "Stroke", "Present on Admission or Clinically Undetermined" )\n\ndefine "Risk Variable Encounter with Suicide Attempt":\n "Qualifying Encounter" InpatientEncounter\n where InpatientEncounter.encountersDiagnosis ( ).code in "Suicide Attempt"\n\ndefine "SDE Ethnicity":\n SDE."SDE Ethnicity"\n\ndefine "SDE Payer":\n SDE."SDE Payer"\n\ndefine "SDE Race":\n SDE."SDE Race"\n\ndefine "SDE Sex":\n SDE."SDE Sex"\n\ndefine function "Denominator Observation"(QualifyingEncounter Encounter):\n duration in days of QualifyingEncounter.hospitalizationWithObservation ( )\n\ndefine function "Numerator Observation"(QualifyingEncounter Encounter):\n Count("Numerator" FallsEncounter\n where FallsEncounter.period ends during QualifyingEncounter.hospitalizationWithObservation()\n )\n\ndefine fluent function hasDiagnosisNotPresentOnAdmissionOrNull(encounter Encounter, diagnosisValueSet System.ValueSet):\n exists ( [Claim] C\n where C.status = 'active'\n and C.use = 'claim'\n and exists ( C.item I\n where I.encounter.references ( encounter )\n )\n return C.diagnosis D\n where exists ( C.item I\n where I.encounter.references ( encounter )\n and D.sequence in I.diagnosisSequence\n )\n and ( D.onAdmission is null\n or D.onAdmission in "Not Present On Admission or Documentation Insufficient to Determine"\n )\n and D.diagnosis as FHIR.CodeableConcept in diagnosisValueSet\n )\n\ndefine fluent function encountersDiagnosis(Encounter Encounter):\n Encounter.reasonReference EncDiag\n return singleton from ( ( [ConditionEncounterDiagnosis] ConditionED\n union [ConditionProblemsHealthConcerns] ConditionPHC ) Cond\n where EncDiag.references ( Cond.id )\n )</code></pre>\n </td>\n </tr>\n \n \n\n\n\n<tr>\n <th colspan=\"2\" scope=\"row\" class=\"row-header\">Generated using version 0.5.6 of the sample-content-ig Liquid templates</th>\n</tr>\n\n </tbody>\n </table>\n</div>"
},
"extension" : [
{
"url" : "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-softwaresystem",
"valueReference" : {
"reference" : "Device/cqf-tooling"
}
}
],
"url" : "https://madie.cms.gov/Library/CMS1017FHIRHHFI",
"version" : "1.1.000",
"name" : "CMS1017FHIRHHFI",
"status" : "draft",
"type" : {
"coding" : [
{
"system" : "http://terminology.hl7.org/CodeSystem/library-type",
"code" : "logic-library"
}
]
},
"date" : "2026-09-19T16:31:14+00:00",
"content" : [
{
"contentType" : "text/cql",
"data" : "LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVMxMDE3RkhJUkhIRkkgdmVyc2lvbiAnMS4xLjAwMCcKCnVzaW5nIFVTUXVhbGl0eUNvcmUgdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcKdXNpbmcgVVNDb3JlIHZlcnNpb24gJzYuMS4wLWRlcml2ZWQnCnVzaW5nIEZISVIgdmVyc2lvbiAnNC4wLjEnCgppbmNsdWRlIGhsNy5maGlyLnV2LmNxbC5GSElSSGVscGVycyB2ZXJzaW9uICc0LjAuMScgY2FsbGVkIEZISVJIZWxwZXJzCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJDb21tb24gdmVyc2lvbiAnMi4wLjAnIGNhbGxlZCBGSElSQ29tbW9uCmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLkN1bXVsYXRpdmVNZWRpY2F0aW9uRHVyYXRpb24gdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgQ01ECmluY2x1ZGUgaGw3LmZoaXIudXMuY3FsLlVTQ29yZUNvbW1vbiB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlRWxlbWVudHMgdmVyc2lvbiAnMi4wLjAtYmFsbG90JyBjYWxsZWQgVVNDb3JlRWxlbWVudHMKCmluY2x1ZGUgQ1FNQ29tbW9uIHZlcnNpb24gJzUuMS4wMDAnIGNhbGxlZCBDUU1Db21tb24KaW5jbHVkZSBVU1F1YWxpdHlDb3JlQ29tbW9uIHZlcnNpb24gJzAuMS4wLWNpYnVpbGQnIGNhbGxlZCBVU1F1YWxpdHlDb3JlQ29tbW9uCmluY2x1ZGUgU3VwcGxlbWVudGFsRGF0YUVsZW1lbnRzIHZlcnNpb24gJzYuMS4wMDAnIGNhbGxlZCBTREUKaW5jbHVkZSBTdGF0dXMgdmVyc2lvbiAnMi4xLjAwMCcgY2FsbGVkIFN0YXR1cwoKY29kZXN5c3RlbSAiTE9JTkMiOiAnaHR0cDovL2xvaW5jLm9yZycKCnZhbHVlc2V0ICJBYm5vcm1hbCBXZWlnaHQgTG9zcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNTguMicKdmFsdWVzZXQgIkFudGljb2FndWxhbnRzIGZvciBBbGwgSW5kaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjIyJwp2YWx1ZXNldCAiQW50aWRlcHJlc3NhbnRzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4xNjMnCnZhbHVlc2V0ICJBbnRpaHlwZXJ0ZW5zaXZlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTY0Jwp2YWx1ZXNldCAiQ2VudHJhbCBOZXJ2b3VzIFN5c3RlbSBEZXByZXNzYW50cyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTM0Jwp2YWx1ZXNldCAiQ29hZ3VsYXRpb24gRGlzb3JkZXJzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4yMycKdmFsdWVzZXQgIkRlbGlyaXVtLCBEZW1lbnRpYSwgYW5kIE90aGVyIFBzeWNob3NlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTY4Jwp2YWx1ZXNldCAiRGVwcmVzc2lvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTY5Jwp2YWx1ZXNldCAiRGl1cmV0aWNzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4xNzAnCnZhbHVlc2V0ICJFcGlsZXBzeSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTcxJwp2YWx1ZXNldCAiSW5wYXRpZW50IEZhbGxzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE0Ny4xNzEnCnZhbHVlc2V0ICJMZXVrZW1pYSBvciBMeW1waG9tYSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTM2Jwp2YWx1ZXNldCAiTGl2ZXIgRGlzZWFzZSBNb2RlcmF0ZSB0byBTZXZlcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjEzNycKdmFsdWVzZXQgIk1ham9yIEluanVyaWVzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE0Ny4xMjAnCnZhbHVlc2V0ICJNYWxpZ25hbnQgQm9uZSBEaXNlYXNlIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4yNCcKdmFsdWVzZXQgIk1hbG51dHJpdGlvbiI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNzIuMScKdmFsdWVzZXQgIk1vZGVyYXRlIEluanVyaWVzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTI0OC4yMDUnCnZhbHVlc2V0ICJOZXVyb2xvZ2ljIE1vdmVtZW50IGFuZCBSZWxhdGVkIERpc29yZGVycyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTc0Jwp2YWx1ZXNldCAiTm90IFByZXNlbnQgT24gQWRtaXNzaW9uIG9yIERvY3VtZW50YXRpb24gSW5zdWZmaWNpZW50IHRvIERldGVybWluZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjExNDcuMTk4Jwp2YWx1ZXNldCAiT2Jlc2l0eSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTYyJwp2YWx1ZXNldCAiT3Bpb2lkcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTIwJwp2YWx1ZXNldCAiT3N0ZW9wb3Jvc2lzIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTIwMC4xNDcnCnZhbHVlc2V0ICJQZXJpcGhlcmFsIE5ldXJvcGF0aHkiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjE3NScKdmFsdWVzZXQgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIjogJ2h0dHA6Ly9jdHMubmxtLm5paC5nb3YvZmhpci9WYWx1ZVNldC8yLjE2Ljg0MC4xLjExMzc2Mi4xLjQuMTE0Ny4xOTcnCnZhbHVlc2V0ICJTdHJva2UiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjE3NicKdmFsdWVzZXQgIlN1aWNpZGUgQXR0ZW1wdCI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM3NjIuMS40LjEyNDguMTMwJwp2YWx1ZXNldCAiRW1lcmdlbmN5IERlcGFydG1lbnQgVmlzaXQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjI5MicKdmFsdWVzZXQgIkVuY291bnRlciBJbnBhdGllbnQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNjY2LjUuMzA3JwoKcGFyYW1ldGVyICJNZWFzdXJlbWVudCBQZXJpb2QiIEludGVydmFsPERhdGVUaW1lPgogIGRlZmF1bHQgSW50ZXJ2YWxbQDIwMjYtMDEtMDFUMDA6MDA6MDAuMDAwWiwgQDIwMjctMDEtMDFUMDA6MDA6MDAuMDAwWikKCmNvbnRleHQgUGF0aWVudAoKZGVmaW5lICJRdWFsaWZ5aW5nIEVuY291bnRlciI6CiAgQ1FNQ29tbW9uLiJJbnBhdGllbnQgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLmxlbmd0aEluRGF5cyAoICkgPD0gMTIwCiAgICAgIGFuZCBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mIElucGF0aWVudEVuY291bnRlci5wZXJpb2QpID49IDE4CgpkZWZpbmUgIkluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIgoKZGVmaW5lICJEZW5vbWluYXRvciI6CiAgIkluaXRpYWwgUG9wdWxhdGlvbiIKCmRlZmluZSAiTnVtZXJhdG9yIjoKICAiRW5jb3VudGVyIFdoZXJlIEEgRmFsbCBBbmQgTWFqb3IgSW5qdXJ5IE9jY3VycmVkIE5vdCBQT0EiCiAgICB1bmlvbiAiRW5jb3VudGVyIFdoZXJlIEEgRmFsbCBBbmQgTW9kZXJhdGUgSW5qdXJ5IE9jY3VycmVkIE5vdCBQT0EiCgpkZWZpbmUgIkVuY291bnRlciBXaGVyZSBBIEZhbGwgQW5kIE1vZGVyYXRlIEluanVyeSBPY2N1cnJlZCBOb3QgUE9BIjoKICAiRW5jb3VudGVyIFdpdGggQSBGYWxsIE5vdCBQcmVzZW50IE9uIEFkbWlzc2lvbiIgRmFsbE9jY3VycmVkCiAgICB3aGVyZSBleGlzdHMgKCAoIEZhbGxPY2N1cnJlZC5jbGFpbURpYWdub3NpcyAoICkgKSBNb2RlcmF0ZUZhbGxPY2N1cnJlZAogICAgICAgIHdoZXJlICggTW9kZXJhdGVGYWxsT2NjdXJyZWQub25BZG1pc3Npb24gaXMgbnVsbAogICAgICAgICAgICBvciBNb2RlcmF0ZUZhbGxPY2N1cnJlZC5vbkFkbWlzc2lvbiBpbiAiTm90IFByZXNlbnQgT24gQWRtaXNzaW9uIG9yIERvY3VtZW50YXRpb24gSW5zdWZmaWNpZW50IHRvIERldGVybWluZSIKICAgICAgICApCiAgICAgICAgICBhbmQgKCBNb2RlcmF0ZUZhbGxPY2N1cnJlZC5kaWFnbm9zaXMgaW4gIk1vZGVyYXRlIEluanVyaWVzIgogICAgICAgICAgICAgIG9yIE1vZGVyYXRlRmFsbE9jY3VycmVkLmRpYWdub3Npcy5nZXRDb25kaXRpb24gKCApLmNvZGUgaW4gIk1vZGVyYXRlIEluanVyaWVzIgogICAgICAgICAgKQogICAgKQoKZGVmaW5lICJFbmNvdW50ZXIgV2hlcmUgQSBGYWxsIEFuZCBNYWpvciBJbmp1cnkgT2NjdXJyZWQgTm90IFBPQSI6CiAgIkVuY291bnRlciBXaXRoIEEgRmFsbCBOb3QgUHJlc2VudCBPbiBBZG1pc3Npb24iIEZhbGxPY2N1cnJlZAogICAgd2hlcmUgZXhpc3RzICggKCBGYWxsT2NjdXJyZWQuY2xhaW1EaWFnbm9zaXMgKCApICkgTWFqb3JGYWxsT2NjdXJyZWQKICAgICAgICB3aGVyZSAoIE1ham9yRmFsbE9jY3VycmVkLm9uQWRtaXNzaW9uIGlzIG51bGwKICAgICAgICAgICAgb3IgTWFqb3JGYWxsT2NjdXJyZWQub25BZG1pc3Npb24gaW4gIk5vdCBQcmVzZW50IE9uIEFkbWlzc2lvbiBvciBEb2N1bWVudGF0aW9uIEluc3VmZmljaWVudCB0byBEZXRlcm1pbmUiCiAgICAgICAgKQogICAgICAgICAgYW5kICggTWFqb3JGYWxsT2NjdXJyZWQuZGlhZ25vc2lzIGluICJNYWpvciBJbmp1cmllcyIKICAgICAgICAgICAgICBvciBNYWpvckZhbGxPY2N1cnJlZC5kaWFnbm9zaXMuZ2V0Q29uZGl0aW9uICggKS5jb2RlIGluICJNYWpvciBJbmp1cmllcyIKICAgICAgICAgICkKICAgICkKCmRlZmluZSAiRW5jb3VudGVyIFdoZXJlIEEgRmFsbCBPY2N1cnJlZCI6CiAgIkVuY291bnRlciBXaXRoIEEgRmFsbCBEaWFnbm9zaXMiIEVuY291bnRlckZhbGxEaWFnbm9zaXMKICAgIHVuaW9uICJFbmNvdW50ZXIgV2l0aCBBIEZhbGwgRXZlbnQiIEVuY291bnRlckZhbGxFdmVudAoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBBIEZhbGwgTm90IFByZXNlbnQgT24gQWRtaXNzaW9uIjoKICAiRW5jb3VudGVyIFdoZXJlIEEgRmFsbCBPY2N1cnJlZCIgRW5jb3VudGVyRmFsbERpYWdub3NpcwogICAgd2hlcmUgRW5jb3VudGVyRmFsbERpYWdub3Npcy5oYXNEaWFnbm9zaXNOb3RQcmVzZW50T25BZG1pc3Npb25Pck51bGwgKCAiSW5wYXRpZW50IEZhbGxzIiApCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEEgRmFsbCBEaWFnbm9zaXMiOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgUXVhbGlmeWluZ0ZhbGwKICAgIHdoZXJlIFF1YWxpZnlpbmdGYWxsLnJlYXNvbkNvZGUgaW4gIklucGF0aWVudCBGYWxscyIKICAgICAgb3IgUXVhbGlmeWluZ0ZhbGwuZW5jb3VudGVyc0RpYWdub3NpcyAoICkuY29kZSBpbiAiSW5wYXRpZW50IEZhbGxzIgoKZGVmaW5lICJFbmNvdW50ZXIgV2l0aCBBIEZhbGwgRXZlbnQiOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aXRoIFtBZHZlcnNlRXZlbnQ6ICJJbnBhdGllbnQgRmFsbHMiXSBGYWxsc0RvY3VtZW50YXRpb24KICAgICAgc3VjaCB0aGF0IENvYWxlc2NlKEZhbGxzRG9jdW1lbnRhdGlvbi5kYXRlLCBGYWxsc0RvY3VtZW50YXRpb24ucmVjb3JkZWREYXRlKSBkdXJpbmcgSW5wYXRpZW50RW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkKCmRlZmluZSAiRGVub21pbmF0b3IgRXhjbHVzaW9ucyI6CiAgIkVuY291bnRlciBXaXRoIEEgRmFsbCBQcmVzZW50IE9uIEFkbWlzc2lvbiIKCmRlZmluZSAiTnVtZXJhdG9yIEV4Y2x1c2lvbnMiOgogICJFbmNvdW50ZXIgV2l0aCBBIEZhbGwgUHJlc2VudCBPbiBBZG1pc3Npb24iCgpkZWZpbmUgIkVuY291bnRlciBXaXRoIEEgRmFsbCBQcmVzZW50IE9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJJbnBhdGllbnQgRmFsbHMiLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBCb2R5IE1hc3MgSW5kZXggKEJNSSkiOgogIGZyb20KICAgIFsiVVNDb3JlLkJNSVByb2ZpbGUiXSBCTUkKICAgIHdpdGggIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgICAgc3VjaCB0aGF0IEJNSS5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBJbnBhdGllbnRFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgICAgIGFuZCBCTUkudmFsdWUgaXMgbm90IG51bGwKICAgICAgICBhbmQgQk1JLnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgcmV0dXJuIEJNSS52YWx1ZSBhcyBRdWFudGl0eQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEFsbCBFbmNvdW50ZXIgRGlhZ25vc2VzIHdpdGggUmFuayBhbmQgUE9BIEluZGljYXRpb24iOgogIGZyb20KICAgICJRdWFsaWZ5aW5nIEVuY291bnRlciIgSW5wYXRpZW50RW5jb3VudGVyCiAgICBsZXQgY2xhaW06ICggW0NsYWltXSBDCiAgICAgICAgd2hlcmUgQy5zdGF0dXMgPSAnYWN0aXZlJwogICAgICAgICAgYW5kIEMudXNlID0gJ2NsYWltJwogICAgICAgICAgYW5kIGV4aXN0cyAoIEMuaXRlbSBDbGFpbUl0ZW0KICAgICAgICAgICAgICB3aGVyZSBDbGFpbUl0ZW0uZW5jb3VudGVyLnJlZmVyZW5jZXMgKCBJbnBhdGllbnRFbmNvdW50ZXIgKQogICAgICAgICAgKQogICAgKSwKICAgIGNsYWltSXRlbTogKCBjbGFpbS5pdGVtIENsYWltSXRlbQogICAgICAgIHdoZXJlIENsYWltSXRlbS5lbmNvdW50ZXIucmVmZXJlbmNlcyAoIElucGF0aWVudEVuY291bnRlciApCiAgICApCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXJJZDogSW5wYXRpZW50RW5jb3VudGVyLmlkLAogICAgICBkaWFnbm9zaXM6IGNsYWltLmRpYWdub3NpcywKICAgICAgcmFuazogY2xhaW0uZGlhZ25vc2lzLnNlcXVlbmNlLAogICAgICBQT0E6IGNsYWltLmRpYWdub3NpcyBEaWFnCiAgICAgICAgd2hlcmUgRGlhZy5vbkFkbWlzc2lvbiBpbiAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiCiAgICAgICAgICBvciBEaWFnLm9uQWRtaXNzaW9uIGluICJOb3QgUHJlc2VudCBPbiBBZG1pc3Npb24gb3IgRG9jdW1lbnRhdGlvbiBJbnN1ZmZpY2llbnQgdG8gRGV0ZXJtaW5lIgogICAgfQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIEFibm9ybWFsIFdlaWdodCBMb3NzIG9yIE1hbG51dHJpdGlvbiBQcmVzZW50IG9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJBYm5vcm1hbCBXZWlnaHQgTG9zcyIsICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCIgKQogICAgICBvciBJbnBhdGllbnRFbmNvdW50ZXIuaXNEaWFnbm9zaXNQcmVzZW50T25BZG1pc3Npb24gKCAiTWFsbnV0cml0aW9uIiwgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiApCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggQW50aWNvYWd1bGFudCBBY3RpdmUgYXQgQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2l0aCBbIk1lZGljYXRpb25SZXF1ZXN0IjogIkFudGljb2FndWxhbnRzIGZvciBBbGwgSW5kaWNhdGlvbnMiXSBBbnRpY29hZ3VsYW50cwogICAgICBzdWNoIHRoYXQgQW50aWNvYWd1bGFudHMuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgKCBBbnRpY29hZ3VsYW50cy5pbnRlbnQgPSAnb3JkZXInCiAgICAgICAgICAgIG9yICggQW50aWNvYWd1bGFudHMuaW50ZW50ID0gJ3BsYW4nCiAgICAgICAgICAgICAgICBhbmQgQW50aWNvYWd1bGFudHMuc3ViamVjdC5yZWZlcmVuY2UuZ2V0SWQgKCApID0gUGF0aWVudC5pZAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGFuZCBBbnRpY29hZ3VsYW50cy5pc0NvbW11bml0eSAoICkKICAgICAgICBhbmQgQW50aWNvYWd1bGFudHMubWVkaWNhdGlvblJlcXVlc3RQZXJpb2QgKCApIG92ZXJsYXBzIGJlZm9yZSBkYXkgb2YgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZAoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIEFudGljb2FndWxhbnQgQWRtaW5pc3RyYXRpb24gRHVyaW5nIEVuY291bnRlciI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdpdGggWyJNZWRpY2F0aW9uQWRtaW5pc3RyYXRpb24iOiAiQW50aWNvYWd1bGFudHMgZm9yIEFsbCBJbmRpY2F0aW9ucyJdIEFudGljb2FndWxhbnRzCiAgICAgIHN1Y2ggdGhhdCBBbnRpY29hZ3VsYW50cy5lZmZlY3RpdmUudG9JbnRlcnZhbCAoICkgc3RhcnRzIGR1cmluZyBJbnBhdGllbnRFbmNvdW50ZXIuaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgICAgIGFuZCBBbnRpY29hZ3VsYW50cy5zdGF0dXMgaW4geyAnaW4tcHJvZ3Jlc3MnLCAnY29tcGxldGVkJyB9CgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggQW50aWRlcHJlc3NhbnQgQWN0aXZlIGF0IEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdpdGggWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJBbnRpZGVwcmVzc2FudHMiXSBBbnRpZGVwcmVzc2FudE1lZAogICAgICBzdWNoIHRoYXQgQW50aWRlcHJlc3NhbnRNZWQuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgKCBBbnRpZGVwcmVzc2FudE1lZC5pbnRlbnQgPSAnb3JkZXInCiAgICAgICAgICAgIG9yICggQW50aWRlcHJlc3NhbnRNZWQuaW50ZW50ID0gJ3BsYW4nCiAgICAgICAgICAgICAgICBhbmQgQW50aWRlcHJlc3NhbnRNZWQuc3ViamVjdC5yZWZlcmVuY2UuZ2V0SWQgKCApID0gUGF0aWVudC5pZAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGFuZCBBbnRpZGVwcmVzc2FudE1lZC5pc0NvbW11bml0eSAoICkKICAgICAgICBhbmQgQW50aWRlcHJlc3NhbnRNZWQubWVkaWNhdGlvblJlcXVlc3RQZXJpb2QgKCApIG92ZXJsYXBzIGJlZm9yZSBkYXkgb2YgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZAoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIEFudGloeXBlcnRlbnNpdmUgQWN0aXZlIGF0IEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdpdGggWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJBbnRpaHlwZXJ0ZW5zaXZlcyJdIEJQTWVkCiAgICAgIHN1Y2ggdGhhdCBCUE1lZC5zdGF0dXMgaW4geyAnYWN0aXZlJywgJ2NvbXBsZXRlZCcgfQogICAgICAgIGFuZCAoIEJQTWVkLmludGVudCA9ICdvcmRlcicKICAgICAgICAgICAgb3IgKCBCUE1lZC5pbnRlbnQgPSAncGxhbicKICAgICAgICAgICAgICAgIGFuZCBCUE1lZC5zdWJqZWN0LnJlZmVyZW5jZS5nZXRJZCAoICkgPSBQYXRpZW50LmlkCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgYW5kIEJQTWVkLmlzQ29tbXVuaXR5ICggKQogICAgICAgIGFuZCBCUE1lZC5tZWRpY2F0aW9uUmVxdWVzdFBlcmlvZCAoICkgb3ZlcmxhcHMgYmVmb3JlIGRheSBvZiBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggQ05TIERlcHJlc3NhbnQgQWN0aXZlIGF0IEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdpdGggWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJDZW50cmFsIE5lcnZvdXMgU3lzdGVtIERlcHJlc3NhbnRzIl0gQ05TTWVkCiAgICAgIHN1Y2ggdGhhdCBDTlNNZWQuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgKCBDTlNNZWQuaW50ZW50ID0gJ29yZGVyJwogICAgICAgICAgICBvciAoIENOU01lZC5pbnRlbnQgPSAncGxhbicKICAgICAgICAgICAgICAgIGFuZCBDTlNNZWQuc3ViamVjdC5yZWZlcmVuY2UuZ2V0SWQgKCApID0gUGF0aWVudC5pZAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGFuZCBDTlNNZWQuaXNDb21tdW5pdHkgKCApCiAgICAgICAgYW5kIENOU01lZC5tZWRpY2F0aW9uUmVxdWVzdFBlcmlvZCAoICkgb3ZlcmxhcHMgYmVmb3JlIGRheSBvZiBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggRGl1cmV0aWMgQWN0aXZlIGF0IEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdpdGggWyJNZWRpY2F0aW9uUmVxdWVzdCI6ICJEaXVyZXRpY3MiXSBEaXVyZXRpY01lZAogICAgICBzdWNoIHRoYXQgRGl1cmV0aWNNZWQuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICAgICBhbmQgKCBEaXVyZXRpY01lZC5pbnRlbnQgPSAnb3JkZXInCiAgICAgICAgICAgIG9yICggRGl1cmV0aWNNZWQuaW50ZW50ID0gJ3BsYW4nCiAgICAgICAgICAgICAgICBhbmQgRGl1cmV0aWNNZWQuc3ViamVjdC5yZWZlcmVuY2UuZ2V0SWQgKCApID0gUGF0aWVudC5pZAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGFuZCBEaXVyZXRpY01lZC5pc0NvbW11bml0eSAoICkKICAgICAgICBhbmQgRGl1cmV0aWNNZWQubWVkaWNhdGlvblJlcXVlc3RQZXJpb2QgKCApIG92ZXJsYXBzIGJlZm9yZSBkYXkgb2YgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZAoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIE9waW9pZCBNZWRpY2F0aW9uIEFjdGl2ZSBhdCBBZG1pc3Npb24iOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aXRoIFsiTWVkaWNhdGlvblJlcXVlc3QiOiAiT3Bpb2lkcyJdIE9waW9pZE1lZAogICAgICBzdWNoIHRoYXQgT3Bpb2lkTWVkLnN0YXR1cyBpbiB7ICdhY3RpdmUnLCAnY29tcGxldGVkJyB9CiAgICAgICAgYW5kICggT3Bpb2lkTWVkLmludGVudCA9ICdvcmRlcicKICAgICAgICAgICAgb3IgKCBPcGlvaWRNZWQuaW50ZW50ID0gJ3BsYW4nCiAgICAgICAgICAgICAgICBhbmQgT3Bpb2lkTWVkLnN1YmplY3QucmVmZXJlbmNlLmdldElkICggKSA9IFBhdGllbnQuaWQKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICBhbmQgT3Bpb2lkTWVkLmlzQ29tbXVuaXR5ICggKQogICAgICAgIGFuZCBPcGlvaWRNZWQubWVkaWNhdGlvblJlcXVlc3RQZXJpb2QgKCApIG92ZXJsYXBzIGJlZm9yZSBkYXkgb2YgSW5wYXRpZW50RW5jb3VudGVyLnBlcmlvZAoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIENvYWd1bGF0aW9uIERpc29yZGVyIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIkNvYWd1bGF0aW9uIERpc29yZGVycyIsICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCIgKQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIERlbGlyaXVtIG9yIERlbWVudGlhIG9yIE90aGVyIFBzeWNob3NpcyBQcmVzZW50IG9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJEZWxpcml1bSwgRGVtZW50aWEsIGFuZCBPdGhlciBQc3ljaG9zZXMiLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFbmNvdW50ZXIgd2l0aCBEZXByZXNzaW9uIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIkRlcHJlc3Npb24iLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFbmNvdW50ZXIgd2l0aCBFcGlsZXBzeSBQcmVzZW50IG9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJFcGlsZXBzeSIsICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCIgKQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIExldWtlbWlhIG9yIEx5bXBob21hIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIkxldWtlbWlhIG9yIEx5bXBob21hIiwgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiApCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggTGl2ZXIgRGlzZWFzZSBNb2RlcmF0ZSB0byBTZXZlcmUgUHJlc2VudCBvbiBBZG1pc3Npb24iOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aGVyZSBJbnBhdGllbnRFbmNvdW50ZXIuaXNEaWFnbm9zaXNQcmVzZW50T25BZG1pc3Npb24gKCAiTGl2ZXIgRGlzZWFzZSBNb2RlcmF0ZSB0byBTZXZlcmUiLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFbmNvdW50ZXIgd2l0aCBNYWxpZ25hbnQgQm9uZSBEaXNlYXNlIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIk1hbGlnbmFudCBCb25lIERpc2Vhc2UiLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFbmNvdW50ZXIgd2l0aCBOZXVyb2xvZ2ljIERpc29yZGVyIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIk5ldXJvbG9naWMgTW92ZW1lbnQgYW5kIFJlbGF0ZWQgRGlzb3JkZXJzIiwgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiApCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggT2Jlc2l0eSBQcmVzZW50IG9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJPYmVzaXR5IiwgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiApCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggT3N0ZW9wb3Jvc2lzIFByZXNlbnQgb24gQWRtaXNzaW9uIjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmlzRGlhZ25vc2lzUHJlc2VudE9uQWRtaXNzaW9uICggIk9zdGVvcG9yb3NpcyIsICJQcmVzZW50IG9uIEFkbWlzc2lvbiBvciBDbGluaWNhbGx5IFVuZGV0ZXJtaW5lZCIgKQoKZGVmaW5lICJSaXNrIFZhcmlhYmxlIEVuY291bnRlciB3aXRoIFBlcmlwaGVyYWwgTmV1cm9wYXRoeSBQcmVzZW50IG9uIEFkbWlzc2lvbiI6CiAgIlF1YWxpZnlpbmcgRW5jb3VudGVyIiBJbnBhdGllbnRFbmNvdW50ZXIKICAgIHdoZXJlIElucGF0aWVudEVuY291bnRlci5pc0RpYWdub3Npc1ByZXNlbnRPbkFkbWlzc2lvbiAoICJQZXJpcGhlcmFsIE5ldXJvcGF0aHkiLCAiUHJlc2VudCBvbiBBZG1pc3Npb24gb3IgQ2xpbmljYWxseSBVbmRldGVybWluZWQiICkKCmRlZmluZSAiUmlzayBWYXJpYWJsZSBFbmNvdW50ZXIgd2l0aCBTdHJva2UgUHJlc2VudCBvbiBBZG1pc3Npb24iOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aGVyZSBJbnBhdGllbnRFbmNvdW50ZXIuaXNEaWFnbm9zaXNQcmVzZW50T25BZG1pc3Npb24gKCAiU3Ryb2tlIiwgIlByZXNlbnQgb24gQWRtaXNzaW9uIG9yIENsaW5pY2FsbHkgVW5kZXRlcm1pbmVkIiApCgpkZWZpbmUgIlJpc2sgVmFyaWFibGUgRW5jb3VudGVyIHdpdGggU3VpY2lkZSBBdHRlbXB0IjoKICAiUXVhbGlmeWluZyBFbmNvdW50ZXIiIElucGF0aWVudEVuY291bnRlcgogICAgd2hlcmUgSW5wYXRpZW50RW5jb3VudGVyLmVuY291bnRlcnNEaWFnbm9zaXMgKCApLmNvZGUgaW4gIlN1aWNpZGUgQXR0ZW1wdCIKCmRlZmluZSAiU0RFIEV0aG5pY2l0eSI6CiAgU0RFLiJTREUgRXRobmljaXR5IgoKZGVmaW5lICJTREUgUGF5ZXIiOgogIFNERS4iU0RFIFBheWVyIgoKZGVmaW5lICJTREUgUmFjZSI6CiAgU0RFLiJTREUgUmFjZSIKCmRlZmluZSAiU0RFIFNleCI6CiAgU0RFLiJTREUgU2V4IgoKZGVmaW5lIGZ1bmN0aW9uICJEZW5vbWluYXRvciBPYnNlcnZhdGlvbiIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIGR1cmF0aW9uIGluIGRheXMgb2YgUXVhbGlmeWluZ0VuY291bnRlci5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCgpkZWZpbmUgZnVuY3Rpb24gIk51bWVyYXRvciBPYnNlcnZhdGlvbiIoUXVhbGlmeWluZ0VuY291bnRlciBFbmNvdW50ZXIpOgogIENvdW50KCJOdW1lcmF0b3IiIEZhbGxzRW5jb3VudGVyCiAgICAgIHdoZXJlIEZhbGxzRW5jb3VudGVyLnBlcmlvZCBlbmRzIGR1cmluZyBRdWFsaWZ5aW5nRW5jb3VudGVyLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbigpCiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBoYXNEaWFnbm9zaXNOb3RQcmVzZW50T25BZG1pc3Npb25Pck51bGwoZW5jb3VudGVyIEVuY291bnRlciwgZGlhZ25vc2lzVmFsdWVTZXQgU3lzdGVtLlZhbHVlU2V0KToKICBleGlzdHMgKCBbQ2xhaW1dIEMKICAgICAgd2hlcmUgQy5zdGF0dXMgPSAnYWN0aXZlJwogICAgICAgIGFuZCBDLnVzZSA9ICdjbGFpbScKICAgICAgICBhbmQgZXhpc3RzICggQy5pdGVtIEkKICAgICAgICAgICAgd2hlcmUgSS5lbmNvdW50ZXIucmVmZXJlbmNlcyAoIGVuY291bnRlciApCiAgICAgICAgKQogICAgICByZXR1cm4gQy5kaWFnbm9zaXMgRAogICAgICAgIHdoZXJlIGV4aXN0cyAoIEMuaXRlbSBJCiAgICAgICAgICAgIHdoZXJlIEkuZW5jb3VudGVyLnJlZmVyZW5jZXMgKCBlbmNvdW50ZXIgKQogICAgICAgICAgICAgIGFuZCBELnNlcXVlbmNlIGluIEkuZGlhZ25vc2lzU2VxdWVuY2UKICAgICAgICApCiAgICAgICAgICBhbmQgKCBELm9uQWRtaXNzaW9uIGlzIG51bGwKICAgICAgICAgICAgICBvciBELm9uQWRtaXNzaW9uIGluICJOb3QgUHJlc2VudCBPbiBBZG1pc3Npb24gb3IgRG9jdW1lbnRhdGlvbiBJbnN1ZmZpY2llbnQgdG8gRGV0ZXJtaW5lIgogICAgICAgICAgKQogICAgICAgICAgYW5kIEQuZGlhZ25vc2lzIGFzIEZISVIuQ29kZWFibGVDb25jZXB0IGluIGRpYWdub3Npc1ZhbHVlU2V0CiAgKQoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBlbmNvdW50ZXJzRGlhZ25vc2lzKEVuY291bnRlciBFbmNvdW50ZXIpOgogIEVuY291bnRlci5yZWFzb25SZWZlcmVuY2UgRW5jRGlhZwogICAgcmV0dXJuIHNpbmdsZXRvbiBmcm9tICggKCBbQ29uZGl0aW9uRW5jb3VudGVyRGlhZ25vc2lzXSBDb25kaXRpb25FRAogICAgICAgIHVuaW9uIFtDb25kaXRpb25Qcm9ibGVtc0hlYWx0aENvbmNlcm5zXSBDb25kaXRpb25QSEMgKSBDb25kCiAgICAgICAgd2hlcmUgRW5jRGlhZy5yZWZlcmVuY2VzICggQ29uZC5pZCApCiAgICAp",
"url" : "https://madie.cms.gov/Library-CMS1017FHIRHHFI.cql"
}
]
}