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 |
<Library xmlns="http://hl7.org/fhir">
<id value="CMS871FHIRHHHyper"/>
<text>
<status value="extensions"/>
<div xmlns="http://www.w3.org/1999/xhtml">
<table class="narrative-table">
<tbody>
<tr>
<th colspan="2" scope="row" class="row-header"><a name="metadata"> </a>Metadata</th>
</tr>
<tr>
<th scope="row" class="row-header">Version</th>
<td class="content-container">1.1.000</td>
</tr>
<tr>
<th scope="row" class="row-header">Status</th>
<td class="content-container">Draft</td>
</tr>
<tr>
<th scope="row" class="row-header">Type</th>
<td class="content-container">
<a href="http://terminology.hl7.org/7.1.0/CodeSystem-library-type.html">http://terminology.hl7.org/CodeSystem/library-type</a>#logic-library
</td>
</tr>
<tr>
<th colspan="2" scope="row" class="row-header"><a name="parameters"> </a>Parameters</th>
</tr>
<tr>
<th scope="row" class="row-header">Parameter</th>
<td class="content-container">None</td>
</tr>
<tr>
<th colspan="2" scope="row" class="row-header">Library Content</th>
</tr>
<tr>
<th scope="row" class="row-header">CQL Content</th>
<td>
<a name="cql-content"> </a>
<pre style="border: none;" class="content-container highlight language-cql"><code class="language-cql">/*
NOTE: For use by March 2026 US Realm Connectathon participants for internal use only. Not for use or distribution in commercial products.
*/
library CMS871FHIRHHHyper version '1.1.000'
using USQualityCore version '0.1.0-cibuild'
using USCore version '6.1.0-derived'
using FHIR version '4.0.1'
include hl7.fhir.uv.cql.FHIRHelpers version '4.0.1' called FHIRHelpers
include hl7.fhir.uv.cql.FHIRCommon version '2.0.0' called FHIRCommon
include hl7.fhir.us.cql.USCoreCommon version '2.0.0-ballot' called USCoreCommon
include hl7.fhir.us.cql.USCoreElements version '2.0.0-ballot' called USCoreElements
include CQMCommon version '5.1.000' called CQMCommon
include USQualityCoreCommon version '0.1.0-cibuild' called USQualityCoreCommon
include SupplementalDataElements version '6.1.000' called SDE
include Status version '2.1.000' called Status
valueset "Comfort Measures": 'http://cts.nlm.nih.gov/fhir/ValueSet/1.3.6.1.4.1.33895.1.3.0.45'
valueset "Diabetes": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.464.1003.103.12.1001'
valueset "Discharged to Health Care Facility for Hospice Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.207'
valueset "Discharged to Home for Hospice Care": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.117.1.7.1.209'
valueset "Encounter Inpatient": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113883.3.666.5.307'
valueset "Glucose Lab Test Mass Per Volume": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1248.34'
valueset "Hypoglycemics Treatment Medications": 'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1196.394'
parameter "Measurement Period" Interval<DateTime>
default Interval[@2026-01-01T00:00:00.000Z, @2027-01-01T00:00:00.000Z)
context Patient
define "Comfort Measures Care":
( ["Procedure": "Comfort Measures"] ProcedureCM
where ProcedureCM.status = 'completed'
)
union ( ["ServiceRequest": "Comfort Measures"] ServiceReq
where ServiceReq.status in { 'active', 'completed' }
)
define "Days in Hospitalization":
"Measurement Population" EligibleInpatientHospitalization
let period: EligibleInpatientHospitalization.hospitalizationWithObservation ( ),
relevantPeriod: period.hospitalDaysMax10 ( )
return Tuple {
encounter: EligibleInpatientHospitalization,
hospitalizationPeriod: period,
relevantPeriod: relevantPeriod,
relevantDays: relevantPeriod.daysInPeriod ( )
}
define "Days with Glucose Results":
"Days in Hospitalization" InpatientHospitalDays
return Tuple {
encounter: InpatientHospitalDays.encounter,
relevantPeriod: InpatientHospitalDays.relevantPeriod,
relevantDays: ( InpatientHospitalDays.relevantDays EncounterDay
return Tuple {
dayNumber: EncounterDay.dayIndex,
dayPeriod: EncounterDay.dayPeriod,
hasSevereResult: exists ( ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest
where GlucoseTest.status in { 'final', 'amended', 'corrected' }
and GlucoseTest.value > 300 'mg/dL'
and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod
),
hasElevatedResult: exists ( ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest
where GlucoseTest.status in { 'final', 'amended', 'corrected' }
and GlucoseTest.value >= 200 'mg/dL'
and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod
),
hasNoGlucoseTest: not exists ( ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest
where GlucoseTest.status in { 'final', 'amended', 'corrected' }
and GlucoseTest.effective.earliest ( ) during EncounterDay.dayPeriod
)
}
)
}
define "Days with Hyperglycemic Events":
"Days with Glucose Results" EncounterWithResultDays
let eligibleEventDays: EncounterWithResultDays.relevantDays EncounterDay
where EncounterDay.dayNumber > 1
return Tuple {
dayIndex: EncounterDay.dayNumber,
dayPeriod: EncounterDay.dayPeriod,
hasHyperglycemicEvent: ( EncounterDay.hasSevereResult
or ( EncounterDay.hasNoGlucoseTest
and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 2].hasElevatedResult
and EncounterWithResultDays.relevantDays[EncounterDay.dayNumber - 3].hasElevatedResult
)
)
}
return Tuple {
encounter: EncounterWithResultDays.encounter,
relevantPeriod: EncounterWithResultDays.relevantPeriod,
eligibleEventDays: eligibleEventDays
}
define "Denominator":
"Initial Population"
define "Denominator Exclusions":
"Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care"
define "Encounter with Comfort Measures during Hospitalization":
"Initial Population" InpatientHospitalization
with "Comfort Measures Care" ComfortCare
such that Coalesce(ComfortCare.performed.toInterval(), ComfortCare.authoredOn.toInterval()) starts during InpatientHospitalization.hospitalizationWithObservation ( )
define "Encounter with Discharge for Hospice Care":
"Initial Population" InpatientHospitalization
where InpatientHospitalization.hospitalization.dischargeDisposition in "Discharged to Home for Hospice Care"
or InpatientHospitalization.hospitalization.dischargeDisposition in "Discharged to Health Care Facility for Hospice Care"
define "Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care":
"Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start"
union "Encounter with Comfort Measures during Hospitalization"
union "Encounter with Discharge for Hospice Care"
define "Encounter with Elevated Glucose Greater Than or Equal to 200":
"Encounter with Hospitalization Period" Hospitalization
with ["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest
such that GlucoseTest.effective.earliest ( ) during Hospitalization.hospitalizationPeriod
and GlucoseTest.status in { 'final', 'amended', 'corrected' }
and GlucoseTest.value >= 200 'mg/dL'
return Hospitalization.encounter
define "Encounter with Existing Diabetes Diagnosis":
"Encounter with Hospitalization Period" Hospitalization
with ( ( [ConditionEncounterDiagnosis: "Diabetes"] DiabetesEncounter
where ( Hospitalization.encounter.reasonReference.references ( DiabetesEncounter )
or Hospitalization.encounter.reasonCode in "Diabetes"
)
and DiabetesEncounter.prevalenceInterval ( ) starts before end of Hospitalization.hospitalizationPeriod
)
union ( [ConditionProblemsHealthConcerns: "Diabetes"] DiabetesProblem
where DiabetesProblem.verificationStatus is not null implies ( DiabetesProblem.verificationStatus ~ Status."confirmed"
or DiabetesProblem.verificationStatus ~ Status."unconfirmed"
or DiabetesProblem.verificationStatus ~ Status."provisional"
or DiabetesProblem.verificationStatus ~ Status."differential"
)
and DiabetesProblem.prevalenceInterval ( ) starts before end of Hospitalization.hospitalizationPeriod
) ) DiabetesCondition
such that DiabetesCondition.subject.reference = Hospitalization.encounter.subject.reference
return Hospitalization.encounter
define "Encounter with Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":
from
"Initial Population" InpatientHospitalization,
"Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start" EarlyGlucoseResult
where EarlyGlucoseResult.value as Quantity > 600 'mg/dL'
and EarlyGlucoseResult.status in { 'final', 'amended', 'corrected' }
and EarlyGlucoseResult.effective.earliest ( ) during Interval[( start of InpatientHospitalization.hospitalizationWithObservation ( ) - 1 hour ), ( start of InpatientHospitalization.hospitalizationWithObservation ( ) + 6 hours )]
return InpatientHospitalization
define "Encounter with Hospitalization Period":
"Qualifying Encounter" QualifyingHospitalization
return Tuple {
encounter: QualifyingHospitalization,
hospitalizationPeriod: QualifyingHospitalization.hospitalizationWithObservation ( )
}
define "Encounter with Hyperglycemic Events":
"Days with Hyperglycemic Events" HyperglycemicEventDays
where exists ( HyperglycemicEventDays.eligibleEventDays EligibleEventDay
where EligibleEventDay.hasHyperglycemicEvent
)
return HyperglycemicEventDays.encounter
define "Encounter with Hypoglycemic Medication":
from
"Encounter with Hospitalization Period" Hospitalization,
["MedicationAdministration": "Hypoglycemics Treatment Medications"] HypoglycemicMed
where HypoglycemicMed.status in { 'completed', 'in-progress' }
and HypoglycemicMed.effective.toInterval ( ) during Hospitalization.hospitalizationPeriod
return Hospitalization.encounter
define "Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":
from
"Initial Population" InpatientHospitalization,
["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] GlucoseTest
let HospitalizationInterval: InpatientHospitalization.hospitalizationWithObservation ( ),
GlucoseTestTime: GlucoseTest.effective.earliest ( )
where GlucoseTest.value as Quantity > 600 'mg/dL'
and GlucoseTest.status in { 'final', 'amended', 'corrected' }
and GlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hours )]
return GlucoseTest
define "Glucose Tests Earlier Than Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":
from
"Initial Population" InpatientHospitalization,
"Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start" GlucoseResult600,
["LaboratoryResultObservation": "Glucose Lab Test Mass Per Volume"] EarlierGlucoseTest
let HospitalizationInterval: InpatientHospitalization.hospitalizationWithObservation ( ),
GlucoseTest600Time: GlucoseResult600.effective.earliest ( ),
EarlierGlucoseTestTime: EarlierGlucoseTest.effective.earliest ( )
where GlucoseTest600Time during Interval[( start of HospitalizationInterval - 1 hour ), ( start of HospitalizationInterval + 6 hour )]
and EarlierGlucoseTestTime during Interval[( start of HospitalizationInterval - 1 hour ), GlucoseTest600Time )
and EarlierGlucoseTest.id !~ GlucoseResult600.id
return GlucoseResult600
define "Initial Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start":
"Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start" GlucoseResult600
where not ( GlucoseResult600.id in "Glucose Tests Earlier Than Glucose Greater Than 600 within 1 Hour Prior To and 6 Hours After Encounter Start".id )
define "Initial Population":
"Encounter with Existing Diabetes Diagnosis"
union "Encounter with Hypoglycemic Medication"
union "Encounter with Elevated Glucose Greater Than or Equal to 200"
define "Measurement Population":
"Denominator"
define "Numerator":
"Encounter with Hyperglycemic Events"
define "Numerator Exclusions":
"Encounter with Early Glucose Greater Than 600 or with Comfort or Hospice Care"
define "Qualifying Encounter":
["Encounter": "Encounter Inpatient"] InpatientEncounter
where AgeInYearsAt(date from start of InpatientEncounter.period) >= 18
and InpatientEncounter.period ends during day of "Measurement Period"
and InpatientEncounter.status = 'finished'
define "SDE Ethnicity":
SDE."SDE Ethnicity"
define "SDE Payer":
SDE."SDE Payer"
define "SDE Race":
SDE."SDE Race"
define "SDE Sex":
SDE."SDE Sex"
define fluent function hospitalDaysMax10(Period Interval<DateTime>):
Interval[start of Period, Min({
end of Period, start of Period + 10 days }
)]
define function "Denominator Observations"(QualifyingEncounter Encounter):
if QualifyingEncounter.id in "Denominator Exclusions".id then singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays
where EncounterWithEventDays.encounter = QualifyingEncounter
return 0
)
else singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays
where EncounterWithEventDays.encounter = QualifyingEncounter
return Count(EncounterWithEventDays.eligibleEventDays)
)
define function "Numerator Observations"(QualifyingEncounter Encounter):
if QualifyingEncounter.id in "Denominator Exclusions".id then singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays
where EncounterWithEventDays.encounter = QualifyingEncounter
return 0
)
else singleton from ( "Days with Hyperglycemic Events" EncounterWithEventDays
where EncounterWithEventDays.encounter = QualifyingEncounter
return Count(EncounterWithEventDays.eligibleEventDays EligibleEventDay
where EligibleEventDay.hasHyperglycemicEvent
)
)</code></pre>
</td>
</tr>
<tr>
<th colspan="2" scope="row" class="row-header">Generated using version 0.5.6 of the sample-content-ig Liquid templates</th>
</tr>
</tbody>
</table>
</div>
</text>
<extension
url="http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-softwaresystem">
<valueReference>
<reference value="Device/cqf-tooling"/>
</valueReference>
</extension>
<url value="https://madie.cms.gov/Library/CMS871FHIRHHHyper"/>
<version value="1.1.000"/>
<name value="CMS871FHIRHHHyper"/>
<status value="draft"/>
<type>
<coding>
<system value="http://terminology.hl7.org/CodeSystem/library-type"/>
<code value="logic-library"/>
</coding>
</type>
<date value="2026-09-19T16:31:14+00:00"/>
<content>
<contentType value="text/cql"/>
<data
value="LyoKTk9URTogRm9yIHVzZSBieSBNYXJjaCAyMDI2IFVTIFJlYWxtIENvbm5lY3RhdGhvbiBwYXJ0aWNpcGFudHMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBOb3QgZm9yIHVzZSBvciBkaXN0cmlidXRpb24gaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4KKi8KbGlicmFyeSBDTVM4NzFGSElSSEhIeXBlciB2ZXJzaW9uICcxLjEuMDAwJwoKdXNpbmcgVVNRdWFsaXR5Q29yZSB2ZXJzaW9uICcwLjEuMC1jaWJ1aWxkJwp1c2luZyBVU0NvcmUgdmVyc2lvbiAnNi4xLjAtZGVyaXZlZCcKdXNpbmcgRkhJUiB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgaGw3LmZoaXIudXYuY3FsLkZISVJIZWxwZXJzIHZlcnNpb24gJzQuMC4xJyBjYWxsZWQgRkhJUkhlbHBlcnMKaW5jbHVkZSBobDcuZmhpci51di5jcWwuRkhJUkNvbW1vbiB2ZXJzaW9uICcyLjAuMCcgY2FsbGVkIEZISVJDb21tb24KaW5jbHVkZSBobDcuZmhpci51cy5jcWwuVVNDb3JlQ29tbW9uIHZlcnNpb24gJzIuMC4wLWJhbGxvdCcgY2FsbGVkIFVTQ29yZUNvbW1vbgppbmNsdWRlIGhsNy5maGlyLnVzLmNxbC5VU0NvcmVFbGVtZW50cyB2ZXJzaW9uICcyLjAuMC1iYWxsb3QnIGNhbGxlZCBVU0NvcmVFbGVtZW50cwoKaW5jbHVkZSBDUU1Db21tb24gdmVyc2lvbiAnNS4xLjAwMCcgY2FsbGVkIENRTUNvbW1vbgppbmNsdWRlIFVTUXVhbGl0eUNvcmVDb21tb24gdmVyc2lvbiAnMC4xLjAtY2lidWlsZCcgY2FsbGVkIFVTUXVhbGl0eUNvcmVDb21tb24KaW5jbHVkZSBTdXBwbGVtZW50YWxEYXRhRWxlbWVudHMgdmVyc2lvbiAnNi4xLjAwMCcgY2FsbGVkIFNERQppbmNsdWRlIFN0YXR1cyB2ZXJzaW9uICcyLjEuMDAwJyBjYWxsZWQgU3RhdHVzCgp2YWx1ZXNldCAiQ29tZm9ydCBNZWFzdXJlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMS4zLjYuMS40LjEuMzM4OTUuMS4zLjAuNDUnCnZhbHVlc2V0ICJEaWFiZXRlcyI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy40NjQuMTAwMy4xMDMuMTIuMTAwMScKdmFsdWVzZXQgIkRpc2NoYXJnZWQgdG8gSGVhbHRoIENhcmUgRmFjaWxpdHkgZm9yIEhvc3BpY2UgQ2FyZSI6ICdodHRwOi8vY3RzLm5sbS5uaWguZ292L2ZoaXIvVmFsdWVTZXQvMi4xNi44NDAuMS4xMTM4ODMuMy4xMTcuMS43LjEuMjA3Jwp2YWx1ZXNldCAiRGlzY2hhcmdlZCB0byBIb21lIGZvciBIb3NwaWNlIENhcmUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuMTE3LjEuNy4xLjIwOScKdmFsdWVzZXQgIkVuY291bnRlciBJbnBhdGllbnQiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzODgzLjMuNjY2LjUuMzA3Jwp2YWx1ZXNldCAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMjQ4LjM0Jwp2YWx1ZXNldCAiSHlwb2dseWNlbWljcyBUcmVhdG1lbnQgTWVkaWNhdGlvbnMiOiAnaHR0cDovL2N0cy5ubG0ubmloLmdvdi9maGlyL1ZhbHVlU2V0LzIuMTYuODQwLjEuMTEzNzYyLjEuNC4xMTk2LjM5NCcKCnBhcmFtZXRlciAiTWVhc3VyZW1lbnQgUGVyaW9kIiBJbnRlcnZhbDxEYXRlVGltZT4KICBkZWZhdWx0IEludGVydmFsW0AyMDI2LTAxLTAxVDAwOjAwOjAwLjAwMFosIEAyMDI3LTAxLTAxVDAwOjAwOjAwLjAwMFopCgpjb250ZXh0IFBhdGllbnQKCmRlZmluZSAiQ29tZm9ydCBNZWFzdXJlcyBDYXJlIjoKICAoIFsiUHJvY2VkdXJlIjogIkNvbWZvcnQgTWVhc3VyZXMiXSBQcm9jZWR1cmVDTQogICAgICB3aGVyZSBQcm9jZWR1cmVDTS5zdGF0dXMgPSAnY29tcGxldGVkJwogICkKICAgIHVuaW9uICggWyJTZXJ2aWNlUmVxdWVzdCI6ICJDb21mb3J0IE1lYXN1cmVzIl0gU2VydmljZVJlcQogICAgICAgIHdoZXJlIFNlcnZpY2VSZXEuc3RhdHVzIGluIHsgJ2FjdGl2ZScsICdjb21wbGV0ZWQnIH0KICAgICkKCmRlZmluZSAiRGF5cyBpbiBIb3NwaXRhbGl6YXRpb24iOgogICJNZWFzdXJlbWVudCBQb3B1bGF0aW9uIiBFbGlnaWJsZUlucGF0aWVudEhvc3BpdGFsaXphdGlvbgogICAgbGV0IHBlcmlvZDogRWxpZ2libGVJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKSwKICAgIHJlbGV2YW50UGVyaW9kOiBwZXJpb2QuaG9zcGl0YWxEYXlzTWF4MTAgKCApCiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXI6IEVsaWdpYmxlSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLAogICAgICBob3NwaXRhbGl6YXRpb25QZXJpb2Q6IHBlcmlvZCwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IHJlbGV2YW50UGVyaW9kLAogICAgICByZWxldmFudERheXM6IHJlbGV2YW50UGVyaW9kLmRheXNJblBlcmlvZCAoICkKICAgIH0KCmRlZmluZSAiRGF5cyB3aXRoIEdsdWNvc2UgUmVzdWx0cyI6CiAgIkRheXMgaW4gSG9zcGl0YWxpemF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbERheXMKICAgIHJldHVybiBUdXBsZSB7CiAgICAgIGVuY291bnRlcjogSW5wYXRpZW50SG9zcGl0YWxEYXlzLmVuY291bnRlciwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IElucGF0aWVudEhvc3BpdGFsRGF5cy5yZWxldmFudFBlcmlvZCwKICAgICAgcmVsZXZhbnREYXlzOiAoIElucGF0aWVudEhvc3BpdGFsRGF5cy5yZWxldmFudERheXMgRW5jb3VudGVyRGF5CiAgICAgICAgICByZXR1cm4gVHVwbGUgewogICAgICAgICAgICBkYXlOdW1iZXI6IEVuY291bnRlckRheS5kYXlJbmRleCwKICAgICAgICAgICAgZGF5UGVyaW9kOiBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kLAogICAgICAgICAgICBoYXNTZXZlcmVSZXN1bHQ6IGV4aXN0cyAoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QKICAgICAgICAgICAgICAgIHdoZXJlIEdsdWNvc2VUZXN0LnN0YXR1cyBpbiB7ICdmaW5hbCcsICdhbWVuZGVkJywgJ2NvcnJlY3RlZCcgfQogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QudmFsdWUgPiAzMDAgJ21nL2RMJwogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgRW5jb3VudGVyRGF5LmRheVBlcmlvZAogICAgICAgICAgICApLAogICAgICAgICAgICBoYXNFbGV2YXRlZFJlc3VsdDogZXhpc3RzICggWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiXSBHbHVjb3NlVGVzdAogICAgICAgICAgICAgICAgd2hlcmUgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgICAgICAgICAgIGFuZCBHbHVjb3NlVGVzdC52YWx1ZSA+PSAyMDAgJ21nL2RMJwogICAgICAgICAgICAgICAgICBhbmQgR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKSBkdXJpbmcgRW5jb3VudGVyRGF5LmRheVBlcmlvZAogICAgICAgICAgICApLAogICAgICAgICAgICBoYXNOb0dsdWNvc2VUZXN0OiBub3QgZXhpc3RzICggWyJMYWJvcmF0b3J5UmVzdWx0T2JzZXJ2YXRpb24iOiAiR2x1Y29zZSBMYWIgVGVzdCBNYXNzIFBlciBWb2x1bWUiXSBHbHVjb3NlVGVzdAogICAgICAgICAgICAgICAgd2hlcmUgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgICAgICAgICAgIGFuZCBHbHVjb3NlVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kCiAgICAgICAgICAgICkKICAgICAgICAgIH0KICAgICAgKQogICAgfQoKZGVmaW5lICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiOgogICJEYXlzIHdpdGggR2x1Y29zZSBSZXN1bHRzIiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cwogICAgbGV0IGVsaWdpYmxlRXZlbnREYXlzOiBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXMgRW5jb3VudGVyRGF5CiAgICAgIHdoZXJlIEVuY291bnRlckRheS5kYXlOdW1iZXIgPiAxCiAgICAgIHJldHVybiBUdXBsZSB7CiAgICAgICAgZGF5SW5kZXg6IEVuY291bnRlckRheS5kYXlOdW1iZXIsCiAgICAgICAgZGF5UGVyaW9kOiBFbmNvdW50ZXJEYXkuZGF5UGVyaW9kLAogICAgICAgIGhhc0h5cGVyZ2x5Y2VtaWNFdmVudDogKCBFbmNvdW50ZXJEYXkuaGFzU2V2ZXJlUmVzdWx0CiAgICAgICAgICAgIG9yICggRW5jb3VudGVyRGF5Lmhhc05vR2x1Y29zZVRlc3QKICAgICAgICAgICAgICAgIGFuZCBFbmNvdW50ZXJXaXRoUmVzdWx0RGF5cy5yZWxldmFudERheXNbRW5jb3VudGVyRGF5LmRheU51bWJlciAtIDJdLmhhc0VsZXZhdGVkUmVzdWx0CiAgICAgICAgICAgICAgICBhbmQgRW5jb3VudGVyV2l0aFJlc3VsdERheXMucmVsZXZhbnREYXlzW0VuY291bnRlckRheS5kYXlOdW1iZXIgLSAzXS5oYXNFbGV2YXRlZFJlc3VsdAogICAgICAgICAgICApCiAgICAgICAgKQogICAgICB9CiAgICByZXR1cm4gVHVwbGUgewogICAgICBlbmNvdW50ZXI6IEVuY291bnRlcldpdGhSZXN1bHREYXlzLmVuY291bnRlciwKICAgICAgcmVsZXZhbnRQZXJpb2Q6IEVuY291bnRlcldpdGhSZXN1bHREYXlzLnJlbGV2YW50UGVyaW9kLAogICAgICBlbGlnaWJsZUV2ZW50RGF5czogZWxpZ2libGVFdmVudERheXMKICAgIH0KCmRlZmluZSAiRGVub21pbmF0b3IiOgogICJJbml0aWFsIFBvcHVsYXRpb24iCgpkZWZpbmUgIkRlbm9taW5hdG9yIEV4Y2x1c2lvbnMiOgogICJFbmNvdW50ZXIgd2l0aCBFYXJseSBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgb3Igd2l0aCBDb21mb3J0IG9yIEhvc3BpY2UgQ2FyZSIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggQ29tZm9ydCBNZWFzdXJlcyBkdXJpbmcgSG9zcGl0YWxpemF0aW9uIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24KICAgIHdpdGggIkNvbWZvcnQgTWVhc3VyZXMgQ2FyZSIgQ29tZm9ydENhcmUKICAgICAgc3VjaCB0aGF0IENvYWxlc2NlKENvbWZvcnRDYXJlLnBlcmZvcm1lZC50b0ludGVydmFsKCksIENvbWZvcnRDYXJlLmF1dGhvcmVkT24udG9JbnRlcnZhbCgpKSBzdGFydHMgZHVyaW5nIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIERpc2NoYXJnZSBmb3IgSG9zcGljZSBDYXJlIjoKICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24KICAgIHdoZXJlIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb24uZGlzY2hhcmdlRGlzcG9zaXRpb24gaW4gIkRpc2NoYXJnZWQgdG8gSG9tZSBmb3IgSG9zcGljZSBDYXJlIgogICAgICBvciBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uLmRpc2NoYXJnZURpc3Bvc2l0aW9uIGluICJEaXNjaGFyZ2VkIHRvIEhlYWx0aCBDYXJlIEZhY2lsaXR5IGZvciBIb3NwaWNlIENhcmUiCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIEVhcmx5IEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCBvciB3aXRoIENvbWZvcnQgb3IgSG9zcGljZSBDYXJlIjoKICAiRW5jb3VudGVyIHdpdGggR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IgogICAgdW5pb24gIkVuY291bnRlciB3aXRoIENvbWZvcnQgTWVhc3VyZXMgZHVyaW5nIEhvc3BpdGFsaXphdGlvbiIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBEaXNjaGFyZ2UgZm9yIEhvc3BpY2UgQ2FyZSIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggRWxldmF0ZWQgR2x1Y29zZSBHcmVhdGVyIFRoYW4gb3IgRXF1YWwgdG8gMjAwIjoKICAiRW5jb3VudGVyIHdpdGggSG9zcGl0YWxpemF0aW9uIFBlcmlvZCIgSG9zcGl0YWxpemF0aW9uCiAgICB3aXRoIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gR2x1Y29zZVRlc3QKICAgICAgc3VjaCB0aGF0IEdsdWNvc2VUZXN0LmVmZmVjdGl2ZS5lYXJsaWVzdCAoICkgZHVyaW5nIEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25QZXJpb2QKICAgICAgICBhbmQgR2x1Y29zZVRlc3Quc3RhdHVzIGluIHsgJ2ZpbmFsJywgJ2FtZW5kZWQnLCAnY29ycmVjdGVkJyB9CiAgICAgICAgYW5kIEdsdWNvc2VUZXN0LnZhbHVlID49IDIwMCAnbWcvZEwnCiAgICByZXR1cm4gSG9zcGl0YWxpemF0aW9uLmVuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBFeGlzdGluZyBEaWFiZXRlcyBEaWFnbm9zaXMiOgogICJFbmNvdW50ZXIgd2l0aCBIb3NwaXRhbGl6YXRpb24gUGVyaW9kIiBIb3NwaXRhbGl6YXRpb24KICAgIHdpdGggKCAoIFtDb25kaXRpb25FbmNvdW50ZXJEaWFnbm9zaXM6ICJEaWFiZXRlcyJdIERpYWJldGVzRW5jb3VudGVyCiAgICAgICAgd2hlcmUgKCBIb3NwaXRhbGl6YXRpb24uZW5jb3VudGVyLnJlYXNvblJlZmVyZW5jZS5yZWZlcmVuY2VzICggRGlhYmV0ZXNFbmNvdW50ZXIgKQogICAgICAgICAgICBvciBIb3NwaXRhbGl6YXRpb24uZW5jb3VudGVyLnJlYXNvbkNvZGUgaW4gIkRpYWJldGVzIgogICAgICAgICkKICAgICAgICAgIGFuZCBEaWFiZXRlc0VuY291bnRlci5wcmV2YWxlbmNlSW50ZXJ2YWwgKCApIHN0YXJ0cyBiZWZvcmUgZW5kIG9mIEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25QZXJpb2QKICAgICkKICAgICAgdW5pb24gKCBbQ29uZGl0aW9uUHJvYmxlbXNIZWFsdGhDb25jZXJuczogIkRpYWJldGVzIl0gRGlhYmV0ZXNQcm9ibGVtCiAgICAgICAgICB3aGVyZSBEaWFiZXRlc1Byb2JsZW0udmVyaWZpY2F0aW9uU3RhdHVzIGlzIG5vdCBudWxsIGltcGxpZXMgKCBEaWFiZXRlc1Byb2JsZW0udmVyaWZpY2F0aW9uU3RhdHVzIH4gU3RhdHVzLiJjb25maXJtZWQiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4idW5jb25maXJtZWQiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4icHJvdmlzaW9uYWwiCiAgICAgICAgICAgICAgb3IgRGlhYmV0ZXNQcm9ibGVtLnZlcmlmaWNhdGlvblN0YXR1cyB+IFN0YXR1cy4iZGlmZmVyZW50aWFsIgogICAgICAgICAgKQogICAgICAgICAgICBhbmQgRGlhYmV0ZXNQcm9ibGVtLnByZXZhbGVuY2VJbnRlcnZhbCAoICkgc3RhcnRzIGJlZm9yZSBlbmQgb2YgSG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvblBlcmlvZAogICAgICApICkgRGlhYmV0ZXNDb25kaXRpb24KICAgICAgc3VjaCB0aGF0IERpYWJldGVzQ29uZGl0aW9uLnN1YmplY3QucmVmZXJlbmNlID0gSG9zcGl0YWxpemF0aW9uLmVuY291bnRlci5zdWJqZWN0LnJlZmVyZW5jZQogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXIKCmRlZmluZSAiRW5jb3VudGVyIHdpdGggR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IjoKICBmcm9tCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sCiAgICAiSW5pdGlhbCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiA2MDAgd2l0aGluIDEgSG91ciBQcmlvciBUbyBhbmQgNiBIb3VycyBBZnRlciBFbmNvdW50ZXIgU3RhcnQiIEVhcmx5R2x1Y29zZVJlc3VsdAogICAgd2hlcmUgRWFybHlHbHVjb3NlUmVzdWx0LnZhbHVlIGFzIFF1YW50aXR5ID4gNjAwICdtZy9kTCcKICAgICAgYW5kIEVhcmx5R2x1Y29zZVJlc3VsdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEVhcmx5R2x1Y29zZVJlc3VsdC5lZmZlY3RpdmUuZWFybGllc3QgKCApIGR1cmluZyBJbnRlcnZhbFsoIHN0YXJ0IG9mIElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApIC0gMSBob3VyICksICggc3RhcnQgb2YgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvbldpdGhPYnNlcnZhdGlvbiAoICkgKyA2IGhvdXJzICldCiAgICByZXR1cm4gSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uCgpkZWZpbmUgIkVuY291bnRlciB3aXRoIEhvc3BpdGFsaXphdGlvbiBQZXJpb2QiOgogICJRdWFsaWZ5aW5nIEVuY291bnRlciIgUXVhbGlmeWluZ0hvc3BpdGFsaXphdGlvbgogICAgcmV0dXJuIFR1cGxlIHsKICAgICAgZW5jb3VudGVyOiBRdWFsaWZ5aW5nSG9zcGl0YWxpemF0aW9uLAogICAgICBob3NwaXRhbGl6YXRpb25QZXJpb2Q6IFF1YWxpZnlpbmdIb3NwaXRhbGl6YXRpb24uaG9zcGl0YWxpemF0aW9uV2l0aE9ic2VydmF0aW9uICggKQogICAgfQoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyI6CiAgIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgSHlwZXJnbHljZW1pY0V2ZW50RGF5cwogICAgd2hlcmUgZXhpc3RzICggSHlwZXJnbHljZW1pY0V2ZW50RGF5cy5lbGlnaWJsZUV2ZW50RGF5cyBFbGlnaWJsZUV2ZW50RGF5CiAgICAgICAgd2hlcmUgRWxpZ2libGVFdmVudERheS5oYXNIeXBlcmdseWNlbWljRXZlbnQKICAgICkKICAgIHJldHVybiBIeXBlcmdseWNlbWljRXZlbnREYXlzLmVuY291bnRlcgoKZGVmaW5lICJFbmNvdW50ZXIgd2l0aCBIeXBvZ2x5Y2VtaWMgTWVkaWNhdGlvbiI6CiAgZnJvbQogICAgIkVuY291bnRlciB3aXRoIEhvc3BpdGFsaXphdGlvbiBQZXJpb2QiIEhvc3BpdGFsaXphdGlvbiwKICAgIFsiTWVkaWNhdGlvbkFkbWluaXN0cmF0aW9uIjogIkh5cG9nbHljZW1pY3MgVHJlYXRtZW50IE1lZGljYXRpb25zIl0gSHlwb2dseWNlbWljTWVkCiAgICB3aGVyZSBIeXBvZ2x5Y2VtaWNNZWQuc3RhdHVzIGluIHsgJ2NvbXBsZXRlZCcsICdpbi1wcm9ncmVzcycgfQogICAgICBhbmQgSHlwb2dseWNlbWljTWVkLmVmZmVjdGl2ZS50b0ludGVydmFsICggKSBkdXJpbmcgSG9zcGl0YWxpemF0aW9uLmhvc3BpdGFsaXphdGlvblBlcmlvZAogICAgcmV0dXJuIEhvc3BpdGFsaXphdGlvbi5lbmNvdW50ZXIKCmRlZmluZSAiR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0IjoKICBmcm9tCiAgICAiSW5pdGlhbCBQb3B1bGF0aW9uIiBJbnBhdGllbnRIb3NwaXRhbGl6YXRpb24sCiAgICBbIkxhYm9yYXRvcnlSZXN1bHRPYnNlcnZhdGlvbiI6ICJHbHVjb3NlIExhYiBUZXN0IE1hc3MgUGVyIFZvbHVtZSJdIEdsdWNvc2VUZXN0CiAgICBsZXQgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWw6IElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLAogICAgR2x1Y29zZVRlc3RUaW1lOiBHbHVjb3NlVGVzdC5lZmZlY3RpdmUuZWFybGllc3QgKCApCiAgICB3aGVyZSBHbHVjb3NlVGVzdC52YWx1ZSBhcyBRdWFudGl0eSA+IDYwMCAnbWcvZEwnCiAgICAgIGFuZCBHbHVjb3NlVGVzdC5zdGF0dXMgaW4geyAnZmluYWwnLCAnYW1lbmRlZCcsICdjb3JyZWN0ZWQnIH0KICAgICAgYW5kIEdsdWNvc2VUZXN0VGltZSBkdXJpbmcgSW50ZXJ2YWxbKCBzdGFydCBvZiBIb3NwaXRhbGl6YXRpb25JbnRlcnZhbCAtIDEgaG91ciApLCAoIHN0YXJ0IG9mIEhvc3BpdGFsaXphdGlvbkludGVydmFsICsgNiBob3VycyApXQogICAgcmV0dXJuIEdsdWNvc2VUZXN0CgpkZWZpbmUgIkdsdWNvc2UgVGVzdHMgRWFybGllciBUaGFuIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6CiAgZnJvbQogICAgIkluaXRpYWwgUG9wdWxhdGlvbiIgSW5wYXRpZW50SG9zcGl0YWxpemF0aW9uLAogICAgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgR2x1Y29zZVJlc3VsdDYwMCwKICAgIFsiTGFib3JhdG9yeVJlc3VsdE9ic2VydmF0aW9uIjogIkdsdWNvc2UgTGFiIFRlc3QgTWFzcyBQZXIgVm9sdW1lIl0gRWFybGllckdsdWNvc2VUZXN0CiAgICBsZXQgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWw6IElucGF0aWVudEhvc3BpdGFsaXphdGlvbi5ob3NwaXRhbGl6YXRpb25XaXRoT2JzZXJ2YXRpb24gKCApLAogICAgR2x1Y29zZVRlc3Q2MDBUaW1lOiBHbHVjb3NlUmVzdWx0NjAwLmVmZmVjdGl2ZS5lYXJsaWVzdCAoICksCiAgICBFYXJsaWVyR2x1Y29zZVRlc3RUaW1lOiBFYXJsaWVyR2x1Y29zZVRlc3QuZWZmZWN0aXZlLmVhcmxpZXN0ICggKQogICAgd2hlcmUgR2x1Y29zZVRlc3Q2MDBUaW1lIGR1cmluZyBJbnRlcnZhbFsoIHN0YXJ0IG9mIEhvc3BpdGFsaXphdGlvbkludGVydmFsIC0gMSBob3VyICksICggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgKyA2IGhvdXIgKV0KICAgICAgYW5kIEVhcmxpZXJHbHVjb3NlVGVzdFRpbWUgZHVyaW5nIEludGVydmFsWyggc3RhcnQgb2YgSG9zcGl0YWxpemF0aW9uSW50ZXJ2YWwgLSAxIGhvdXIgKSwgR2x1Y29zZVRlc3Q2MDBUaW1lICkKICAgICAgYW5kIEVhcmxpZXJHbHVjb3NlVGVzdC5pZCAhfiBHbHVjb3NlUmVzdWx0NjAwLmlkCiAgICByZXR1cm4gR2x1Y29zZVJlc3VsdDYwMAoKZGVmaW5lICJJbml0aWFsIEdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCI6CiAgIkdsdWNvc2UgR3JlYXRlciBUaGFuIDYwMCB3aXRoaW4gMSBIb3VyIFByaW9yIFRvIGFuZCA2IEhvdXJzIEFmdGVyIEVuY291bnRlciBTdGFydCIgR2x1Y29zZVJlc3VsdDYwMAogICAgd2hlcmUgbm90ICggR2x1Y29zZVJlc3VsdDYwMC5pZCBpbiAiR2x1Y29zZSBUZXN0cyBFYXJsaWVyIFRoYW4gR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIHdpdGhpbiAxIEhvdXIgUHJpb3IgVG8gYW5kIDYgSG91cnMgQWZ0ZXIgRW5jb3VudGVyIFN0YXJ0Ii5pZCApCgpkZWZpbmUgIkluaXRpYWwgUG9wdWxhdGlvbiI6CiAgIkVuY291bnRlciB3aXRoIEV4aXN0aW5nIERpYWJldGVzIERpYWdub3NpcyIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBIeXBvZ2x5Y2VtaWMgTWVkaWNhdGlvbiIKICAgIHVuaW9uICJFbmNvdW50ZXIgd2l0aCBFbGV2YXRlZCBHbHVjb3NlIEdyZWF0ZXIgVGhhbiBvciBFcXVhbCB0byAyMDAiCgpkZWZpbmUgIk1lYXN1cmVtZW50IFBvcHVsYXRpb24iOgogICJEZW5vbWluYXRvciIKCmRlZmluZSAiTnVtZXJhdG9yIjoKICAiRW5jb3VudGVyIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiCgpkZWZpbmUgIk51bWVyYXRvciBFeGNsdXNpb25zIjoKICAiRW5jb3VudGVyIHdpdGggRWFybHkgR2x1Y29zZSBHcmVhdGVyIFRoYW4gNjAwIG9yIHdpdGggQ29tZm9ydCBvciBIb3NwaWNlIENhcmUiCgpkZWZpbmUgIlF1YWxpZnlpbmcgRW5jb3VudGVyIjoKICBbIkVuY291bnRlciI6ICJFbmNvdW50ZXIgSW5wYXRpZW50Il0gSW5wYXRpZW50RW5jb3VudGVyCiAgICB3aGVyZSBBZ2VJblllYXJzQXQoZGF0ZSBmcm9tIHN0YXJ0IG9mIElucGF0aWVudEVuY291bnRlci5wZXJpb2QpID49IDE4CiAgICAgIGFuZCBJbnBhdGllbnRFbmNvdW50ZXIucGVyaW9kIGVuZHMgZHVyaW5nIGRheSBvZiAiTWVhc3VyZW1lbnQgUGVyaW9kIgogICAgICBhbmQgSW5wYXRpZW50RW5jb3VudGVyLnN0YXR1cyA9ICdmaW5pc2hlZCcKCmRlZmluZSAiU0RFIEV0aG5pY2l0eSI6CiAgU0RFLiJTREUgRXRobmljaXR5IgoKZGVmaW5lICJTREUgUGF5ZXIiOgogIFNERS4iU0RFIFBheWVyIgoKZGVmaW5lICJTREUgUmFjZSI6CiAgU0RFLiJTREUgUmFjZSIKCmRlZmluZSAiU0RFIFNleCI6CiAgU0RFLiJTREUgU2V4IgoKZGVmaW5lIGZsdWVudCBmdW5jdGlvbiBob3NwaXRhbERheXNNYXgxMChQZXJpb2QgSW50ZXJ2YWw8RGF0ZVRpbWU+KToKICBJbnRlcnZhbFtzdGFydCBvZiBQZXJpb2QsIE1pbih7IAogICAgZW5kIG9mIFBlcmlvZCwgc3RhcnQgb2YgUGVyaW9kICsgMTAgZGF5cyB9CiAgKV0KCmRlZmluZSBmdW5jdGlvbiAiRGVub21pbmF0b3IgT2JzZXJ2YXRpb25zIihRdWFsaWZ5aW5nRW5jb3VudGVyIEVuY291bnRlcik6CiAgaWYgUXVhbGlmeWluZ0VuY291bnRlci5pZCBpbiAiRGVub21pbmF0b3IgRXhjbHVzaW9ucyIuaWQgdGhlbiBzaW5nbGV0b24gZnJvbSAoICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiIEVuY291bnRlcldpdGhFdmVudERheXMKICAgICAgd2hlcmUgRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbmNvdW50ZXIgPSBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHJldHVybiAwCiAgKSAKICAgIGVsc2Ugc2luZ2xldG9uIGZyb20gKCAiRGF5cyB3aXRoIEh5cGVyZ2x5Y2VtaWMgRXZlbnRzIiBFbmNvdW50ZXJXaXRoRXZlbnREYXlzCiAgICAgIHdoZXJlIEVuY291bnRlcldpdGhFdmVudERheXMuZW5jb3VudGVyID0gUXVhbGlmeWluZ0VuY291bnRlcgogICAgICByZXR1cm4gQ291bnQoRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbGlnaWJsZUV2ZW50RGF5cykKICApCgpkZWZpbmUgZnVuY3Rpb24gIk51bWVyYXRvciBPYnNlcnZhdGlvbnMiKFF1YWxpZnlpbmdFbmNvdW50ZXIgRW5jb3VudGVyKToKICBpZiBRdWFsaWZ5aW5nRW5jb3VudGVyLmlkIGluICJEZW5vbWluYXRvciBFeGNsdXNpb25zIi5pZCB0aGVuIHNpbmdsZXRvbiBmcm9tICggIkRheXMgd2l0aCBIeXBlcmdseWNlbWljIEV2ZW50cyIgRW5jb3VudGVyV2l0aEV2ZW50RGF5cwogICAgICB3aGVyZSBFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVuY291bnRlciA9IFF1YWxpZnlpbmdFbmNvdW50ZXIKICAgICAgcmV0dXJuIDAKICApIAogICAgZWxzZSBzaW5nbGV0b24gZnJvbSAoICJEYXlzIHdpdGggSHlwZXJnbHljZW1pYyBFdmVudHMiIEVuY291bnRlcldpdGhFdmVudERheXMKICAgICAgd2hlcmUgRW5jb3VudGVyV2l0aEV2ZW50RGF5cy5lbmNvdW50ZXIgPSBRdWFsaWZ5aW5nRW5jb3VudGVyCiAgICAgIHJldHVybiBDb3VudChFbmNvdW50ZXJXaXRoRXZlbnREYXlzLmVsaWdpYmxlRXZlbnREYXlzIEVsaWdpYmxlRXZlbnREYXkKICAgICAgICAgIHdoZXJlIEVsaWdpYmxlRXZlbnREYXkuaGFzSHlwZXJnbHljZW1pY0V2ZW50CiAgICAgICkKICAp"/>
<url value="https://madie.cms.gov/Library-CMS871FHIRHHHyper.cql"/>
</content>
</Library>