WHO SMART Guidelines - HIV
0.3.0 - ci-build

WHO SMART Guidelines - HIV - Local Development build (v0.3.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions

: HIVEncounterElements - JSON Representation

Draft as of 2024-08-21

Raw json | Download


{
  "resourceType" : "Library",
  "id" : "HIVEncounterElements",
  "meta" : {
    "profile" : [
      🔗 "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-shareablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/crmi/StructureDefinition/crmi-publishablelibrary"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-library"🔗 ,
      "http://hl7.org/fhir/uv/cql/StructureDefinition/cql-module"
    ]
  },
  "text" : {
    "status" : "generated",
    "div" : "<div xmlns=\"http://www.w3.org/1999/xhtml\"><p class=\"res-header-id\"><b>Generated Narrative: Library HIVEncounterElements</b></p><a name=\"HIVEncounterElements\"> </a><a name=\"hcHIVEncounterElements\"> </a><a name=\"HIVEncounterElements-en-US\"> </a><h2>Contents</h2><p><code>text/cql</code></p><pre><code>library HIVEncounterElements\n\nusing FHIR version '4.0.1'\n\ninclude FHIRHelpers version '4.0.1'\n\ninclude WHOConcepts\ninclude WHOCommon called WC\ninclude WHOElements called WE\n\ninclude HIVConcepts called Concepts\ninclude HIVCommon called Common\ninclude HIVElements called Elements\n\nparameter Today Date default Today()\nparameter EncounterId String\n\ncontext Patient\n\n/**\n * HIV Elements\n */\n\n// Auto-generated Elements from DAK Data Dictionary\n//   Entries based on DAK Data Dictionary for Data Elements marked as used\n//   in at least one Decision Support Table or Aggregate Indicator\n\n/*\n@dataElement: HIV.A.DE3 - Visit date\n@activity: HIV.A2 Gather client details\n@description: The date and time of the client's visit\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Visit date A.DE3&quot;:\n  Elements.&quot;Visit date A.DE3&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Visit date A.DE3 Value&quot;:\n  &quot;Visit date A.DE3&quot; O\n  return O.value\n/* End of Visit date A.DE3 */\n\n/*\n@dataElement: HIV.A.DE16 - Estimated age\n@activity: HIV.A6.1 Review sociodemographic data with client | HIV.A5 Create new client record\n@description: If DOB is unknown, enter the client's estimated age. Display client's age in number of years.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Estimated age&quot;:\n  Elements.&quot;Estimated age&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Estimated age Value&quot;:\n  &quot;Estimated age&quot; O\n  return O.value\n/* End of Estimated age */\n\n/*\n@dataElement: HIV.A.DE17 - Age\n@activity: HIV.A6.1 Review sociodemographic data with client | HIV.A5 Create new client record\n@description: Calculated age (number of years) of the client based on date of birth\n*/\n/** \n * @dataElement Patient age in years\n */\ndefine &quot;Current Patient Age In Years&quot;:\n  AgeInYearsAt(Today())\n\n/** \n * @dataElement Patient age in weeks\n */\ndefine &quot;Current Patient Age In Weeks&quot;:\n  AgeInWeeksAt(Today())\n\n/** \n * @dataElement Patient age in months\n */\ndefine &quot;Current Patient Age In Months&quot;:\n  AgeInMonthsAt(Today())\n/* End of Age */\n\n/*\n@dataElement: HIV.A.DE18 - Gender\n@activity: HIV.A6.1 Review sociodemographic data with client | HIV.A5 Create new client record\n@description: Gender of the client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Gender&quot;:\n  exists &quot;Gender Observation&quot;\ndefine &quot;Gender Observation&quot;:\n  Elements.&quot;Gender Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Gender */\n\n/*\n@dataElement: HIV.A.DE19 - Female\n@activity: HIV.A6.1 Review sociodemographic data with client | HIV.A5 Create new client record\n@description: Client identifies as female\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Female&quot;:\n  exists &quot;Female Condition&quot;\n    or exists &quot;Female Observation&quot;\ndefine &quot;Female Condition&quot;:\n  Elements.&quot;Female Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Female Observation&quot;:\n  Elements.&quot;Female Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Female */\n\n/*\n@dataElement: HIV.A.DE20 - Male\n@activity: HIV.A6.1 Review sociodemographic data with client | HIV.A5 Create new client record\n@description: Client identifies as male\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Male&quot;:\n  exists &quot;Male Condition&quot;\n    or exists &quot;Male Observation&quot;\ndefine &quot;Male Condition&quot;:\n  Elements.&quot;Male Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Male Observation&quot;:\n  Elements.&quot;Male Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Male */\n\n/*\n@dataElement: HIV.A.DE21 - Transgender male\n@activity: HIV.A6.1 Review sociodemographic data with client | HIV.A5 Create new client record\n@description: Client identifies as transgender male\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Transgender male&quot;:\n  exists &quot;Transgender male Condition&quot;\n    or exists &quot;Transgender male Observation&quot;\ndefine &quot;Transgender male Condition&quot;:\n  Elements.&quot;Transgender male Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Transgender male Observation&quot;:\n  Elements.&quot;Transgender male Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Transgender male */\n\n/*\n@dataElement: HIV.A.DE22 - Transgender female\n@activity: HIV.A6.1 Review sociodemographic data with client | HIV.A5 Create new client record\n@description: Client identifies as transgender female\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Transgender female&quot;:\n  exists &quot;Transgender female Condition&quot;\n    or exists &quot;Transgender female Observation&quot;\ndefine &quot;Transgender female Condition&quot;:\n  Elements.&quot;Transgender female Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Transgender female Observation&quot;:\n  Elements.&quot;Transgender female Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Transgender female */\n\n/*\n@dataElement: HIV.A.DE23 - Other\n@activity: HIV.A6.1 Review sociodemographic data with client | HIV.A5 Create new client record\n@description: Additional category\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other A.DE23&quot;:\n  exists &quot;Other A.DE23 Condition&quot;\n    or exists &quot;Other A.DE23 Observation&quot;\ndefine &quot;Other A.DE23 Condition&quot;:\n  Elements.&quot;Other A.DE23 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other A.DE23 Observation&quot;:\n  Elements.&quot;Other A.DE23 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other A.DE23 */\n\n/*\n@dataElement: HIV.B.DE1 - Reason for visit\n@activity: HIV.B1 Determine reason for visit\n@description: Reason for HIV testing services visit\n*/\ndefine &quot;Reason for visit B.DE1&quot;:\n  Elements.&quot;HTS Visit Encounter&quot; E\n    where E.partOf.references(EncounterId) \n    or E.period.start = Today\n    return E.reasonCode\n/* End of Reason for visit B.DE1 */\n\n/*\n@dataElement: HIV.B.DE2 - First-time HIV test\n@activity: HIV.B1 Determine reason for visit\n@description: First encounter for screening for human immunodeficiency virus\n*/\ndefine &quot;Is First-time HIV test Encounter&quot;:\n  exists &quot;First-time HIV test Encounter&quot;\ndefine &quot;First-time HIV test Encounter&quot;:\n  Elements.&quot;First-time HIV test Encounter&quot; E\n    where E.partOf.references(EncounterId) \n    or E.period.start = Today\n/* End of First-time HIV test */\n\n/*\n@dataElement: HIV.B.DE3 - Retesting for HIV\n@activity: HIV.B1 Determine reason for visit\n@description: Retesting for human immunodeficiency virus\n*/\ndefine &quot;Is Retesting for HIV B.DE3 Encounter&quot;:\n  exists &quot;Retesting for HIV B.DE3 Encounter&quot;\ndefine &quot;Retesting for HIV B.DE3 Encounter&quot;:\n  Elements.&quot;Retesting for HIV B.DE3 Encounter&quot; E\n    where E.partOf.references(EncounterId) \n    or E.period.start = Today\n/* End of Retesting for HIV B.DE3 */\n\n/*\n@dataElement: HIV.B.DE4 - HIV testing services visit\n@activity: HIV.B1 Determine reason for visit\n@description: Client attending facility for HIV testing services visit\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Is HIV testing services visit&quot;:\n  exists &quot;HIV testing services visit Encounter&quot;\ndefine &quot;HIV testing services visit Encounter&quot;:\n  Elements.&quot;HIV testing services visit Encounter&quot; E\n    where E.partOf.references(EncounterId) \n    or E.period.start = Today\n/* End of HIV testing services visit */\n\n/*\n@dataElement: HIV.B.DE14 - Date/time of suspected exposure to HIV\n@activity: HIV.B1 Determine reason for visit\n@description: Date and time when the client had suspected exposure to HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date/time of suspected exposure to HIV B.DE14&quot;:\n  Elements.&quot;Date/time of suspected exposure to HIV B.DE14&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Date/time of suspected exposure to HIV B.DE14 Value&quot;:\n  &quot;Date/time of suspected exposure to HIV B.DE14&quot; O\n  return O.value\n/* End of Date/time of suspected exposure to HIV B.DE14 */\n\n/*\n@dataElement: HIV.B.DE29 - Currently pregnant\n@activity: HIV.B6 Capture or update client history\n@description: Client is currently pregnant\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Currently pregnant B.DE29&quot;:\n  exists &quot;Currently pregnant B.DE29 Observation&quot;\ndefine &quot;Currently pregnant B.DE29 Observation&quot;:\n  Elements.&quot;Currently pregnant B.DE29 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Currently pregnant B.DE29 */\n\n/*\n@dataElement: HIV.B.DE33 - Partner HIV status reported\n@activity: HIV.B6 Capture or update client history\n@description: The HIV status of the client's partner.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Partner HIV status reported&quot;:\n  exists &quot;Partner HIV status reported Observation&quot;\ndefine &quot;Partner HIV status reported Observation&quot;:\n  Elements.&quot;Partner HIV status reported Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Partner HIV status reported */\n\n/*\n@dataElement: HIV.B.DE34 - HIV-positive\n@activity: HIV.B6 Capture or update client history\n@description: Client's partner is HIV-positive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV-positive B.DE34&quot;:\n  exists &quot;HIV-positive B.DE34 Condition&quot;\n    or exists &quot;HIV-positive B.DE34 Observation&quot;\ndefine &quot;HIV-positive B.DE34 Condition&quot;:\n  Elements.&quot;HIV-positive B.DE34 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV-positive B.DE34 Observation&quot;:\n  Elements.&quot;HIV-positive B.DE34 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV-positive B.DE34 */\n\n/*\n@dataElement: HIV.B.DE35 - HIV-negative\n@activity: HIV.B6 Capture or update client history\n@description: Client's partner is HIV-negative\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV-negative B.DE35&quot;:\n  exists &quot;HIV-negative B.DE35 Condition&quot;\n    or exists &quot;HIV-negative B.DE35 Observation&quot;\ndefine &quot;HIV-negative B.DE35 Condition&quot;:\n  Elements.&quot;HIV-negative B.DE35 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV-negative B.DE35 Observation&quot;:\n  Elements.&quot;HIV-negative B.DE35 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV-negative B.DE35 */\n\n/*\n@dataElement: HIV.B.DE36 - Unknown\n@activity: HIV.B6 Capture or update client history\n@description: Don't know HIV status - client does not know partner's HIV status\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unknown B.DE36&quot;:\n  exists &quot;Unknown B.DE36 Condition&quot;\n    or exists &quot;Unknown B.DE36 Observation&quot;\ndefine &quot;Unknown B.DE36 Condition&quot;:\n  Elements.&quot;Unknown B.DE36 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unknown B.DE36 Observation&quot;:\n  Elements.&quot;Unknown B.DE36 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unknown B.DE36 */\n\n/*\n@dataElement: HIV.B.DE49 - Key population member\n@activity: HIV.B6 Capture or update client history\n@description: Client is a member of a key population that has an increased risk of HIV\n*/\ndefine &quot;Is Key population member B.DE49&quot;:\n  exists(&quot;Key population member type Observation&quot;)\n/* End of Key population member B.DE49 */\n\n/*\n@dataElement: HIV.B.DE50 - Key population member type\n@activity: HIV.B6 Capture or update client history\n@description: The type of key population that the client is included in\n*/\ndefine &quot;Key population member type Observation&quot;:\n  Elements.&quot;Key population member type Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Key population member type B.DE50 */\n\n/*\n@dataElement: HIV.B.DE65 - Date informed of HIV-positive diagnosis\n@activity: HIV.B6 Capture or update client history\n@description: The date on which the client was diagnosed with HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date informed of HIV-positive diagnosis&quot;:\n  Elements.&quot;Date informed of HIV-positive diagnosis&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Date informed of HIV-positive diagnosis Value&quot;:\n  &quot;Date informed of HIV-positive diagnosis&quot; O\n  return O.value\n/* End of Date informed of HIV-positive diagnosis */\n\n/*\n@dataElement: HIV.B.DE71 - HIV diagnosis date\n@activity: HIV.B8 Provide post-test counselling\n@description: Date diagnosis was returned to client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV diagnosis date&quot;:\n  Elements.&quot;HIV diagnosis date&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;HIV diagnosis date Value&quot;:\n  &quot;HIV diagnosis date&quot; O\n  return O.value\n/* End of HIV diagnosis date */\n\n/*\n@dataElement: HIV.B.DE72 - ART start date\n@activity: HIV.B8 Provide post-test counselling\n@description: The date on which the client started or restarted antiretroviral therapy (ART)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ART start date B.DE72&quot;:\n  Elements.&quot;ART start date B.DE72&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;ART start date B.DE72 Value&quot;:\n  &quot;ART start date B.DE72&quot; O\n  return O.value\n/* End of ART start date B.DE72 */\n\n/*\n@dataElement: HIV.B.DE80 - HIV test conducted\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: An HIV test was performed on the client during the visit\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV test conducted&quot;:\n  exists &quot;HIV test conducted Observation&quot;\ndefine &quot;HIV test conducted Observation&quot;:\n  Elements.&quot;HIV test conducted Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV test conducted */\n\n/*\n@dataElement: HIV.B.DE81 - HIV test type\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: Type of HIV test\n*/\ndefine &quot;HIV test type B.DE81&quot;:\n  Elements.&quot;HIV test type B.DE81&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;HIV test type B.DE81 Value&quot;:\n  &quot;HIV test type B.DE81&quot; O\n  return O.value\n/* End of HIV test type B.DE81 */\n\n/*\n@dataElement: HIV.B.DE82 - Rapid diagnostic test for HIV\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: Antibody test for HIV performed with a rapid diagnostic\n*/\ndefine &quot;Rapid diagnostic test for HIV B.DE82&quot;:\n  Elements.&quot;Rapid diagnostic test for HIV B.DE82&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Rapid diagnostic test for HIV B.DE82 */\n\n/*\n@dataElement: HIV.B.DE83 - Enzyme immunoassay for HIV\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: Antibody test for HIV performed with an enzyme immunoassay\n*/\ndefine &quot;Enzyme immunoassay for HIV B.DE83&quot;:\n  Elements.&quot;Enzyme immunoassay for HIV B.DE83&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Enzyme immunoassay for HIV B.DE83 */\n\n/*\n@dataElement: HIV.B.DE84 - Nucleic acid test for HIV\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: Virological test, which includes testing for early infant diagnosis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Nucleic acid test for HIV B.DE84&quot;:\n  Elements.&quot;Nucleic acid test for HIV B.DE84&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Nucleic acid test for HIV B.DE84 */\n\n/*\n@dataElement: HIV.B.DE85 - Dual HIV/syphilis rapid diagnostic test\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: Antibody test for HIV and syphilis performed with a rapid diagnostic\n*/\ndefine &quot;Dual HIV/syphilis rapid diagnostic test B.DE85&quot;:\n  Elements.&quot;Dual HIV/syphilis rapid diagnostic test B.DE85&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Dual HIV/syphilis rapid diagnostic test B.DE85 */\n\n/*\n@dataElement: HIV.B.DE86 - HIV self-test\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: Antibody test for HIV performed by self-tester using a rapid diagnostic\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV self-test&quot;:\n  Elements.&quot;HIV self-test&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV self-test */\n\n/*\n@dataElement: HIV.B.DE88 - Assay number in testing strategy\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The number of the assay (test kit) in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay number in testing strategy B.DE88&quot;:\n  exists &quot;Assay number in testing strategy B.DE88 Observation&quot;\ndefine &quot;Assay number in testing strategy B.DE88 Observation&quot;:\n  Elements.&quot;Assay number in testing strategy B.DE88 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay number in testing strategy B.DE88 */\n\n/*\n@dataElement: HIV.B.DE89 - Assay 0\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: A community outreach test-for-triage or self-test which is not included in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay 0 B.DE89&quot;:\n  exists &quot;Assay 0 B.DE89 Condition&quot;\n    or exists &quot;Assay 0 B.DE89 Observation&quot;\ndefine &quot;Assay 0 B.DE89 Condition&quot;:\n  Elements.&quot;Assay 0 B.DE89 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assay 0 B.DE89 Observation&quot;:\n  Elements.&quot;Assay 0 B.DE89 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay 0 B.DE89 */\n\n/*\n@dataElement: HIV.B.DE90 - Assay 1\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The first test in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay 1 B.DE90&quot;:\n  exists &quot;Assay 1 B.DE90 Condition&quot;\n    or exists &quot;Assay 1 B.DE90 Observation&quot;\ndefine &quot;Assay 1 B.DE90 Condition&quot;:\n  Elements.&quot;Assay 1 B.DE90 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assay 1 B.DE90 Observation&quot;:\n  Elements.&quot;Assay 1 B.DE90 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay 1 B.DE90 */\n\n/*\n@dataElement: HIV.B.DE91 - Assay 2\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The second test in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay 2 B.DE91&quot;:\n  exists &quot;Assay 2 B.DE91 Condition&quot;\n    or exists &quot;Assay 2 B.DE91 Observation&quot;\ndefine &quot;Assay 2 B.DE91 Condition&quot;:\n  Elements.&quot;Assay 2 B.DE91 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assay 2 B.DE91 Observation&quot;:\n  Elements.&quot;Assay 2 B.DE91 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay 2 B.DE91 */\n\n/*\n@dataElement: HIV.B.DE92 - Assay 3\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The third test in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay 3 B.DE92&quot;:\n  exists &quot;Assay 3 B.DE92 Condition&quot;\n    or exists &quot;Assay 3 B.DE92 Observation&quot;\ndefine &quot;Assay 3 B.DE92 Condition&quot;:\n  Elements.&quot;Assay 3 B.DE92 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assay 3 B.DE92 Observation&quot;:\n  Elements.&quot;Assay 3 B.DE92 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay 3 B.DE92 */\n\n/*\n@dataElement: HIV.B.DE93 - Assay 1 repeated\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The first test in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay 1 repeated B.DE93&quot;:\n  exists &quot;Assay 1 repeated B.DE93 Condition&quot;\n    or exists &quot;Assay 1 repeated B.DE93 Observation&quot;\ndefine &quot;Assay 1 repeated B.DE93 Condition&quot;:\n  Elements.&quot;Assay 1 repeated B.DE93 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assay 1 repeated B.DE93 Observation&quot;:\n  Elements.&quot;Assay 1 repeated B.DE93 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay 1 repeated B.DE93 */\n\n/*\n@dataElement: HIV.B.DE94 - Test result of HIV assay 1\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the first HIV assay in the testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Test result of HIV assay 1 B.DE94&quot;:\n  exists &quot;Test result of HIV assay 1 B.DE94 Observation&quot;\ndefine &quot;Test result of HIV assay 1 B.DE94 Observation&quot;:\n  Elements.&quot;Test result of HIV assay 1 B.DE94 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Test result of HIV assay 1 B.DE94 */\n\n/*\n@dataElement: HIV.B.DE95 - Reactive\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reactive B.DE95&quot;:\n  exists &quot;Reactive B.DE95 Condition&quot;\n    or exists &quot;Reactive B.DE95 Observation&quot;\ndefine &quot;Reactive B.DE95 Condition&quot;:\n  Elements.&quot;Reactive B.DE95 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Reactive B.DE95 Observation&quot;:\n  Elements.&quot;Reactive B.DE95 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reactive B.DE95 */\n\n/*\n@dataElement: HIV.B.DE96 - Non-reactive\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was non-reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Non-reactive B.DE96&quot;:\n  exists &quot;Non-reactive B.DE96 Condition&quot;\n    or exists &quot;Non-reactive B.DE96 Observation&quot;\ndefine &quot;Non-reactive B.DE96 Condition&quot;:\n  Elements.&quot;Non-reactive B.DE96 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Non-reactive B.DE96 Observation&quot;:\n  Elements.&quot;Non-reactive B.DE96 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Non-reactive B.DE96 */\n\n/*\n@dataElement: HIV.B.DE97 - Invalid\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was invalid\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Invalid B.DE97&quot;:\n  exists &quot;Invalid B.DE97 Condition&quot;\n    or exists &quot;Invalid B.DE97 Observation&quot;\ndefine &quot;Invalid B.DE97 Condition&quot;:\n  Elements.&quot;Invalid B.DE97 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Invalid B.DE97 Observation&quot;:\n  Elements.&quot;Invalid B.DE97 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Invalid B.DE97 */\n\n/*\n@dataElement: HIV.B.DE98 - Test result of HIV assay 2\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the second HIV assay in the testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Test result of HIV assay 2 B.DE98&quot;:\n  exists &quot;Test result of HIV assay 2 B.DE98 Observation&quot;\ndefine &quot;Test result of HIV assay 2 B.DE98 Observation&quot;:\n  Elements.&quot;Test result of HIV assay 2 B.DE98 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Test result of HIV assay 2 B.DE98 */\n\n/*\n@dataElement: HIV.B.DE99 - Reactive\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reactive B.DE99&quot;:\n  exists &quot;Reactive B.DE99 Condition&quot;\n    or exists &quot;Reactive B.DE99 Observation&quot;\ndefine &quot;Reactive B.DE99 Condition&quot;:\n  Elements.&quot;Reactive B.DE99 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Reactive B.DE99 Observation&quot;:\n  Elements.&quot;Reactive B.DE99 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reactive B.DE99 */\n\n/*\n@dataElement: HIV.B.DE100 - Non-reactive\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was non-reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Non-reactive B.DE100&quot;:\n  exists &quot;Non-reactive B.DE100 Condition&quot;\n    or exists &quot;Non-reactive B.DE100 Observation&quot;\ndefine &quot;Non-reactive B.DE100 Condition&quot;:\n  Elements.&quot;Non-reactive B.DE100 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Non-reactive B.DE100 Observation&quot;:\n  Elements.&quot;Non-reactive B.DE100 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Non-reactive B.DE100 */\n\n/*\n@dataElement: HIV.B.DE101 - Invalid\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was invalid\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Invalid B.DE101&quot;:\n  exists &quot;Invalid B.DE101 Condition&quot;\n    or exists &quot;Invalid B.DE101 Observation&quot;\ndefine &quot;Invalid B.DE101 Condition&quot;:\n  Elements.&quot;Invalid B.DE101 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Invalid B.DE101 Observation&quot;:\n  Elements.&quot;Invalid B.DE101 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Invalid B.DE101 */\n\n/*\n@dataElement: HIV.B.DE102 - Test result of HIV assay 3\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the third HIV assay in the testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Test result of HIV assay 3 B.DE102&quot;:\n  exists &quot;Test result of HIV assay 3 B.DE102 Observation&quot;\ndefine &quot;Test result of HIV assay 3 B.DE102 Observation&quot;:\n  Elements.&quot;Test result of HIV assay 3 B.DE102 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Test result of HIV assay 3 B.DE102 */\n\n/*\n@dataElement: HIV.B.DE103 - Reactive\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reactive B.DE103&quot;:\n  exists &quot;Reactive B.DE103 Condition&quot;\n    or exists &quot;Reactive B.DE103 Observation&quot;\ndefine &quot;Reactive B.DE103 Condition&quot;:\n  Elements.&quot;Reactive B.DE103 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Reactive B.DE103 Observation&quot;:\n  Elements.&quot;Reactive B.DE103 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reactive B.DE103 */\n\n/*\n@dataElement: HIV.B.DE104 - Non-reactive\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was non-reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Non-reactive B.DE104&quot;:\n  exists &quot;Non-reactive B.DE104 Condition&quot;\n    or exists &quot;Non-reactive B.DE104 Observation&quot;\ndefine &quot;Non-reactive B.DE104 Condition&quot;:\n  Elements.&quot;Non-reactive B.DE104 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Non-reactive B.DE104 Observation&quot;:\n  Elements.&quot;Non-reactive B.DE104 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Non-reactive B.DE104 */\n\n/*\n@dataElement: HIV.B.DE105 - Invalid\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was invalid\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Invalid B.DE105&quot;:\n  exists &quot;Invalid B.DE105 Condition&quot;\n    or exists &quot;Invalid B.DE105 Observation&quot;\ndefine &quot;Invalid B.DE105 Condition&quot;:\n  Elements.&quot;Invalid B.DE105 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Invalid B.DE105 Observation&quot;:\n  Elements.&quot;Invalid B.DE105 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Invalid B.DE105 */\n\n/*\n@dataElement: HIV.B.DE106 - Test result of HIV assay 1 repeated\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the repeated first HIV assay in the testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Test result of HIV assay 1 repeated B.DE106&quot;:\n  exists &quot;Test result of HIV assay 1 repeated B.DE106 Observation&quot;\ndefine &quot;Test result of HIV assay 1 repeated B.DE106 Observation&quot;:\n  Elements.&quot;Test result of HIV assay 1 repeated B.DE106 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Test result of HIV assay 1 repeated B.DE106 */\n\n/*\n@dataElement: HIV.B.DE107 - Reactive\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reactive B.DE107&quot;:\n  exists &quot;Reactive B.DE107 Condition&quot;\n    or exists &quot;Reactive B.DE107 Observation&quot;\ndefine &quot;Reactive B.DE107 Condition&quot;:\n  Elements.&quot;Reactive B.DE107 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Reactive B.DE107 Observation&quot;:\n  Elements.&quot;Reactive B.DE107 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reactive B.DE107 */\n\n/*\n@dataElement: HIV.B.DE108 - Non-reactive\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was non-reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Non-reactive B.DE108&quot;:\n  exists &quot;Non-reactive B.DE108 Condition&quot;\n    or exists &quot;Non-reactive B.DE108 Observation&quot;\ndefine &quot;Non-reactive B.DE108 Condition&quot;:\n  Elements.&quot;Non-reactive B.DE108 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Non-reactive B.DE108 Observation&quot;:\n  Elements.&quot;Non-reactive B.DE108 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Non-reactive B.DE108 */\n\n/*\n@dataElement: HIV.B.DE109 - Invalid\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was invalid\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Invalid B.DE109&quot;:\n  exists &quot;Invalid B.DE109 Condition&quot;\n    or exists &quot;Invalid B.DE109 Observation&quot;\ndefine &quot;Invalid B.DE109 Condition&quot;:\n  Elements.&quot;Invalid B.DE109 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Invalid B.DE109 Observation&quot;:\n  Elements.&quot;Invalid B.DE109 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Invalid B.DE109 */\n\n/*\n@dataElement: HIV.B.DE111 - HIV test result\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result from HIV testing after applying the testing algorithm\n*/\ndefine &quot;HIV test result Observation&quot;:\n  Elements.&quot;HIV test result Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;HIV test result Value&quot;:\n  Elements.&quot;HIV test result Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n  return O.value\n/* End of HIV test result B.DE111 */\n\n/*\n@dataElement: HIV.B.DE112 - HIV-positive\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: Test result is HIV-positive\n*/\ndefine &quot;HIV-positive test result&quot;:\n  Elements.&quot;HIV-positive test result&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV-positive B.DE112 */\n\n/*\n@dataElement: HIV.B.DE113 - HIV-negative\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: Test result is HIV-negative\n*/\ndefine &quot;HIV-negative test result&quot;:\n  Elements.&quot;HIV-negative test result&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV-negative B.DE113 */\n\n/*\n@dataElement: HIV.B.DE114 - HIV-inconclusive\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: Test result is HIV-inconclusive\n*/\ndefine &quot;HIV-inconclusive test result&quot;:\n  Elements.&quot;HIV-inconclusive test result&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV-inconclusive */\n\n/*\n@dataElement: HIV.B.DE115 - HIV status\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: HIV status reported after applying the national HIV testing algorithm. No single HIV test can provide an HIV-positive diagnosis.\n*/\ndefine &quot;HIV Status Observation&quot;:\n  Elements.&quot;HIV Status Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n\n  // case \n  //     when exists(&quot;HIV-positive Condition&quot;) or exists(&quot;HIV-positive Condition&quot;) then Concepts.&quot;HIV-positive - HIV.B.DE116&quot;\n  //     when not exists(&quot;HIV-positive Condition&quot;) and exists(Common.&quot;HIV Negative Observation&quot;) then  Concepts.&quot;HIV-negative - HIV.B.DE117&quot;\n  //     else Concepts.&quot;Unknown - HIV.B.DE118&quot;\n  // end\n/* End of HIV status */\n\n/*\n@dataElement: HIV.B.DE116 - HIV-positive\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: Client is HIV-positive\n*/\ndefine &quot;HIV Status Postitive Observation&quot;:\n  Elements.&quot;HIV Status Positive Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;HIV Status Positive Condition&quot;:\n  Elements.&quot;HIV Status Positive Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\n/* End of HIV-positive B.DE116 */\n\n/*\n@dataElement: HIV.B.DE141 - Partner virally suppressed on ART\n@activity: HIV.B6 Capture or update client history\n@description: ART and virally suppression status of a partner of the client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Partner virally suppressed on ART&quot;:\n  exists &quot;Partner virally suppressed on ART Observation&quot;\ndefine &quot;Partner virally suppressed on ART Observation&quot;:\n  Elements.&quot;Partner virally suppressed on ART Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Partner virally suppressed on ART */\n\n/*\n@dataElement: HIV.B.DE142 - Counselling provided\n@activity: HIV.B8 Provide post-test counselling\n@description: Whether counselling was provided to a client during the visit\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Counselling provided&quot;:\n  exists &quot;Counselling provided Observation&quot;\ndefine &quot;Counselling provided Observation&quot;:\n  Elements.&quot;Counselling provided Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Counselling provided */\n\n/*\n@dataElement: HIV.B.DE143 - HIV-positive counselling conducted\n@activity: HIV.B8 Provide post-test counselling\n@description: Whether counselling was provided to a client who has been diagnosed with HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV-positive counselling conducted&quot;:\n  exists &quot;HIV-positive counselling conducted Condition&quot;\n    or exists &quot;HIV-positive counselling conducted Observation&quot;\ndefine &quot;HIV-positive counselling conducted Condition&quot;:\n  Elements.&quot;HIV-positive counselling conducted Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV-positive counselling conducted Observation&quot;:\n  Elements.&quot;HIV-positive counselling conducted Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV-positive counselling conducted */\n\n/*\n@dataElement: HIV.B.DE144 - Hepatitis B positive counselling conducted\n@activity: HIV.B8 Provide post-test counselling\n@description: Whether counselling was provided to a client who has been diagnosed with hepatitis B\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Hepatitis B positive counselling conducted&quot;:\n  exists &quot;Hepatitis B positive counselling conducted Condition&quot;\n    or exists &quot;Hepatitis B positive counselling conducted Observation&quot;\ndefine &quot;Hepatitis B positive counselling conducted Condition&quot;:\n  Elements.&quot;Hepatitis B positive counselling conducted Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Hepatitis B positive counselling conducted Observation&quot;:\n  Elements.&quot;Hepatitis B positive counselling conducted Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Hepatitis B positive counselling conducted */\n\n/*\n@dataElement: HIV.B.DE145 - Hepatitis C positive counselling conducted\n@activity: HIV.B8 Provide post-test counselling\n@description: Whether counselling was provided to a client who has been diagnosed with hepatitis C\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Hepatitis C positive counselling conducted&quot;:\n  exists &quot;Hepatitis C positive counselling conducted Condition&quot;\n    or exists &quot;Hepatitis C positive counselling conducted Observation&quot;\ndefine &quot;Hepatitis C positive counselling conducted Condition&quot;:\n  Elements.&quot;Hepatitis C positive counselling conducted Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Hepatitis C positive counselling conducted Observation&quot;:\n  Elements.&quot;Hepatitis C positive counselling conducted Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Hepatitis C positive counselling conducted */\n\n/*\n@dataElement: HIV.B.DE146 - Syphilis counselling, treatment and further testing\n@activity: HIV.B8 Provide post-test counselling\n@description: Whether counselling and treatment was provided to a client who has been diagnosed with syphilis. Additional testing (RPR test) recommended.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Syphilis counselling, treatment and further testing&quot;:\n  exists &quot;Syphilis counselling, treatment and further testing Condition&quot;\n    or exists &quot;Syphilis counselling, treatment and further testing Observation&quot;\ndefine &quot;Syphilis counselling, treatment and further testing Condition&quot;:\n  Elements.&quot;Syphilis counselling, treatment and further testing Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Syphilis counselling, treatment and further testing Observation&quot;:\n  Elements.&quot;Syphilis counselling, treatment and further testing Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Syphilis counselling, treatment and further testing */\n\n/*\n@dataElement: HIV.B.DE147 - Linked to enrolment in care and ART initiation\n@activity: HIV.B8 Provide post-test counselling\n@description: Linkage made from HIV testing to enrolment in care following an HIV diagnosis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Linked to enrolment in care and ART initiation&quot;:\n  exists &quot;Linked to enrolment in care and ART initiation Condition&quot;\n    or exists &quot;Linked to enrolment in care and ART initiation Observation&quot;\ndefine &quot;Linked to enrolment in care and ART initiation Condition&quot;:\n  Elements.&quot;Linked to enrolment in care and ART initiation Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Linked to enrolment in care and ART initiation Observation&quot;:\n  Elements.&quot;Linked to enrolment in care and ART initiation Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Linked to enrolment in care and ART initiation */\n\n/*\n@dataElement: HIV.B.DE148 - VMMC counselling provided\n@activity: HIV.B8 Provide post-test counselling\n@description: Whether counselling for voluntary medical male circumcision (VMMC) was provided following an HIV-negative test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;VMMC counselling provided&quot;:\n  exists &quot;VMMC counselling provided Condition&quot;\n    or exists &quot;VMMC counselling provided Observation&quot;\ndefine &quot;VMMC counselling provided Condition&quot;:\n  Elements.&quot;VMMC counselling provided Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;VMMC counselling provided Observation&quot;:\n  Elements.&quot;VMMC counselling provided Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of VMMC counselling provided */\n\n/*\n@dataElement: HIV.B.DE149 - Prevention services offered and referrals\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer to prevention services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Prevention services offered and referrals B.DE149&quot;:\n  exists &quot;Prevention services offered and referrals B.DE149 Observation&quot;\ndefine &quot;Prevention services offered and referrals B.DE149 Observation&quot;:\n  Elements.&quot;Prevention services offered and referrals B.DE149 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Prevention services offered and referrals B.DE149 */\n\n/*\n@dataElement: HIV.B.DE150 - Offer male and female condoms and condom-compatible lubricants\n@activity: HIV.B9 Determine recommended services\n@description: Offer male and female condoms and condom-compatible lubricants\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Offer male and female condoms and condom-compatible lubricants B.DE150&quot;:\n  exists &quot;Offer male and female condoms and condom-compatible lubricants B.DE150 Condition&quot;\n    or exists &quot;Offer male and female condoms and condom-compatible lubricants B.DE150 Observation&quot;\ndefine &quot;Offer male and female condoms and condom-compatible lubricants B.DE150 Condition&quot;:\n  Elements.&quot;Offer male and female condoms and condom-compatible lubricants B.DE150 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Offer male and female condoms and condom-compatible lubricants B.DE150 Observation&quot;:\n  Elements.&quot;Offer male and female condoms and condom-compatible lubricants B.DE150 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Offer male and female condoms and condom-compatible lubricants B.DE150 */\n\n/*\n@dataElement: HIV.B.DE151 - Offer pre-exposure prophylaxis PrEP for people at elevated risk for HIV acquisition\n@activity: HIV.B9 Determine recommended services\n@description: Offer pre-exposure prophylaxis (PrEP) to people with substantial ongoing risk of HIV infection\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Offer pre-exposure prophylaxis PrEP for people at elevated risk for HIV acquisition&quot;:\n  exists &quot;Offer pre-exposure prophylaxis PrEP for people at elevated risk for HIV acquisition Condition&quot;\n    or exists &quot;Offer pre-exposure prophylaxis PrEP for people at elevated risk for HIV acquisition Observation&quot;\ndefine &quot;Offer pre-exposure prophylaxis PrEP for people at elevated risk for HIV acquisition Condition&quot;:\n  Elements.&quot;Offer pre-exposure prophylaxis PrEP for people at elevated risk for HIV acquisition Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Offer pre-exposure prophylaxis PrEP for people at elevated risk for HIV acquisition Observation&quot;:\n  Elements.&quot;Offer pre-exposure prophylaxis PrEP for people at elevated risk for HIV acquisition Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Offer pre-exposure prophylaxis PrEP for people at elevated risk for HIV acquisition */\n\n/*\n@dataElement: HIV.B.DE152 - Offer post-exposure prophylaxis PEP following suspected exposure\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer client for PEP following suspected exposure\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Offer post-exposure prophylaxis PEP following suspected exposure&quot;:\n  exists &quot;Offer post-exposure prophylaxis PEP following suspected exposure Condition&quot;\n    or exists &quot;Offer post-exposure prophylaxis PEP following suspected exposure Observation&quot;\ndefine &quot;Offer post-exposure prophylaxis PEP following suspected exposure Condition&quot;:\n  Elements.&quot;Offer post-exposure prophylaxis PEP following suspected exposure Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Offer post-exposure prophylaxis PEP following suspected exposure Observation&quot;:\n  Elements.&quot;Offer post-exposure prophylaxis PEP following suspected exposure Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Offer post-exposure prophylaxis PEP following suspected exposure */\n\n/*\n@dataElement: HIV.B.DE153 - Voluntary medical male circumcision VMMC\n@activity: HIV.B9 Determine recommended services\n@description: Offer referral for VMMC services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Voluntary medical male circumcision VMMC&quot;:\n  exists &quot;Voluntary medical male circumcision VMMC Condition&quot;\n    or exists &quot;Voluntary medical male circumcision VMMC Observation&quot;\ndefine &quot;Voluntary medical male circumcision VMMC Condition&quot;:\n  Elements.&quot;Voluntary medical male circumcision VMMC Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Voluntary medical male circumcision VMMC Observation&quot;:\n  Elements.&quot;Voluntary medical male circumcision VMMC Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Voluntary medical male circumcision VMMC */\n\n/*\n@dataElement: HIV.B.DE154 - Harm reduction for people who inject drugs\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer to harm reduction services for people who inject drugs (needle and syringe programmes, opioid substitution therapy, other drug-dependence treatment and opioid overdose prevention and management)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Harm reduction for people who inject drugs B.DE154&quot;:\n  exists &quot;Harm reduction for people who inject drugs B.DE154 Condition&quot;\n    or exists &quot;Harm reduction for people who inject drugs B.DE154 Observation&quot;\ndefine &quot;Harm reduction for people who inject drugs B.DE154 Condition&quot;:\n  Elements.&quot;Harm reduction for people who inject drugs B.DE154 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Harm reduction for people who inject drugs B.DE154 Observation&quot;:\n  Elements.&quot;Harm reduction for people who inject drugs B.DE154 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Harm reduction for people who inject drugs B.DE154 */\n\n/*\n@dataElement: HIV.B.DE155 - Behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer to behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations&quot;:\n  exists &quot;Behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations Condition&quot;\n    or exists &quot;Behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations Observation&quot;\ndefine &quot;Behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations Condition&quot;:\n  Elements.&quot;Behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations Observation&quot;:\n  Elements.&quot;Behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations */\n\n/*\n@dataElement: HIV.B.DE156 - HIV testing for partners and biological children\n@activity: HIV.B9 Determine recommended services\n@description: Offer voluntary testing for all partners and biological children of positive cases (includes partner services and index case testing), as welll as partners and social contacts of people from key populations, where appropriate\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV testing for partners and biological children B.DE156&quot;:\n  exists &quot;HIV testing for partners and biological children B.DE156 Condition&quot;\n    or exists &quot;HIV testing for partners and biological children B.DE156 Observation&quot;\ndefine &quot;HIV testing for partners and biological children B.DE156 Condition&quot;:\n  Elements.&quot;HIV testing for partners and biological children B.DE156 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV testing for partners and biological children B.DE156 Observation&quot;:\n  Elements.&quot;HIV testing for partners and biological children B.DE156 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV testing for partners and biological children B.DE156 */\n\n/*\n@dataElement: HIV.B.DE157 - HIV testing for partners and social contacts of people from key populations, where appropriate\n@activity: HIV.B9 Determine recommended services\n@description: Offer voluntary testing for partners and social contacts of people from key populations, where appropriate\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV testing for partners and social contacts of people from key populations, where appropriate&quot;:\n  exists &quot;HIV testing for partners and social contacts of people from key populations, where appropriate Condition&quot;\n    or exists &quot;HIV testing for partners and social contacts of people from key populations, where appropriate Observation&quot;\ndefine &quot;HIV testing for partners and social contacts of people from key populations, where appropriate Condition&quot;:\n  Elements.&quot;HIV testing for partners and social contacts of people from key populations, where appropriate Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV testing for partners and social contacts of people from key populations, where appropriate Observation&quot;:\n  Elements.&quot;HIV testing for partners and social contacts of people from key populations, where appropriate Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV testing for partners and social contacts of people from key populations, where appropriate */\n\n/*\n@dataElement: HIV.B.DE158 - Sexual and reproductive health integrated services\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer to sexual and reproductive health services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Sexual and reproductive health integrated services B.DE158&quot;:\n  exists &quot;Sexual and reproductive health integrated services B.DE158 Observation&quot;\ndefine &quot;Sexual and reproductive health integrated services B.DE158 Observation&quot;:\n  Elements.&quot;Sexual and reproductive health integrated services B.DE158 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Sexual and reproductive health integrated services B.DE158 */\n\n/*\n@dataElement: HIV.B.DE159 - Contraception and family planning\n@activity: HIV.B9 Determine recommended services\n@description: Offer contraception and family planning services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Contraception and family planning B.DE159&quot;:\n  exists &quot;Contraception and family planning B.DE159 Condition&quot;\n    or exists &quot;Contraception and family planning B.DE159 Observation&quot;\ndefine &quot;Contraception and family planning B.DE159 Condition&quot;:\n  Elements.&quot;Contraception and family planning B.DE159 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Contraception and family planning B.DE159 Observation&quot;:\n  Elements.&quot;Contraception and family planning B.DE159 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Contraception and family planning B.DE159 */\n\n/*\n@dataElement: HIV.B.DE160 - Check pregnancy status\n@activity: HIV.B9 Determine recommended services\n@description: Check women's pregnancy status\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Check pregnancy status B.DE160&quot;:\n  exists &quot;Check pregnancy status B.DE160 Condition&quot;\n    or exists &quot;Check pregnancy status B.DE160 Observation&quot;\ndefine &quot;Check pregnancy status B.DE160 Condition&quot;:\n  Elements.&quot;Check pregnancy status B.DE160 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Check pregnancy status B.DE160 Observation&quot;:\n  Elements.&quot;Check pregnancy status B.DE160 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Check pregnancy status B.DE160 */\n\n/*\n@dataElement: HIV.B.DE161 - Prevention of mother-to-child transmission counselling\n@activity: HIV.B9 Determine recommended services\n@description: Offer services for prevention of mother-to-child transmission (counselling)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Prevention of mother-to-child transmission counselling&quot;:\n  exists &quot;Prevention of mother-to-child transmission counselling Condition&quot;\n    or exists &quot;Prevention of mother-to-child transmission counselling Observation&quot;\ndefine &quot;Prevention of mother-to-child transmission counselling Condition&quot;:\n  Elements.&quot;Prevention of mother-to-child transmission counselling Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Prevention of mother-to-child transmission counselling Observation&quot;:\n  Elements.&quot;Prevention of mother-to-child transmission counselling Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Prevention of mother-to-child transmission counselling */\n\n/*\n@dataElement: HIV.B.DE162 - Cervical cancer screening and treatment counselling\n@activity: HIV.B9 Determine recommended services\n@description: Offer cervical cancer screening and treatment counselling and services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Cervical cancer screening and treatment counselling&quot;:\n  exists &quot;Cervical cancer screening and treatment counselling Condition&quot;\n    or exists &quot;Cervical cancer screening and treatment counselling Observation&quot;\ndefine &quot;Cervical cancer screening and treatment counselling Condition&quot;:\n  Elements.&quot;Cervical cancer screening and treatment counselling Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Cervical cancer screening and treatment counselling Observation&quot;:\n  Elements.&quot;Cervical cancer screening and treatment counselling Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Cervical cancer screening and treatment counselling */\n\n/*\n@dataElement: HIV.B.DE163 - Anal cancer screening for men who have sex with men\n@activity: HIV.B9 Determine recommended services\n@description: Offer services for anal cancer screening (for men who have sex with men)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Anal cancer screening for men who have sex with men B.DE163&quot;:\n  exists &quot;Anal cancer screening for men who have sex with men B.DE163 Condition&quot;\n    or exists &quot;Anal cancer screening for men who have sex with men B.DE163 Observation&quot;\ndefine &quot;Anal cancer screening for men who have sex with men B.DE163 Condition&quot;:\n  Elements.&quot;Anal cancer screening for men who have sex with men B.DE163 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Anal cancer screening for men who have sex with men B.DE163 Observation&quot;:\n  Elements.&quot;Anal cancer screening for men who have sex with men B.DE163 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Anal cancer screening for men who have sex with men B.DE163 */\n\n/*\n@dataElement: HIV.B.DE164 - STI testing and treatment services\n@activity: HIV.B9 Determine recommended services\n@description: Offer sexually transmitted infection (STI) testing and treatment services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;STI testing and treatment services&quot;:\n  exists &quot;STI testing and treatment services Condition&quot;\n    or exists &quot;STI testing and treatment services Observation&quot;\ndefine &quot;STI testing and treatment services Condition&quot;:\n  Elements.&quot;STI testing and treatment services Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;STI testing and treatment services Observation&quot;:\n  Elements.&quot;STI testing and treatment services Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of STI testing and treatment services */\n\n/*\n@dataElement: HIV.B.DE165 - Offer other clinical services\n@activity: HIV.B9 Determine recommended services\n@description: Other clinical services offered or referrals given to the client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Offer other clinical services B.DE165&quot;:\n  exists &quot;Offer other clinical services B.DE165 Observation&quot;\ndefine &quot;Offer other clinical services B.DE165 Observation&quot;:\n  Elements.&quot;Offer other clinical services B.DE165 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Offer other clinical services B.DE165 */\n\n/*\n@dataElement: HIV.B.DE166 - Assessment and provision of vaccinations\n@activity: HIV.B9 Determine recommended services\n@description: Assessment and provision of vaccinations, such as for people from key populations, pregnant women and infants; and, where appropriate, tetanus vaccination for adolescent boys and men receiving VMMC\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assessment and provision of vaccinations B.DE166&quot;:\n  exists &quot;Assessment and provision of vaccinations B.DE166 Condition&quot;\n    or exists &quot;Assessment and provision of vaccinations B.DE166 Observation&quot;\ndefine &quot;Assessment and provision of vaccinations B.DE166 Condition&quot;:\n  Elements.&quot;Assessment and provision of vaccinations B.DE166 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assessment and provision of vaccinations B.DE166 Observation&quot;:\n  Elements.&quot;Assessment and provision of vaccinations B.DE166 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assessment and provision of vaccinations B.DE166 */\n\n/*\n@dataElement: HIV.B.DE167 - Hepatitis B HBV and hepatitis C virus HCV testing and treatment provided\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer for HBV and/or HCV testing and treatment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment provided&quot;:\n  exists &quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment provided Condition&quot;\n    or exists &quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment provided Observation&quot;\ndefine &quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment provided Condition&quot;:\n  Elements.&quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment provided Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment provided Observation&quot;:\n  Elements.&quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment provided Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Hepatitis B HBV and hepatitis C virus HCV testing and treatment provided */\n\n/*\n@dataElement: HIV.B.DE168 - Co-trimoxazole chemoprophylaxis to prevent Pneumocystis carinii pneumonia provided\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer for co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Co-trimoxazole chemoprophylaxis to prevent Pneumocystis carinii pneumonia provided&quot;:\n  exists &quot;Co-trimoxazole chemoprophylaxis to prevent Pneumocystis carinii pneumonia provided Condition&quot;\n    or exists &quot;Co-trimoxazole chemoprophylaxis to prevent Pneumocystis carinii pneumonia provided Observation&quot;\ndefine &quot;Co-trimoxazole chemoprophylaxis to prevent Pneumocystis carinii pneumonia provided Condition&quot;:\n  Elements.&quot;Co-trimoxazole chemoprophylaxis to prevent Pneumocystis carinii pneumonia provided Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Co-trimoxazole chemoprophylaxis to prevent Pneumocystis carinii pneumonia provided Observation&quot;:\n  Elements.&quot;Co-trimoxazole chemoprophylaxis to prevent Pneumocystis carinii pneumonia provided Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Co-trimoxazole chemoprophylaxis to prevent Pneumocystis carinii pneumonia provided */\n\n/*\n@dataElement: HIV.B.DE169 - Intensified TB case finding and linkage to TB treatment provided\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer for intensified TB case finding and linkage to TB treatment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Intensified TB case finding and linkage to TB treatment provided&quot;:\n  exists &quot;Intensified TB case finding and linkage to TB treatment provided Condition&quot;\n    or exists &quot;Intensified TB case finding and linkage to TB treatment provided Observation&quot;\ndefine &quot;Intensified TB case finding and linkage to TB treatment provided Condition&quot;:\n  Elements.&quot;Intensified TB case finding and linkage to TB treatment provided Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Intensified TB case finding and linkage to TB treatment provided Observation&quot;:\n  Elements.&quot;Intensified TB case finding and linkage to TB treatment provided Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Intensified TB case finding and linkage to TB treatment provided */\n\n/*\n@dataElement: HIV.B.DE170 - Provision of isoniazid preventive therapy if person does not have TB\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer for provision of isoniazid preventive therapy if person does not have TB\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Provision of isoniazid preventive therapy if person does not have TB B.DE170&quot;:\n  exists &quot;Provision of isoniazid preventive therapy if person does not have TB B.DE170 Condition&quot;\n    or exists &quot;Provision of isoniazid preventive therapy if person does not have TB B.DE170 Observation&quot;\ndefine &quot;Provision of isoniazid preventive therapy if person does not have TB B.DE170 Condition&quot;:\n  Elements.&quot;Provision of isoniazid preventive therapy if person does not have TB B.DE170 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Provision of isoniazid preventive therapy if person does not have TB B.DE170 Observation&quot;:\n  Elements.&quot;Provision of isoniazid preventive therapy if person does not have TB B.DE170 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Provision of isoniazid preventive therapy if person does not have TB B.DE170 */\n\n/*\n@dataElement: HIV.B.DE171 - Malaria prevention such as bed nets and prophylaxis, depending on epidemiology\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer for malaria prevention (such as bed nets and prophylaxis), depending on epidemiology\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology B.DE171&quot;:\n  exists &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology B.DE171 Condition&quot;\n    or exists &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology B.DE171 Observation&quot;\ndefine &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology B.DE171 Condition&quot;:\n  Elements.&quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology B.DE171 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology B.DE171 Observation&quot;:\n  Elements.&quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology B.DE171 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Malaria prevention such as bed nets and prophylaxis, depending on epidemiology B.DE171 */\n\n/*\n@dataElement: HIV.B.DE172 - Other support services\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer for other support services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other support services B.DE172&quot;:\n  exists &quot;Other support services B.DE172 Observation&quot;\ndefine &quot;Other support services B.DE172 Observation&quot;:\n  Elements.&quot;Other support services B.DE172 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other support services B.DE172 */\n\n/*\n@dataElement: HIV.B.DE173 - Mental health services\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer for mental health services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Mental health services B.DE173&quot;:\n  exists &quot;Mental health services B.DE173 Condition&quot;\n    or exists &quot;Mental health services B.DE173 Observation&quot;\ndefine &quot;Mental health services B.DE173 Condition&quot;:\n  Elements.&quot;Mental health services B.DE173 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Mental health services B.DE173 Observation&quot;:\n  Elements.&quot;Mental health services B.DE173 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Mental health services B.DE173 */\n\n/*\n@dataElement: HIV.B.DE174 - Psychosocial counselling, support and treatment adherence counselling\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer for psychosocial counselling, support and treatment adherence counselling\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Psychosocial counselling, support and treatment adherence counselling B.DE174&quot;:\n  exists &quot;Psychosocial counselling, support and treatment adherence counselling B.DE174 Condition&quot;\n    or exists &quot;Psychosocial counselling, support and treatment adherence counselling B.DE174 Observation&quot;\ndefine &quot;Psychosocial counselling, support and treatment adherence counselling B.DE174 Condition&quot;:\n  Elements.&quot;Psychosocial counselling, support and treatment adherence counselling B.DE174 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Psychosocial counselling, support and treatment adherence counselling B.DE174 Observation&quot;:\n  Elements.&quot;Psychosocial counselling, support and treatment adherence counselling B.DE174 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Psychosocial counselling, support and treatment adherence counselling B.DE174 */\n\n/*\n@dataElement: HIV.B.DE175 - Support for disclosure and partner services\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer for support for disclosure and partner services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Support for disclosure and partner services B.DE175&quot;:\n  exists &quot;Support for disclosure and partner services B.DE175 Condition&quot;\n    or exists &quot;Support for disclosure and partner services B.DE175 Observation&quot;\ndefine &quot;Support for disclosure and partner services B.DE175 Condition&quot;:\n  Elements.&quot;Support for disclosure and partner services B.DE175 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Support for disclosure and partner services B.DE175 Observation&quot;:\n  Elements.&quot;Support for disclosure and partner services B.DE175 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Support for disclosure and partner services B.DE175 */\n\n/*\n@dataElement: HIV.B.DE176 - Legal and social services\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer for legal and social services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Legal and social services B.DE176&quot;:\n  exists &quot;Legal and social services B.DE176 Condition&quot;\n    or exists &quot;Legal and social services B.DE176 Observation&quot;\ndefine &quot;Legal and social services B.DE176 Condition&quot;:\n  Elements.&quot;Legal and social services B.DE176 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Legal and social services B.DE176 Observation&quot;:\n  Elements.&quot;Legal and social services B.DE176 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Legal and social services B.DE176 */\n\n/*\n@dataElement: HIV.B.DE177 - Services for responding to violence against women\n@activity: HIV.B9 Determine recommended services\n@description: Offer or refer for services for responding to violence against women, including first-line support and psychosocial support, post-rape care and other support services including shelters, legal services and women and child protection services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Services for responding to violence against women B.DE177&quot;:\n  exists &quot;Services for responding to violence against women B.DE177 Condition&quot;\n    or exists &quot;Services for responding to violence against women B.DE177 Observation&quot;\ndefine &quot;Services for responding to violence against women B.DE177 Condition&quot;:\n  Elements.&quot;Services for responding to violence against women B.DE177 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Services for responding to violence against women B.DE177 Observation&quot;:\n  Elements.&quot;Services for responding to violence against women B.DE177 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Services for responding to violence against women B.DE177 */\n\n/*\n@dataElement: HIV.B.DE191 - Type of follow-up appointment\n@activity: HIV.B20 Schedule retest\n@description: Type of follow-up appointment for testing services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Type of follow-up appointment B.DE191&quot;:\n  exists &quot;Type of follow-up appointment B.DE191 Observation&quot;\ndefine &quot;Type of follow-up appointment B.DE191 Observation&quot;:\n  Elements.&quot;Type of follow-up appointment B.DE191 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Type of follow-up appointment B.DE191 */\n\n/*\n@dataElement: HIV.B.DE192 - Retesting for HIV\n@activity: HIV.B20 Schedule retest\n@description: Retesting follow-up appointment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Retesting for HIV B.DE192&quot;:\n  exists &quot;Retesting for HIV B.DE192 Condition&quot;\n    or exists &quot;Retesting for HIV B.DE192 Observation&quot;\ndefine &quot;Retesting for HIV B.DE192 Condition&quot;:\n  Elements.&quot;Retesting for HIV B.DE192 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Retesting for HIV B.DE192 Observation&quot;:\n  Elements.&quot;Retesting for HIV B.DE192 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Retesting for HIV B.DE192 */\n\n/*\n@dataElement: HIV.B.DE193 - Other\n@activity: HIV.B20 Schedule retest\n@description: Other reason for the follow-up appointment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other B.DE193&quot;:\n  exists &quot;Other B.DE193 Condition&quot;\n    or exists &quot;Other B.DE193 Observation&quot;\ndefine &quot;Other B.DE193 Condition&quot;:\n  Elements.&quot;Other B.DE193 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other B.DE193 Observation&quot;:\n  Elements.&quot;Other B.DE193 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other B.DE193 */\n\n/*\n@dataElement: HIV.B.DE195 - Date/time of follow-up appointment\n@activity: HIV.B20 Schedule retest\n@description: Date the patient is to return for monitoring, re-supply or any other reason\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date/time of follow-up appointment B.DE195&quot;:\n  Elements.&quot;Date/time of follow-up appointment B.DE195&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Date/time of follow-up appointment B.DE195 Value&quot;:\n  &quot;Date/time of follow-up appointment B.DE195&quot; O\n  return O.value\n/* End of Date/time of follow-up appointment B.DE195 */\n\n/*\n@dataElement: HIV.B.DE224 - HIV retest prior to starting ART conducted\n@activity: HIV.B20 Schedule retest\n@description: HIV retest prior to starting ART conducted\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV retest prior to starting ART conducted&quot;:\n  exists &quot;HIV retest prior to starting ART conducted Observation&quot;\ndefine &quot;HIV retest prior to starting ART conducted Observation&quot;:\n  Elements.&quot;HIV retest prior to starting ART conducted Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV retest prior to starting ART conducted */\n\n/*\n@dataElement: HIV.B.DE225 - At elevated risk for HIV acquisition\n@activity: HIV.B6 Capture or update client history\n@description: Client is at elevated risk for HIV acquisition\n*/\ndefine &quot;At elevated risk for HIV acquisition B.DE225&quot;:\n  Elements.&quot;At elevated risk for HIV acquisition B.DE225&quot; C\n    where C.prevalenceInterval() starts on or before Today\n      or C.encounter.references(EncounterId)\n/* End of At elevated risk for HIV acquisition B.DE225 */\n\n/*\n@dataElement: HIV.B.DE250 - Syphilis test result\n@activity: HIV.B23 Offer sexual and reproductive health services\n@description: Result from syphilis test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Syphilis test result B.DE250&quot;:\n  exists &quot;Syphilis test result B.DE250 Observation&quot;\ndefine &quot;Syphilis test result B.DE250 Observation&quot;:\n  Elements.&quot;Syphilis test result B.DE250 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Syphilis test result B.DE250 */\n\n/*\n@dataElement: HIV.B.DE251 - Positive\n@activity: HIV.B23 Offer sexual and reproductive health services\n@description: Test result is positive for syphilis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Positive B.DE251&quot;:\n  exists &quot;Positive B.DE251 Condition&quot;\n    or exists &quot;Positive B.DE251 Observation&quot;\ndefine &quot;Positive B.DE251 Condition&quot;:\n  Elements.&quot;Positive B.DE251 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\n    or C.encounter.references(EncounterId)\ndefine &quot;Positive B.DE251 Observation&quot;:\n  Elements.&quot;Positive B.DE251 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Positive B.DE251 */\n\n/*\n@dataElement: HIV.B.DE252 - Negative\n@activity: HIV.B23 Offer sexual and reproductive health services\n@description: Test result is negative for syphilis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Negative B.DE252&quot;:\n  exists &quot;Negative B.DE252 Condition&quot;\n    or exists &quot;Negative B.DE252 Observation&quot;\ndefine &quot;Negative B.DE252 Condition&quot;:\n  Elements.&quot;Negative B.DE252 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Negative B.DE252 Observation&quot;:\n  Elements.&quot;Negative B.DE252 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Negative B.DE252 */\n\n/*\n@dataElement: HIV.B.DE253 - Inconclusive\n@activity: HIV.B23 Offer sexual and reproductive health services\n@description: Test result is inconclusive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Inconclusive B.DE253&quot;:\n  exists &quot;Inconclusive B.DE253 Condition&quot;\n    or exists &quot;Inconclusive B.DE253 Observation&quot;\ndefine &quot;Inconclusive B.DE253 Condition&quot;:\n  Elements.&quot;Inconclusive B.DE253 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Inconclusive B.DE253 Observation&quot;:\n  Elements.&quot;Inconclusive B.DE253 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Inconclusive B.DE253 */\n\n/*\n@dataElement: HIV.C.DE9 - Date/time of suspected exposure to HIV\n@activity: HIV.C3 Capture or update client history\n@description: When the suspect exposure to HIV took place\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date/time of suspected exposure to HIV C.DE9&quot;:\n  Elements.&quot;Date/time of suspected exposure to HIV C.DE9&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Date/time of suspected exposure to HIV C.DE9 Value&quot;:\n  &quot;Date/time of suspected exposure to HIV C.DE9&quot; O\n  return O.value\n/* End of Date/time of suspected exposure to HIV C.DE9 */\n\n/*\n@dataElement: HIV.C.DE10 - Currently on PrEP\n@activity: HIV.C3 Capture or update client history\n@description: The client is currently taking PrEP. Oral pre-exposure prophylaxis (PrEP) of HIV is the use of ARV drugs by people who are not infected with HIV to block the acquisition of HIV.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Currently on PrEP&quot;:\n  exists &quot;Currently on PrEP Observation&quot;\ndefine &quot;Currently on PrEP Observation&quot;:\n  Elements.&quot;Currently on PrEP Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Currently on PrEP */\n\n/*\n@dataElement: HIV.C.DE17 - Current PrEP regimen\n@activity: HIV.C3 Capture or update client history\n@description: HIV pre-exposure prophylaxis (PrEP) regimen\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Current PrEP regimen&quot;:\n  exists &quot;Current PrEP regimen Observation&quot;\ndefine &quot;Current PrEP regimen Observation&quot;:\n  Elements.&quot;Current PrEP regimen Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Current PrEP regimen */\n\n/*\n@dataElement: HIV.C.DE18 - TDF + FTC\n@activity: HIV.C3 Capture or update client history\n@description: Treated with tenofovir disoproxil fumarate (TDF) and emtricitabine (FTC) pre-exposure prophylaxis (PrEP) regimen (oral PrEP)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TDF + FTC C.DE18&quot;:\n  exists &quot;TDF + FTC C.DE18 Condition&quot;\n    or exists &quot;TDF + FTC C.DE18 Observation&quot;\ndefine &quot;TDF + FTC C.DE18 Condition&quot;:\n  Elements.&quot;TDF + FTC C.DE18 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;TDF + FTC C.DE18 Observation&quot;:\n  Elements.&quot;TDF + FTC C.DE18 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TDF + FTC C.DE18 */\n\n/*\n@dataElement: HIV.C.DE19 - TDF\n@activity: HIV.C3 Capture or update client history\n@description: Treated with single-agent tenofovir disoproxil fumarate (TDF) pre-exposure prophylaxis (PrEP) regimen (oral PrEP)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TDF C.DE19&quot;:\n  exists &quot;TDF C.DE19 Condition&quot;\n    or exists &quot;TDF C.DE19 Observation&quot;\ndefine &quot;TDF C.DE19 Condition&quot;:\n  Elements.&quot;TDF C.DE19 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;TDF C.DE19 Observation&quot;:\n  Elements.&quot;TDF C.DE19 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TDF C.DE19 */\n\n/*\n@dataElement: HIV.C.DE20 - TDF + 3TC\n@activity: HIV.C3 Capture or update client history\n@description: Treated with tenofovir disoproxil fumarate (TDF) and lamivudine (3TC) pre-exposure prophylaxis (PrEP) regimen (oral PrEP)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TDF + 3TC C.DE20&quot;:\n  exists &quot;TDF + 3TC C.DE20 Condition&quot;\n    or exists &quot;TDF + 3TC C.DE20 Observation&quot;\ndefine &quot;TDF + 3TC C.DE20 Condition&quot;:\n  Elements.&quot;TDF + 3TC C.DE20 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;TDF + 3TC C.DE20 Observation&quot;:\n  Elements.&quot;TDF + 3TC C.DE20 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TDF + 3TC C.DE20 */\n\n/*\n@dataElement: HIV.C.DE21 - Other TDF-based regimen\n@activity: HIV.C3 Capture or update client history\n@description: Treated with other tenofovir disoproxil fumarate (TDF)-based regimen (oral PrEP)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other TDF-based regimen&quot;:\n  exists &quot;Other TDF-based regimen Condition&quot;\n    or exists &quot;Other TDF-based regimen Observation&quot;\ndefine &quot;Other TDF-based regimen Condition&quot;:\n  Elements.&quot;Other TDF-based regimen Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other TDF-based regimen Observation&quot;:\n  Elements.&quot;Other TDF-based regimen Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other TDF-based regimen */\n\n/*\n@dataElement: HIV.C.DE22 - Dapivirine vaginal ring DVR\n@activity: HIV.C3 Capture or update client history\n@description: Dapivirine vaginal ring (DVR) for HIV prevention\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Dapivirine vaginal ring DVR C.DE22&quot;:\n  exists &quot;Dapivirine vaginal ring DVR C.DE22 Condition&quot;\n    or exists &quot;Dapivirine vaginal ring DVR C.DE22 Observation&quot;\ndefine &quot;Dapivirine vaginal ring DVR C.DE22 Condition&quot;:\n  Elements.&quot;Dapivirine vaginal ring DVR C.DE22 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Dapivirine vaginal ring DVR C.DE22 Observation&quot;:\n  Elements.&quot;Dapivirine vaginal ring DVR C.DE22 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Dapivirine vaginal ring DVR C.DE22 */\n\n/*\n@dataElement: HIV.C.DE23 - CAB-LA\n@activity: HIV.C3 Capture or update client history\n@description: Long-acting injectable cabotegravir\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;CAB-LA C.DE23&quot;:\n  exists &quot;CAB-LA C.DE23 Condition&quot;\n    or exists &quot;CAB-LA C.DE23 Observation&quot;\ndefine &quot;CAB-LA C.DE23 Condition&quot;:\n  Elements.&quot;CAB-LA C.DE23 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;CAB-LA C.DE23 Observation&quot;:\n  Elements.&quot;CAB-LA C.DE23 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of CAB-LA C.DE23 */\n\n/*\n@dataElement: HIV.C.DE31 - PEP history\n@activity: HIV.C3 Capture or update client history\n@description: The client's history in taking post-exposure prophylaxis (PEP) for HIV prevention\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;PEP history&quot;:\n  exists &quot;PEP history Observation&quot;\ndefine &quot;PEP history Observation&quot;:\n  Elements.&quot;PEP history Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of PEP history */\n\n/*\n@dataElement: HIV.C.DE32 - First-time user\n@activity: HIV.C3 Capture or update client history\n@description: The client has never used post-exposure prophylaxis (PEP) before\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;First-time user C.DE32&quot;:\n  exists &quot;First-time user C.DE32 Condition&quot;\n    or exists &quot;First-time user C.DE32 Observation&quot;\ndefine &quot;First-time user C.DE32 Condition&quot;:\n  Elements.&quot;First-time user C.DE32 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;First-time user C.DE32 Observation&quot;:\n  Elements.&quot;First-time user C.DE32 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of First-time user C.DE32 */\n\n/*\n@dataElement: HIV.C.DE33 - Repeat user\n@activity: HIV.C3 Capture or update client history\n@description: The client has used post-exposure prophylaxis (PEP) before\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Repeat user&quot;:\n  exists &quot;Repeat user Condition&quot;\n    or exists &quot;Repeat user Observation&quot;\ndefine &quot;Repeat user Condition&quot;:\n  Elements.&quot;Repeat user Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Repeat user Observation&quot;:\n  Elements.&quot;Repeat user Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Repeat user */\n\n/*\n@dataElement: HIV.C.DE36 - Signs of substantial risk of HIV infection\n@activity: HIV.C3 Capture or update client history\n@description: Signs the client is at a substantial risk of HIV infection\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Signs of substantial risk of HIV infection C.DE36&quot;:\n  exists &quot;Signs of substantial risk of HIV infection C.DE36 Observation&quot;\ndefine &quot;Signs of substantial risk of HIV infection C.DE36 Observation&quot;:\n  Elements.&quot;Signs of substantial risk of HIV infection C.DE36 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Signs of substantial risk of HIV infection C.DE36 */\n\n/*\n@dataElement: HIV.C.DE37 - No condom use during sex with more than one partner in the past 6 months\n@activity: HIV.C3 Capture or update client history\n@description: Recent vaginal or anal sexual intercourse without a condom with more than one partner\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;No condom use during sex with more than one partner in the past 6 months C.DE37&quot;:\n  exists &quot;No condom use during sex with more than one partner in the past 6 months C.DE37 Condition&quot;\n    or exists &quot;No condom use during sex with more than one partner in the past 6 months C.DE37 Observation&quot;\ndefine &quot;No condom use during sex with more than one partner in the past 6 months C.DE37 Condition&quot;:\n  Elements.&quot;No condom use during sex with more than one partner in the past 6 months C.DE37 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;No condom use during sex with more than one partner in the past 6 months C.DE37 Observation&quot;:\n  Elements.&quot;No condom use during sex with more than one partner in the past 6 months C.DE37 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of No condom use during sex with more than one partner in the past 6 months C.DE37 */\n\n/*\n@dataElement: HIV.C.DE38 - STI in the past 6 months\n@activity: HIV.C3 Capture or update client history\n@description: A recent history (in the last 6 months) of a sexually transmitted infection (STI ) by laboratory testing, self-report or syndromic STI treatment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;STI in the past 6 months C.DE38&quot;:\n  exists &quot;STI in the past 6 months C.DE38 Condition&quot;\n    or exists &quot;STI in the past 6 months C.DE38 Observation&quot;\ndefine &quot;STI in the past 6 months C.DE38 Condition&quot;:\n  Elements.&quot;STI in the past 6 months C.DE38 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;STI in the past 6 months C.DE38 Observation&quot;:\n  Elements.&quot;STI in the past 6 months C.DE38 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of STI in the past 6 months C.DE38 */\n\n/*\n@dataElement: HIV.C.DE39 - A sexual partner in the past 6 months had one or more HIV risk factors\n@activity: HIV.C3 Capture or update client history\n@description: A recent sex partner of the client had HIV risk factors\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;A sexual partner in the past 6 months had one or more HIV risk factors C.DE39&quot;:\n  exists &quot;A sexual partner in the past 6 months had one or more HIV risk factors C.DE39 Condition&quot;\n    or exists &quot;A sexual partner in the past 6 months had one or more HIV risk factors C.DE39 Observation&quot;\ndefine &quot;A sexual partner in the past 6 months had one or more HIV risk factors C.DE39 Condition&quot;:\n  Elements.&quot;A sexual partner in the past 6 months had one or more HIV risk factors C.DE39 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;A sexual partner in the past 6 months had one or more HIV risk factors C.DE39 Observation&quot;:\n  Elements.&quot;A sexual partner in the past 6 months had one or more HIV risk factors C.DE39 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of A sexual partner in the past 6 months had one or more HIV risk factors C.DE39 */\n\n/*\n@dataElement: HIV.C.DE40 - PrEP requested by client\n@activity: HIV.C3 Capture or update client history\n@description: Client is requesting PrEP, reflecting a decision-making process has already taken place and suggesting of substantial risk of HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;PrEP requested by client C.DE40&quot;:\n  exists &quot;PrEP requested by client C.DE40 Condition&quot;\n    or exists &quot;PrEP requested by client C.DE40 Observation&quot;\ndefine &quot;PrEP requested by client C.DE40 Condition&quot;:\n  Elements.&quot;PrEP requested by client C.DE40 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;PrEP requested by client C.DE40 Observation&quot;:\n  Elements.&quot;PrEP requested by client C.DE40 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of PrEP requested by client C.DE40 */\n\n/*\n@dataElement: HIV.C.DE46 - Acute HIV infection symptoms\n@activity: HIV.C3 Capture or update client history\n@description: Symptoms that could suggest an acute HIV infection\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Acute HIV infection symptoms C.DE46&quot;:\n  exists &quot;Acute HIV infection symptoms C.DE46 Observation&quot;\ndefine &quot;Acute HIV infection symptoms C.DE46 Observation&quot;:\n  Elements.&quot;Acute HIV infection symptoms C.DE46 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Acute HIV infection symptoms C.DE46 */\n\n/*\n@dataElement: HIV.C.DE47 - Fever\n@activity: HIV.C3 Capture or update client history\n@description: Client's symptoms include a fever\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Fever&quot;:\n  exists &quot;Fever Condition&quot;\n    or exists &quot;Fever Observation&quot;\ndefine &quot;Fever Condition&quot;:\n  Elements.&quot;Fever Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Fever Observation&quot;:\n  Elements.&quot;Fever Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Fever */\n\n/*\n@dataElement: HIV.C.DE48 - Sore throat\n@activity: HIV.C3 Capture or update client history\n@description: Client's symptoms include a sore throat\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Sore throat&quot;:\n  exists &quot;Sore throat Condition&quot;\n    or exists &quot;Sore throat Observation&quot;\ndefine &quot;Sore throat Condition&quot;:\n  Elements.&quot;Sore throat Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Sore throat Observation&quot;:\n  Elements.&quot;Sore throat Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Sore throat */\n\n/*\n@dataElement: HIV.C.DE49 - Aches\n@activity: HIV.C3 Capture or update client history\n@description: Client's symptoms include aches\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Aches&quot;:\n  exists &quot;Aches Condition&quot;\n    or exists &quot;Aches Observation&quot;\ndefine &quot;Aches Condition&quot;:\n  Elements.&quot;Aches Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Aches Observation&quot;:\n  Elements.&quot;Aches Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Aches */\n\n/*\n@dataElement: HIV.C.DE50 - Pains\n@activity: HIV.C3 Capture or update client history\n@description: Client's symptoms include pains\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Pains&quot;:\n  exists &quot;Pains Condition&quot;\n    or exists &quot;Pains Observation&quot;\ndefine &quot;Pains Condition&quot;:\n  Elements.&quot;Pains Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Pains Observation&quot;:\n  Elements.&quot;Pains Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Pains */\n\n/*\n@dataElement: HIV.C.DE51 - Swollen glands\n@activity: HIV.C3 Capture or update client history\n@description: Client's symptoms include swollen glands\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Swollen glands&quot;:\n  exists &quot;Swollen glands Condition&quot;\n    or exists &quot;Swollen glands Observation&quot;\ndefine &quot;Swollen glands Condition&quot;:\n  Elements.&quot;Swollen glands Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Swollen glands Observation&quot;:\n  Elements.&quot;Swollen glands Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Swollen glands */\n\n/*\n@dataElement: HIV.C.DE52 - Mouth sores\n@activity: HIV.C3 Capture or update client history\n@description: Client's symptoms include a mouth sores\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Mouth sores&quot;:\n  exists &quot;Mouth sores Condition&quot;\n    or exists &quot;Mouth sores Observation&quot;\ndefine &quot;Mouth sores Condition&quot;:\n  Elements.&quot;Mouth sores Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Mouth sores Observation&quot;:\n  Elements.&quot;Mouth sores Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Mouth sores */\n\n/*\n@dataElement: HIV.C.DE53 - Headaches\n@activity: HIV.C3 Capture or update client history\n@description: Client's symptoms include a headaches\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Headaches&quot;:\n  exists &quot;Headaches Condition&quot;\n    or exists &quot;Headaches Observation&quot;\ndefine &quot;Headaches Condition&quot;:\n  Elements.&quot;Headaches Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Headaches Observation&quot;:\n  Elements.&quot;Headaches Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Headaches */\n\n/*\n@dataElement: HIV.C.DE54 - Rash\n@activity: HIV.C3 Capture or update client history\n@description: Client's symptoms include a rash\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Rash&quot;:\n  exists &quot;Rash Condition&quot;\n    or exists &quot;Rash Observation&quot;\ndefine &quot;Rash Condition&quot;:\n  Elements.&quot;Rash Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Rash Observation&quot;:\n  Elements.&quot;Rash Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Rash */\n\n/*\n@dataElement: HIV.C.DE55 - Sex partners HIV treatment status\n@activity: HIV.C3 Capture or update client history\n@description: Treatment adherence of client's sex partner for partners that are HIV-positive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Sex partners HIV treatment status&quot;:\n  exists &quot;Sex partners HIV treatment status Observation&quot;\ndefine &quot;Sex partners HIV treatment status Observation&quot;:\n  Elements.&quot;Sex partners HIV treatment status Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Sex partners HIV treatment status */\n\n/*\n@dataElement: HIV.C.DE56 - Not on ART\n@activity: HIV.C3 Capture or update client history\n@description: Sex partner is HIV-positive and not on ART\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Not on ART&quot;:\n  exists &quot;Not on ART Condition&quot;\n    or exists &quot;Not on ART Observation&quot;\ndefine &quot;Not on ART Condition&quot;:\n  Elements.&quot;Not on ART Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Not on ART Observation&quot;:\n  Elements.&quot;Not on ART Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Not on ART */\n\n/*\n@dataElement: HIV.C.DE57 - On ART less than 6 months\n@activity: HIV.C3 Capture or update client history\n@description: Sex partner is HIV-positive and is on ART less than 6 months. ART may take up to 6 months to suppress viral load. In studies of serodiscordant couples, pre-exposure prophylaxis (PrEP) has provided a useful bridge to full viral suppression by the partner during that time.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;On ART less than 6 months&quot;:\n  exists &quot;On ART less than 6 months Condition&quot;\n    or exists &quot;On ART less than 6 months Observation&quot;\ndefine &quot;On ART less than 6 months Condition&quot;:\n  Elements.&quot;On ART less than 6 months Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;On ART less than 6 months Observation&quot;:\n  Elements.&quot;On ART less than 6 months Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of On ART less than 6 months */\n\n/*\n@dataElement: HIV.C.DE58 - Partner has suspected low adherence to ART\n@activity: HIV.C3 Capture or update client history\n@description: Sex partner is HIV-positive and is suspected to have low adherence to ART. There have been gaps in the partner's treatment adherence or the couple is not communicating openly about treatment adherence and viral load test results.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Partner has suspected low adherence to ART&quot;:\n  exists &quot;Partner has suspected low adherence to ART Condition&quot;\n    or exists &quot;Partner has suspected low adherence to ART Observation&quot;\ndefine &quot;Partner has suspected low adherence to ART Condition&quot;:\n  Elements.&quot;Partner has suspected low adherence to ART Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Partner has suspected low adherence to ART Observation&quot;:\n  Elements.&quot;Partner has suspected low adherence to ART Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Partner has suspected low adherence to ART */\n\n/*\n@dataElement: HIV.C.DE59 - Partner is not virally suppressed\n@activity: HIV.C3 Capture or update client history\n@description: Sex partner is HIV-positive and not virally suppressed\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Partner is not virally suppressed&quot;:\n  exists &quot;Partner is not virally suppressed Condition&quot;\n    or exists &quot;Partner is not virally suppressed Observation&quot;\ndefine &quot;Partner is not virally suppressed Condition&quot;:\n  Elements.&quot;Partner is not virally suppressed Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Partner is not virally suppressed Observation&quot;:\n  Elements.&quot;Partner is not virally suppressed Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Partner is not virally suppressed */\n\n/*\n@dataElement: HIV.C.DE60 - Partner is virally suppressed and has been on ART for 6 months or more\n@activity: HIV.C3 Capture or update client history\n@description: Sex partner is HIV-positive and virally suppressed with 6 months or more on ART\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Partner is virally suppressed and has been on ART for 6 months or more&quot;:\n  exists &quot;Partner is virally suppressed and has been on ART for 6 months or more Condition&quot;\n    or exists &quot;Partner is virally suppressed and has been on ART for 6 months or more Observation&quot;\ndefine &quot;Partner is virally suppressed and has been on ART for 6 months or more Condition&quot;:\n  Elements.&quot;Partner is virally suppressed and has been on ART for 6 months or more Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Partner is virally suppressed and has been on ART for 6 months or more Observation&quot;:\n  Elements.&quot;Partner is virally suppressed and has been on ART for 6 months or more Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Partner is virally suppressed and has been on ART for 6 months or more */\n\n/*\n@dataElement: HIV.C.DE61 - Suitable for PrEP\n@activity: HIV.C8 Suitable for PrEP or PEP?\n@description: The client is suitable for PrEP\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Suitable for PrEP&quot;:\n  exists &quot;Suitable for PrEP Observation&quot;\ndefine &quot;Suitable for PrEP Observation&quot;:\n  Elements.&quot;Suitable for PrEP Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Suitable for PrEP */\n\n/*\n@dataElement: HIV.C.DE91 - Preferred PEP backbone regimen\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Preferred backbone regimen for PEP\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Preferred PEP backbone regimen&quot;:\n  exists &quot;Preferred PEP backbone regimen Observation&quot;\ndefine &quot;Preferred PEP backbone regimen Observation&quot;:\n  Elements.&quot;Preferred PEP backbone regimen Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Preferred PEP backbone regimen */\n\n/*\n@dataElement: HIV.C.DE92 - TDF + 3TC\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Preferred backbone containing tenofovir disoproxil fumarate and lamivudine\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TDF + 3TC C.DE92&quot;:\n  exists &quot;TDF + 3TC C.DE92 Condition&quot;\n    or exists &quot;TDF + 3TC C.DE92 Observation&quot;\ndefine &quot;TDF + 3TC C.DE92 Condition&quot;:\n  Elements.&quot;TDF + 3TC C.DE92 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;TDF + 3TC C.DE92 Observation&quot;:\n  Elements.&quot;TDF + 3TC C.DE92 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TDF + 3TC C.DE92 */\n\n/*\n@dataElement: HIV.C.DE93 - TDF + FTC\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Preferred backbone containing tenofovir disoproxil fumarate and emtricitabine\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TDF + FTC C.DE93&quot;:\n  exists &quot;TDF + FTC C.DE93 Condition&quot;\n    or exists &quot;TDF + FTC C.DE93 Observation&quot;\ndefine &quot;TDF + FTC C.DE93 Condition&quot;:\n  Elements.&quot;TDF + FTC C.DE93 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;TDF + FTC C.DE93 Observation&quot;:\n  Elements.&quot;TDF + FTC C.DE93 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TDF + FTC C.DE93 */\n\n/*\n@dataElement: HIV.C.DE94 - AZT + 3TC\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Preferred backbone containing zidovudine and lamivudine\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;AZT + 3TC&quot;:\n  exists &quot;AZT + 3TC Condition&quot;\n    or exists &quot;AZT + 3TC Observation&quot;\ndefine &quot;AZT + 3TC Condition&quot;:\n  Elements.&quot;AZT + 3TC Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;AZT + 3TC Observation&quot;:\n  Elements.&quot;AZT + 3TC Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of AZT + 3TC */\n\n/*\n@dataElement: HIV.C.DE95 - Alternative PEP backbone regimen\n@activity: HIV.C3 Capture or update client history\n@description: Alternative backbone regimen for PEP\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Alternative PEP backbone regimen&quot;:\n  exists &quot;Alternative PEP backbone regimen Observation&quot;\ndefine &quot;Alternative PEP backbone regimen Observation&quot;:\n  Elements.&quot;Alternative PEP backbone regimen Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Alternative PEP backbone regimen */\n\n/*\n@dataElement: HIV.C.DE96 - ABC + 3TC\n@activity: HIV.C3 Capture or update client history\n@description: Alternative backbone containing abacavir and lamivudine\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ABC + 3TC&quot;:\n  exists &quot;ABC + 3TC Condition&quot;\n    or exists &quot;ABC + 3TC Observation&quot;\ndefine &quot;ABC + 3TC Condition&quot;:\n  Elements.&quot;ABC + 3TC Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;ABC + 3TC Observation&quot;:\n  Elements.&quot;ABC + 3TC Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of ABC + 3TC */\n\n/*\n@dataElement: HIV.C.DE97 - TDF + 3TC\n@activity: HIV.C3 Capture or update client history\n@description: Alternative backbone containing tenofovir disoproxil fumarate and lamivudine\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TDF + 3TC C.DE97&quot;:\n  exists &quot;TDF + 3TC C.DE97 Condition&quot;\n    or exists &quot;TDF + 3TC C.DE97 Observation&quot;\ndefine &quot;TDF + 3TC C.DE97 Condition&quot;:\n  Elements.&quot;TDF + 3TC C.DE97 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;TDF + 3TC C.DE97 Observation&quot;:\n  Elements.&quot;TDF + 3TC C.DE97 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TDF + 3TC C.DE97 */\n\n/*\n@dataElement: HIV.C.DE98 - TDF + FTC\n@activity: HIV.C3 Capture or update client history\n@description: Alternative backbone containing tenofovir disoproxil fumarate and emtricitabine\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TDF + FTC C.DE98&quot;:\n  exists &quot;TDF + FTC C.DE98 Condition&quot;\n    or exists &quot;TDF + FTC C.DE98 Observation&quot;\ndefine &quot;TDF + FTC C.DE98 Condition&quot;:\n  Elements.&quot;TDF + FTC C.DE98 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;TDF + FTC C.DE98 Observation&quot;:\n  Elements.&quot;TDF + FTC C.DE98 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TDF + FTC C.DE98 */\n\n/*\n@dataElement: HIV.C.DE99 - Preferred third PEP drug\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Preferred third drug for PEP\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Preferred third PEP drug&quot;:\n  exists &quot;Preferred third PEP drug Observation&quot;\ndefine &quot;Preferred third PEP drug Observation&quot;:\n  Elements.&quot;Preferred third PEP drug Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Preferred third PEP drug */\n\n/*\n@dataElement: HIV.C.DE100 - DTG\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Preferred third drug of dolutegravir\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;DTG C.DE100&quot;:\n  exists &quot;DTG C.DE100 Condition&quot;\n    or exists &quot;DTG C.DE100 Observation&quot;\ndefine &quot;DTG C.DE100 Condition&quot;:\n  Elements.&quot;DTG C.DE100 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;DTG C.DE100 Observation&quot;:\n  Elements.&quot;DTG C.DE100 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of DTG C.DE100 */\n\n/*\n@dataElement: HIV.C.DE101 - Alternative third PEP drug\n@activity: HIV.C3 Capture or update client history\n@description: Alternative third drug for PEP\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Alternative third PEP drug&quot;:\n  exists &quot;Alternative third PEP drug Observation&quot;\ndefine &quot;Alternative third PEP drug Observation&quot;:\n  Elements.&quot;Alternative third PEP drug Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Alternative third PEP drug */\n\n/*\n@dataElement: HIV.C.DE102 - ATV/r\n@activity: HIV.C3 Capture or update client history\n@description: Alternative third drug of atazanavir/ritonavir (ATV/r)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ATV/r C.DE102&quot;:\n  exists &quot;ATV/r C.DE102 Condition&quot;\n    or exists &quot;ATV/r C.DE102 Observation&quot;\ndefine &quot;ATV/r C.DE102 Condition&quot;:\n  Elements.&quot;ATV/r C.DE102 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;ATV/r C.DE102 Observation&quot;:\n  Elements.&quot;ATV/r C.DE102 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of ATV/r C.DE102 */\n\n/*\n@dataElement: HIV.C.DE103 - DRV/r\n@activity: HIV.C3 Capture or update client history\n@description: Alternative third drug of darunavir/ritonavir (DRV/r)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;DRV/r C.DE103&quot;:\n  exists &quot;DRV/r C.DE103 Condition&quot;\n    or exists &quot;DRV/r C.DE103 Observation&quot;\ndefine &quot;DRV/r C.DE103 Condition&quot;:\n  Elements.&quot;DRV/r C.DE103 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;DRV/r C.DE103 Observation&quot;:\n  Elements.&quot;DRV/r C.DE103 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of DRV/r C.DE103 */\n\n/*\n@dataElement: HIV.C.DE104 - LPV/r\n@activity: HIV.C3 Capture or update client history\n@description: Alternative third drug of lopinavir/ritonavir (LPV/r)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;LPV/r C.DE104&quot;:\n  exists &quot;LPV/r C.DE104 Condition&quot;\n    or exists &quot;LPV/r C.DE104 Observation&quot;\ndefine &quot;LPV/r C.DE104 Condition&quot;:\n  Elements.&quot;LPV/r C.DE104 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;LPV/r C.DE104 Observation&quot;:\n  Elements.&quot;LPV/r C.DE104 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of LPV/r C.DE104 */\n\n/*\n@dataElement: HIV.C.DE105 - RAL\n@activity: HIV.C3 Capture or update client history\n@description: Alternative third drug of raltegravir (RAL)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;RAL C.DE105&quot;:\n  exists &quot;RAL C.DE105 Condition&quot;\n    or exists &quot;RAL C.DE105 Observation&quot;\ndefine &quot;RAL C.DE105 Condition&quot;:\n  Elements.&quot;RAL C.DE105 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;RAL C.DE105 Observation&quot;:\n  Elements.&quot;RAL C.DE105 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of RAL C.DE105 */\n\n/*\n@dataElement: HIV.C.DE106 - Estimated creatinine clearance\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Estimated creatinine clearance of the client returned from lab in mL/min\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Estimated creatinine clearance&quot;:\n  Elements.&quot;Estimated creatinine clearance&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Estimated creatinine clearance Value&quot;:\n  &quot;Estimated creatinine clearance&quot; O\n  return O.value\n/* End of Estimated creatinine clearance */\n\n/*\n@dataElement: HIV.C.DE112 - Contraindications to PrEP usage\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Listing of contraindications to pre-exposure prophylaxis (PrEP)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Contraindications to PrEP usage&quot;:\n  exists &quot;Contraindications to PrEP usage Observation&quot;\ndefine &quot;Contraindications to PrEP usage Observation&quot;:\n  Elements.&quot;Contraindications to PrEP usage Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Contraindications to PrEP usage */\n\n/*\n@dataElement: HIV.C.DE113 - Tenofovir disoproxil fumarate TDF allergy or contraindication\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Allergy to pre-exposure prophylaxis (PrEP) tenofovir disoproxil fumarate (TDF)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Tenofovir disoproxil fumarate TDF allergy or contraindication&quot;:\n  exists &quot;Tenofovir disoproxil fumarate TDF allergy or contraindication Condition&quot;\n    or exists &quot;Tenofovir disoproxil fumarate TDF allergy or contraindication Observation&quot;\ndefine &quot;Tenofovir disoproxil fumarate TDF allergy or contraindication Condition&quot;:\n  Elements.&quot;Tenofovir disoproxil fumarate TDF allergy or contraindication Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Tenofovir disoproxil fumarate TDF allergy or contraindication Observation&quot;:\n  Elements.&quot;Tenofovir disoproxil fumarate TDF allergy or contraindication Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Tenofovir disoproxil fumarate TDF allergy or contraindication */\n\n/*\n@dataElement: HIV.C.DE114 - HIV-positive\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Client is HIV-positive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV-positive C.DE114&quot;:\n  exists &quot;HIV-positive C.DE114 Condition&quot;\n    or exists &quot;HIV-positive C.DE114 Observation&quot;\ndefine &quot;HIV-positive C.DE114 Condition&quot;:\n  Elements.&quot;HIV-positive C.DE114 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV-positive C.DE114 Observation&quot;:\n  Elements.&quot;HIV-positive C.DE114 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV-positive C.DE114 */\n\n/*\n@dataElement: HIV.C.DE115 - Low estimated creatinine clearance\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Estimated creatinine clearance of less than 60 ml/min (if known)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Low estimated creatinine clearance&quot;:\n  exists &quot;Low estimated creatinine clearance Condition&quot;\n    or exists &quot;Low estimated creatinine clearance Observation&quot;\ndefine &quot;Low estimated creatinine clearance Condition&quot;:\n  Elements.&quot;Low estimated creatinine clearance Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Low estimated creatinine clearance Observation&quot;:\n  Elements.&quot;Low estimated creatinine clearance Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Low estimated creatinine clearance */\n\n/*\n@dataElement: HIV.C.DE116 - Acute HIV infection symptoms\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Symptoms that could suggest an acute HIV infection\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Acute HIV infection symptoms C.DE116&quot;:\n  exists &quot;Acute HIV infection symptoms C.DE116 Condition&quot;\n    or exists &quot;Acute HIV infection symptoms C.DE116 Observation&quot;\ndefine &quot;Acute HIV infection symptoms C.DE116 Condition&quot;:\n  Elements.&quot;Acute HIV infection symptoms C.DE116 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Acute HIV infection symptoms C.DE116 Observation&quot;:\n  Elements.&quot;Acute HIV infection symptoms C.DE116 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Acute HIV infection symptoms C.DE116 */\n\n/*\n@dataElement: HIV.C.DE117 - Probable recent exposure to HIV\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: When the client is reported to have had probable recent exposure to HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Probable recent exposure to HIV&quot;:\n  exists &quot;Probable recent exposure to HIV Condition&quot;\n    or exists &quot;Probable recent exposure to HIV Observation&quot;\ndefine &quot;Probable recent exposure to HIV Condition&quot;:\n  Elements.&quot;Probable recent exposure to HIV Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Probable recent exposure to HIV Observation&quot;:\n  Elements.&quot;Probable recent exposure to HIV Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Probable recent exposure to HIV */\n\n/*\n@dataElement: HIV.C.DE118 - Other allergy or contraindication to a medicine in the PrEP regimen\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Client has another allergy or contraindication to a medicine in the pre-exposure prophylaxis (PrEP) regimen\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other allergy or contraindication to a medicine in the PrEP regimen&quot;:\n  exists &quot;Other allergy or contraindication to a medicine in the PrEP regimen Condition&quot;\n    or exists &quot;Other allergy or contraindication to a medicine in the PrEP regimen Observation&quot;\ndefine &quot;Other allergy or contraindication to a medicine in the PrEP regimen Condition&quot;:\n  Elements.&quot;Other allergy or contraindication to a medicine in the PrEP regimen Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other allergy or contraindication to a medicine in the PrEP regimen Observation&quot;:\n  Elements.&quot;Other allergy or contraindication to a medicine in the PrEP regimen Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other allergy or contraindication to a medicine in the PrEP regimen */\n\n/*\n@dataElement: HIV.C.DE123 - Adherence counselling provided\n@activity: HIV.C23 Prescribe or administer PrEP or PEP\n@description: Whether adherence counselling was provided\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Adherence counselling provided C.DE123&quot;:\n  exists &quot;Adherence counselling provided C.DE123 Observation&quot;\ndefine &quot;Adherence counselling provided C.DE123 Observation&quot;:\n  Elements.&quot;Adherence counselling provided C.DE123 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Adherence counselling provided C.DE123 */\n\n/*\n@dataElement: HIV.C.DE124 - Date/time of follow-up appointment\n@activity: HIV.C24 Schedule follow-up\n@description: Date the client is to return for monitoring, re-supply, or any other reason\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date/time of follow-up appointment C.DE124&quot;:\n  Elements.&quot;Date/time of follow-up appointment C.DE124&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Date/time of follow-up appointment C.DE124 Value&quot;:\n  &quot;Date/time of follow-up appointment C.DE124&quot; O\n  return O.value\n/* End of Date/time of follow-up appointment C.DE124 */\n\n/*\n@dataElement: HIV.C.DE125 - Type of follow-up appointment\n@activity: HIV.C24 Schedule follow-up\n@description: Type of follow-up appointment for testing services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Type of follow-up appointment C.DE125&quot;:\n  exists &quot;Type of follow-up appointment C.DE125 Observation&quot;\ndefine &quot;Type of follow-up appointment C.DE125 Observation&quot;:\n  Elements.&quot;Type of follow-up appointment C.DE125 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Type of follow-up appointment C.DE125 */\n\n/*\n@dataElement: HIV.C.DE126 - Retesting for HIV\n@activity: HIV.C24 Schedule follow-up\n@description: Retesting follow-up appointment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Retesting for HIV C.DE126&quot;:\n  exists &quot;Retesting for HIV C.DE126 Condition&quot;\n    or exists &quot;Retesting for HIV C.DE126 Observation&quot;\ndefine &quot;Retesting for HIV C.DE126 Condition&quot;:\n  Elements.&quot;Retesting for HIV C.DE126 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Retesting for HIV C.DE126 Observation&quot;:\n  Elements.&quot;Retesting for HIV C.DE126 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Retesting for HIV C.DE126 */\n\n/*\n@dataElement: HIV.C.DE127 - Follow-up appointment for PrEP\n@activity: HIV.C24 Schedule follow-up\n@description: Retesting follow-up appointment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Follow-up appointment for PrEP&quot;:\n  exists &quot;Follow-up appointment for PrEP Condition&quot;\n    or exists &quot;Follow-up appointment for PrEP Observation&quot;\ndefine &quot;Follow-up appointment for PrEP Condition&quot;:\n  Elements.&quot;Follow-up appointment for PrEP Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Follow-up appointment for PrEP Observation&quot;:\n  Elements.&quot;Follow-up appointment for PrEP Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Follow-up appointment for PrEP */\n\n/*\n@dataElement: HIV.C.DE128 - Other\n@activity: HIV.C24 Schedule follow-up\n@description: Other reason for the follow-up appointment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other C.DE128&quot;:\n  exists &quot;Other C.DE128 Condition&quot;\n    or exists &quot;Other C.DE128 Observation&quot;\ndefine &quot;Other C.DE128 Condition&quot;:\n  Elements.&quot;Other C.DE128 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other C.DE128 Observation&quot;:\n  Elements.&quot;Other C.DE128 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other C.DE128 */\n\n/*\n@dataElement: HIV.C.DE131 - Prevention services offered and referrals\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer to prevention services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Prevention services offered and referrals C.DE131&quot;:\n  exists &quot;Prevention services offered and referrals C.DE131 Observation&quot;\ndefine &quot;Prevention services offered and referrals C.DE131 Observation&quot;:\n  Elements.&quot;Prevention services offered and referrals C.DE131 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Prevention services offered and referrals C.DE131 */\n\n/*\n@dataElement: HIV.C.DE132 - Male and female condoms and condom-compatible lubricants offered\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer male and female condoms and condom-compatible lubricants\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Male and female condoms and condom-compatible lubricants offered&quot;:\n  exists &quot;Male and female condoms and condom-compatible lubricants offered Condition&quot;\n    or exists &quot;Male and female condoms and condom-compatible lubricants offered Observation&quot;\ndefine &quot;Male and female condoms and condom-compatible lubricants offered Condition&quot;:\n  Elements.&quot;Male and female condoms and condom-compatible lubricants offered Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Male and female condoms and condom-compatible lubricants offered Observation&quot;:\n  Elements.&quot;Male and female condoms and condom-compatible lubricants offered Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Male and female condoms and condom-compatible lubricants offered */\n\n/*\n@dataElement: HIV.C.DE133 - Voluntary medical male circumcision VMMC referral\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer referral for VMMC services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Voluntary medical male circumcision VMMC referral&quot;:\n  exists &quot;Voluntary medical male circumcision VMMC referral Condition&quot;\n    or exists &quot;Voluntary medical male circumcision VMMC referral Observation&quot;\ndefine &quot;Voluntary medical male circumcision VMMC referral Condition&quot;:\n  Elements.&quot;Voluntary medical male circumcision VMMC referral Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Voluntary medical male circumcision VMMC referral Observation&quot;:\n  Elements.&quot;Voluntary medical male circumcision VMMC referral Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Voluntary medical male circumcision VMMC referral */\n\n/*\n@dataElement: HIV.C.DE134 - Harm reduction for people who inject drugs\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer to harm reduction for people who inject drugs (needle and syringe programmes, opioid substitution therapy, other drug-dependence treatment and opioid overdose prevention and management) services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Harm reduction for people who inject drugs C.DE134&quot;:\n  exists &quot;Harm reduction for people who inject drugs C.DE134 Condition&quot;\n    or exists &quot;Harm reduction for people who inject drugs C.DE134 Observation&quot;\ndefine &quot;Harm reduction for people who inject drugs C.DE134 Condition&quot;:\n  Elements.&quot;Harm reduction for people who inject drugs C.DE134 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Harm reduction for people who inject drugs C.DE134 Observation&quot;:\n  Elements.&quot;Harm reduction for people who inject drugs C.DE134 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Harm reduction for people who inject drugs C.DE134 */\n\n/*\n@dataElement: HIV.C.DE135 - Behavioural interventions to support risk reduction\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer to services for behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Behavioural interventions to support risk reduction C.DE135&quot;:\n  exists &quot;Behavioural interventions to support risk reduction C.DE135 Condition&quot;\n    or exists &quot;Behavioural interventions to support risk reduction C.DE135 Observation&quot;\ndefine &quot;Behavioural interventions to support risk reduction C.DE135 Condition&quot;:\n  Elements.&quot;Behavioural interventions to support risk reduction C.DE135 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Behavioural interventions to support risk reduction C.DE135 Observation&quot;:\n  Elements.&quot;Behavioural interventions to support risk reduction C.DE135 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Behavioural interventions to support risk reduction C.DE135 */\n\n/*\n@dataElement: HIV.C.DE149 - Sexual and reproductive health integrated services\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer to sexual and reproductive health services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Sexual and reproductive health integrated services C.DE149&quot;:\n  exists &quot;Sexual and reproductive health integrated services C.DE149 Observation&quot;\ndefine &quot;Sexual and reproductive health integrated services C.DE149 Observation&quot;:\n  Elements.&quot;Sexual and reproductive health integrated services C.DE149 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Sexual and reproductive health integrated services C.DE149 */\n\n/*\n@dataElement: HIV.C.DE150 - Contraception and family planning\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer contraception and family planning services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Contraception and family planning C.DE150&quot;:\n  exists &quot;Contraception and family planning C.DE150 Condition&quot;\n    or exists &quot;Contraception and family planning C.DE150 Observation&quot;\ndefine &quot;Contraception and family planning C.DE150 Condition&quot;:\n  Elements.&quot;Contraception and family planning C.DE150 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Contraception and family planning C.DE150 Observation&quot;:\n  Elements.&quot;Contraception and family planning C.DE150 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Contraception and family planning C.DE150 */\n\n/*\n@dataElement: HIV.C.DE151 - Check pregnancy status\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Check woman's pregnancy status\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Check pregnancy status C.DE151&quot;:\n  exists &quot;Check pregnancy status C.DE151 Condition&quot;\n    or exists &quot;Check pregnancy status C.DE151 Observation&quot;\ndefine &quot;Check pregnancy status C.DE151 Condition&quot;:\n  Elements.&quot;Check pregnancy status C.DE151 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Check pregnancy status C.DE151 Observation&quot;:\n  Elements.&quot;Check pregnancy status C.DE151 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Check pregnancy status C.DE151 */\n\n/*\n@dataElement: HIV.C.DE152 - Prevent mother-to-child transmission\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer services (counselling) to help prevent of mother-to-child transmission\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Prevent mother-to-child transmission&quot;:\n  exists &quot;Prevent mother-to-child transmission Condition&quot;\n    or exists &quot;Prevent mother-to-child transmission Observation&quot;\ndefine &quot;Prevent mother-to-child transmission Condition&quot;:\n  Elements.&quot;Prevent mother-to-child transmission Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Prevent mother-to-child transmission Observation&quot;:\n  Elements.&quot;Prevent mother-to-child transmission Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Prevent mother-to-child transmission */\n\n/*\n@dataElement: HIV.C.DE153 - Cervical cancer screening and treatment\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer cervical cancer screening and treatment services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Cervical cancer screening and treatment&quot;:\n  exists &quot;Cervical cancer screening and treatment Condition&quot;\n    or exists &quot;Cervical cancer screening and treatment Observation&quot;\ndefine &quot;Cervical cancer screening and treatment Condition&quot;:\n  Elements.&quot;Cervical cancer screening and treatment Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Cervical cancer screening and treatment Observation&quot;:\n  Elements.&quot;Cervical cancer screening and treatment Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Cervical cancer screening and treatment */\n\n/*\n@dataElement: HIV.C.DE154 - Anal cancer screening for men who have sex with men\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer anal cancer screening (for men who have sex with men) services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Anal cancer screening for men who have sex with men C.DE154&quot;:\n  exists &quot;Anal cancer screening for men who have sex with men C.DE154 Condition&quot;\n    or exists &quot;Anal cancer screening for men who have sex with men C.DE154 Observation&quot;\ndefine &quot;Anal cancer screening for men who have sex with men C.DE154 Condition&quot;:\n  Elements.&quot;Anal cancer screening for men who have sex with men C.DE154 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Anal cancer screening for men who have sex with men C.DE154 Observation&quot;:\n  Elements.&quot;Anal cancer screening for men who have sex with men C.DE154 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Anal cancer screening for men who have sex with men C.DE154 */\n\n/*\n@dataElement: HIV.C.DE155 - STI testing and treatment\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer STI testing and treatment services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;STI testing and treatment C.DE155&quot;:\n  exists &quot;STI testing and treatment C.DE155 Condition&quot;\n    or exists &quot;STI testing and treatment C.DE155 Observation&quot;\ndefine &quot;STI testing and treatment C.DE155 Condition&quot;:\n  Elements.&quot;STI testing and treatment C.DE155 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;STI testing and treatment C.DE155 Observation&quot;:\n  Elements.&quot;STI testing and treatment C.DE155 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of STI testing and treatment C.DE155 */\n\n/*\n@dataElement: HIV.C.DE156 - HIV testing for partners and biological children\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer testing for all partners and biological children of positive cases (includes partner services and index case testing), as well as partners and social contacts of people from key populations, where appropriate\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV testing for partners and biological children C.DE156&quot;:\n  exists &quot;HIV testing for partners and biological children C.DE156 Condition&quot;\n    or exists &quot;HIV testing for partners and biological children C.DE156 Observation&quot;\ndefine &quot;HIV testing for partners and biological children C.DE156 Condition&quot;:\n  Elements.&quot;HIV testing for partners and biological children C.DE156 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV testing for partners and biological children C.DE156 Observation&quot;:\n  Elements.&quot;HIV testing for partners and biological children C.DE156 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV testing for partners and biological children C.DE156 */\n\n/*\n@dataElement: HIV.C.DE157 - Offer other clinical services\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Other clinical services offered or referrals given to the client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Offer other clinical services C.DE157&quot;:\n  exists &quot;Offer other clinical services C.DE157 Observation&quot;\ndefine &quot;Offer other clinical services C.DE157 Observation&quot;:\n  Elements.&quot;Offer other clinical services C.DE157 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Offer other clinical services C.DE157 */\n\n/*\n@dataElement: HIV.C.DE158 - Assessment and provision of vaccinations\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Assessment and provision of vaccinations, such as for people from key populations, pregnant women and infants; and, where appropriate, tetanus vaccination for adolescent boys and men receiving VMMC\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assessment and provision of vaccinations C.DE158&quot;:\n  exists &quot;Assessment and provision of vaccinations C.DE158 Condition&quot;\n    or exists &quot;Assessment and provision of vaccinations C.DE158 Observation&quot;\ndefine &quot;Assessment and provision of vaccinations C.DE158 Condition&quot;:\n  Elements.&quot;Assessment and provision of vaccinations C.DE158 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assessment and provision of vaccinations C.DE158 Observation&quot;:\n  Elements.&quot;Assessment and provision of vaccinations C.DE158 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assessment and provision of vaccinations C.DE158 */\n\n/*\n@dataElement: HIV.C.DE159 - Hepatitis B virus HBV and hepatitis C virus HCV testing and treatment\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer for HBV testing and vaccination and HCV testing and treatment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Hepatitis B virus HBV and hepatitis C virus HCV testing and treatment&quot;:\n  exists &quot;Hepatitis B virus HBV and hepatitis C virus HCV testing and treatment Condition&quot;\n    or exists &quot;Hepatitis B virus HBV and hepatitis C virus HCV testing and treatment Observation&quot;\ndefine &quot;Hepatitis B virus HBV and hepatitis C virus HCV testing and treatment Condition&quot;:\n  Elements.&quot;Hepatitis B virus HBV and hepatitis C virus HCV testing and treatment Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Hepatitis B virus HBV and hepatitis C virus HCV testing and treatment Observation&quot;:\n  Elements.&quot;Hepatitis B virus HBV and hepatitis C virus HCV testing and treatment Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Hepatitis B virus HBV and hepatitis C virus HCV testing and treatment */\n\n/*\n@dataElement: HIV.C.DE160 - Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer for co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia C.DE160&quot;:\n  exists &quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia C.DE160 Condition&quot;\n    or exists &quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia C.DE160 Observation&quot;\ndefine &quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia C.DE160 Condition&quot;:\n  Elements.&quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia C.DE160 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia C.DE160 Observation&quot;:\n  Elements.&quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia C.DE160 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia C.DE160 */\n\n/*\n@dataElement: HIV.C.DE161 - Intensified TB case finding and linkage to TB treatment\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer for TB case finding and linkage to TB treatment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Intensified TB case finding and linkage to TB treatment C.DE161&quot;:\n  exists &quot;Intensified TB case finding and linkage to TB treatment C.DE161 Condition&quot;\n    or exists &quot;Intensified TB case finding and linkage to TB treatment C.DE161 Observation&quot;\ndefine &quot;Intensified TB case finding and linkage to TB treatment C.DE161 Condition&quot;:\n  Elements.&quot;Intensified TB case finding and linkage to TB treatment C.DE161 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Intensified TB case finding and linkage to TB treatment C.DE161 Observation&quot;:\n  Elements.&quot;Intensified TB case finding and linkage to TB treatment C.DE161 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Intensified TB case finding and linkage to TB treatment C.DE161 */\n\n/*\n@dataElement: HIV.C.DE162 - Provision of isoniazid preventive therapy if person does not have TB\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer for provision of isoniazid preventive therapy if person does not have TB\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Provision of isoniazid preventive therapy if person does not have TB C.DE162&quot;:\n  exists &quot;Provision of isoniazid preventive therapy if person does not have TB C.DE162 Condition&quot;\n    or exists &quot;Provision of isoniazid preventive therapy if person does not have TB C.DE162 Observation&quot;\ndefine &quot;Provision of isoniazid preventive therapy if person does not have TB C.DE162 Condition&quot;:\n  Elements.&quot;Provision of isoniazid preventive therapy if person does not have TB C.DE162 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Provision of isoniazid preventive therapy if person does not have TB C.DE162 Observation&quot;:\n  Elements.&quot;Provision of isoniazid preventive therapy if person does not have TB C.DE162 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Provision of isoniazid preventive therapy if person does not have TB C.DE162 */\n\n/*\n@dataElement: HIV.C.DE163 - Malaria prevention such as bed nets and prophylaxis, depending on epidemiology\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer for malaria prevention (such as bed nets and prophylaxis), depending on epidemiology\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology C.DE163&quot;:\n  exists &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology C.DE163 Condition&quot;\n    or exists &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology C.DE163 Observation&quot;\ndefine &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology C.DE163 Condition&quot;:\n  Elements.&quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology C.DE163 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology C.DE163 Observation&quot;:\n  Elements.&quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology C.DE163 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Malaria prevention such as bed nets and prophylaxis, depending on epidemiology C.DE163 */\n\n/*\n@dataElement: HIV.C.DE164 - Other support services\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer for other support services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other support services C.DE164&quot;:\n  exists &quot;Other support services C.DE164 Observation&quot;\ndefine &quot;Other support services C.DE164 Observation&quot;:\n  Elements.&quot;Other support services C.DE164 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other support services C.DE164 */\n\n/*\n@dataElement: HIV.C.DE165 - Mental health services\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer for mental health services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Mental health services C.DE165&quot;:\n  exists &quot;Mental health services C.DE165 Condition&quot;\n    or exists &quot;Mental health services C.DE165 Observation&quot;\ndefine &quot;Mental health services C.DE165 Condition&quot;:\n  Elements.&quot;Mental health services C.DE165 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Mental health services C.DE165 Observation&quot;:\n  Elements.&quot;Mental health services C.DE165 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Mental health services C.DE165 */\n\n/*\n@dataElement: HIV.C.DE166 - Psychosocial counselling, support and treatment adherence counselling\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer for psychosocial counselling, support and treatment adherence counselling\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Psychosocial counselling, support and treatment adherence counselling C.DE166&quot;:\n  exists &quot;Psychosocial counselling, support and treatment adherence counselling C.DE166 Condition&quot;\n    or exists &quot;Psychosocial counselling, support and treatment adherence counselling C.DE166 Observation&quot;\ndefine &quot;Psychosocial counselling, support and treatment adherence counselling C.DE166 Condition&quot;:\n  Elements.&quot;Psychosocial counselling, support and treatment adherence counselling C.DE166 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Psychosocial counselling, support and treatment adherence counselling C.DE166 Observation&quot;:\n  Elements.&quot;Psychosocial counselling, support and treatment adherence counselling C.DE166 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Psychosocial counselling, support and treatment adherence counselling C.DE166 */\n\n/*\n@dataElement: HIV.C.DE167 - Support for disclosure and partner services\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer for support for disclosure and partner services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Support for disclosure and partner services C.DE167&quot;:\n  exists &quot;Support for disclosure and partner services C.DE167 Condition&quot;\n    or exists &quot;Support for disclosure and partner services C.DE167 Observation&quot;\ndefine &quot;Support for disclosure and partner services C.DE167 Condition&quot;:\n  Elements.&quot;Support for disclosure and partner services C.DE167 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Support for disclosure and partner services C.DE167 Observation&quot;:\n  Elements.&quot;Support for disclosure and partner services C.DE167 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Support for disclosure and partner services C.DE167 */\n\n/*\n@dataElement: HIV.C.DE168 - Legal and social services\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer for legal and social services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Legal and social services C.DE168&quot;:\n  exists &quot;Legal and social services C.DE168 Condition&quot;\n    or exists &quot;Legal and social services C.DE168 Observation&quot;\ndefine &quot;Legal and social services C.DE168 Condition&quot;:\n  Elements.&quot;Legal and social services C.DE168 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Legal and social services C.DE168 Observation&quot;:\n  Elements.&quot;Legal and social services C.DE168 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Legal and social services C.DE168 */\n\n/*\n@dataElement: HIV.C.DE169 - Services for responding to violence against women\n@activity: HIV.C10 Counsel on risk and prevention\n@description: Offer or refer for services for responding to violence against women, including first-line support and psychosocial support, post-rape care and other support services including shelters, legal services and women and child protection services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Services for responding to violence against women C.DE169&quot;:\n  exists &quot;Services for responding to violence against women C.DE169 Condition&quot;\n    or exists &quot;Services for responding to violence against women C.DE169 Observation&quot;\ndefine &quot;Services for responding to violence against women C.DE169 Condition&quot;:\n  Elements.&quot;Services for responding to violence against women C.DE169 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Services for responding to violence against women C.DE169 Observation&quot;:\n  Elements.&quot;Services for responding to violence against women C.DE169 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Services for responding to violence against women C.DE169 */\n\n/*\n@dataElement: HIV.D.DE1 - Reason for visit\n@activity: HIV.D1 Determine reason for visit\n@description: Whether visit was scheduled or unscheduled, clinical only, or for ARV drug pick-up\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reason for visit D.DE1&quot;:\n  exists &quot;Reason for visit D.DE1 Observation&quot;\ndefine &quot;Reason for visit D.DE1 Observation&quot;:\n  Elements.&quot;Reason for visit D.DE1 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reason for visit D.DE1 */\n\n/*\n@dataElement: HIV.D.DE2 - First clinical visit\n@activity: HIV.D1 Determine reason for visit\n@description: The client's first appointment for clinical care by a provider at the facility\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;First clinical visit&quot;:\n  exists &quot;First clinical visit Condition&quot;\n    or exists &quot;First clinical visit Observation&quot;\ndefine &quot;First clinical visit Condition&quot;:\n  Elements.&quot;First clinical visit Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;First clinical visit Observation&quot;:\n  Elements.&quot;First clinical visit Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of First clinical visit */\n\n/*\n@dataElement: HIV.D.DE3 - Clinical visit\n@activity: HIV.D1 Determine reason for visit\n@description: Appointment for clinical care by a provider\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Clinical visit D.DE3&quot;:\n  exists &quot;Clinical visit D.DE3 Condition&quot;\n    or exists &quot;Clinical visit D.DE3 Observation&quot;\ndefine &quot;Clinical visit D.DE3 Condition&quot;:\n  Elements.&quot;Clinical visit D.DE3 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Clinical visit D.DE3 Observation&quot;:\n  Elements.&quot;Clinical visit D.DE3 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Clinical visit D.DE3 */\n\n/*\n@dataElement: HIV.D.DE4 - ART initiation\n@activity: HIV.D1 Determine reason for visit\n@description: Appointment for initiation of ART\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ART initiation&quot;:\n  exists &quot;ART initiation Condition&quot;\n    or exists &quot;ART initiation Observation&quot;\ndefine &quot;ART initiation Condition&quot;:\n  Elements.&quot;ART initiation Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;ART initiation Observation&quot;:\n  Elements.&quot;ART initiation Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of ART initiation */\n\n/*\n@dataElement: HIV.D.DE5 - ART drug pick up\n@activity: HIV.D1 Determine reason for visit\n@description: Appointment for an antiretroviral drug pick up\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ART drug pick up&quot;:\n  exists &quot;ART drug pick up Condition&quot;\n    or exists &quot;ART drug pick up Observation&quot;\ndefine &quot;ART drug pick up Condition&quot;:\n  Elements.&quot;ART drug pick up Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;ART drug pick up Observation&quot;:\n  Elements.&quot;ART drug pick up Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of ART drug pick up */\n\n/*\n@dataElement: HIV.D.DE6 - Issues and concerns\n@activity: HIV.D1 Determine reason for visit\n@description: Visit to address issues and concerns\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Issues and concerns&quot;:\n  exists &quot;Issues and concerns Condition&quot;\n    or exists &quot;Issues and concerns Observation&quot;\ndefine &quot;Issues and concerns Condition&quot;:\n  Elements.&quot;Issues and concerns Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Issues and concerns Observation&quot;:\n  Elements.&quot;Issues and concerns Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Issues and concerns */\n\n/*\n@dataElement: HIV.D.DE7 - Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer\n@activity: HIV.D1 Determine reason for visit\n@description: Appointment for a post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE7&quot;:\n  exists &quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE7 Condition&quot;\n    or exists &quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE7 Observation&quot;\ndefine &quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE7 Condition&quot;:\n  Elements.&quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE7 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE7 Observation&quot;:\n  Elements.&quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE7 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE7 */\n\n/*\n@dataElement: HIV.D.DE9 - Body temperature\n@activity: HIV.D2 Take vital signs\n@description: Temperature of the client in Celsius\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Body temperature&quot;:\n  Elements.&quot;Body temperature&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Body temperature Value&quot;:\n  &quot;Body temperature&quot; O\n  return O.value\n/* End of Body temperature */\n\n/*\n@dataElement: HIV.D.DE13 - Body weight\n@activity: HIV.D2 Take vital signs\n@description: The client's current weight in kilograms\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Body weight&quot;:\n  Elements.&quot;Body weight&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Body weight Value&quot;:\n  &quot;Body weight&quot; O\n  return O.value\n/* End of Body weight */\n\n/*\n@dataElement: HIV.D.DE17 - Signs of serious illness\n@activity: HIV.D3 Check for signs of serious illness\n@description: Signs that may indicate the client has a serious illness and needs triage or an emergency referral\n*/\ndefine &quot;Signs of serious illness&quot;:\n  exists &quot;Signs of serious illness Observation&quot;\ndefine &quot;Signs of serious illness Observation&quot;:\n  Elements.&quot;Signs of serious illness Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Signs of serious illness */\n\n/*\n@dataElement: HIV.D.DE18 - Fever of 39 C or greater\n@activity: HIV.D3 Check for signs of serious illness\n@description: Client has a fever with a measured temperature of 102.2 F/39 C or greater\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Fever of 39 C or greater&quot;:\n  exists &quot;Fever of 39 C or greater Condition&quot;\n    or exists &quot;Fever of 39 C or greater Observation&quot;\ndefine &quot;Fever of 39 C or greater Condition&quot;:\n  Elements.&quot;Fever of 39 C or greater Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Fever of 39 C or greater Observation&quot;:\n  Elements.&quot;Fever of 39 C or greater Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Fever of 39 C or greater */\n\n/*\n@dataElement: HIV.D.DE19 - Tachycardia\n@activity: HIV.D3 Check for signs of serious illness\n@description: Heart rate above a rate per minute based on age\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Tachycardia&quot;:\n  exists &quot;Tachycardia Condition&quot;\n    or exists &quot;Tachycardia Observation&quot;\ndefine &quot;Tachycardia Condition&quot;:\n  Elements.&quot;Tachycardia Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Tachycardia Observation&quot;:\n  Elements.&quot;Tachycardia Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Tachycardia */\n\n/*\n@dataElement: HIV.D.DE20 - Tachypnea\n@activity: HIV.D3 Check for signs of serious illness\n@description: Respiratory rate above a number of breaths per minute based on age\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Tachypnea&quot;:\n  exists &quot;Tachypnea Condition&quot;\n    or exists &quot;Tachypnea Observation&quot;\ndefine &quot;Tachypnea Condition&quot;:\n  Elements.&quot;Tachypnea Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Tachypnea Observation&quot;:\n  Elements.&quot;Tachypnea Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Tachypnea */\n\n/*\n@dataElement: HIV.D.DE21 - Unable to walk unaided\n@activity: HIV.D3 Check for signs of serious illness\n@description: Client is not able to walk without help\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unable to walk unaided&quot;:\n  exists &quot;Unable to walk unaided Condition&quot;\n    or exists &quot;Unable to walk unaided Observation&quot;\ndefine &quot;Unable to walk unaided Condition&quot;:\n  Elements.&quot;Unable to walk unaided Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unable to walk unaided Observation&quot;:\n  Elements.&quot;Unable to walk unaided Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unable to walk unaided */\n\n/*\n@dataElement: HIV.D.DE22 - Lethargy\n@activity: HIV.D3 Check for signs of serious illness\n@description: Client is exhibiting lethargy as a sign of serious illness\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Lethargy D.DE22&quot;:\n  exists &quot;Lethargy D.DE22 Condition&quot;\n    or exists &quot;Lethargy D.DE22 Observation&quot;\ndefine &quot;Lethargy D.DE22 Condition&quot;:\n  Elements.&quot;Lethargy D.DE22 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Lethargy D.DE22 Observation&quot;:\n  Elements.&quot;Lethargy D.DE22 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Lethargy D.DE22 */\n\n/*\n@dataElement: HIV.D.DE23 - Unconsciousness\n@activity: HIV.D3 Check for signs of serious illness\n@description: Client is currently unconscious\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unconsciousness&quot;:\n  exists &quot;Unconsciousness Condition&quot;\n    or exists &quot;Unconsciousness Observation&quot;\ndefine &quot;Unconsciousness Condition&quot;:\n  Elements.&quot;Unconsciousness Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unconsciousness Observation&quot;:\n  Elements.&quot;Unconsciousness Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unconsciousness */\n\n/*\n@dataElement: HIV.D.DE24 - Convulsions\n@activity: HIV.D3 Check for signs of serious illness\n@description: Client is convulsing\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Convulsions&quot;:\n  exists &quot;Convulsions Condition&quot;\n    or exists &quot;Convulsions Observation&quot;\ndefine &quot;Convulsions Condition&quot;:\n  Elements.&quot;Convulsions Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Convulsions Observation&quot;:\n  Elements.&quot;Convulsions Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Convulsions */\n\n/*\n@dataElement: HIV.D.DE25 - Unable to drink\n@activity: HIV.D3 Check for signs of serious illness\n@description: Child is not able to drink\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unable to drink&quot;:\n  exists &quot;Unable to drink Condition&quot;\n    or exists &quot;Unable to drink Observation&quot;\ndefine &quot;Unable to drink Condition&quot;:\n  Elements.&quot;Unable to drink Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unable to drink Observation&quot;:\n  Elements.&quot;Unable to drink Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unable to drink */\n\n/*\n@dataElement: HIV.D.DE26 - Unable to breastfeed\n@activity: HIV.D3 Check for signs of serious illness\n@description: Infant or child is not able to breastfeed\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unable to breastfeed&quot;:\n  exists &quot;Unable to breastfeed Condition&quot;\n    or exists &quot;Unable to breastfeed Observation&quot;\ndefine &quot;Unable to breastfeed Condition&quot;:\n  Elements.&quot;Unable to breastfeed Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unable to breastfeed Observation&quot;:\n  Elements.&quot;Unable to breastfeed Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unable to breastfeed */\n\n/*\n@dataElement: HIV.D.DE27 - Repeated vomiting\n@activity: HIV.D3 Check for signs of serious illness\n@description: Client is repeatedly vomiting\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Repeated vomiting&quot;:\n  exists &quot;Repeated vomiting Condition&quot;\n    or exists &quot;Repeated vomiting Observation&quot;\ndefine &quot;Repeated vomiting Condition&quot;:\n  Elements.&quot;Repeated vomiting Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Repeated vomiting Observation&quot;:\n  Elements.&quot;Repeated vomiting Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Repeated vomiting */\n\n/*\n@dataElement: HIV.D.DE28 - Headache\n@activity: HIV.D3 Check for signs of serious illness\n@description: Client is exhibiting a headache\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Headache D.DE28&quot;:\n  exists &quot;Headache D.DE28 Condition&quot;\n    or exists &quot;Headache D.DE28 Observation&quot;\ndefine &quot;Headache D.DE28 Condition&quot;:\n  Elements.&quot;Headache D.DE28 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Headache D.DE28 Observation&quot;:\n  Elements.&quot;Headache D.DE28 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Headache D.DE28 */\n\n/*\n@dataElement: HIV.D.DE29 - Other sign of serious illness\n@activity: HIV.D3 Check for signs of serious illness\n@description: Client is exhibiting another sign of a serious illness\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other sign of serious illness&quot;:\n  exists &quot;Other sign of serious illness Condition&quot;\n    or exists &quot;Other sign of serious illness Observation&quot;\ndefine &quot;Other sign of serious illness Condition&quot;:\n  Elements.&quot;Other sign of serious illness Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other sign of serious illness Observation&quot;:\n  Elements.&quot;Other sign of serious illness Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other sign of serious illness */\n\n/*\n@dataElement: HIV.D.DE31 - Currently pregnant\n@activity: HIV.D8 Capture or update client history\n@description: Client is currently pregnant\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Currently pregnant D.DE31&quot;:\n  exists &quot;Currently pregnant D.DE31 Observation&quot;\ndefine &quot;Currently pregnant D.DE31 Observation&quot;:\n  Elements.&quot;Currently pregnant D.DE31 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Currently pregnant D.DE31 */\n\n/*\n@dataElement: HIV.D.DE37 - Serodiscordant partner\n@activity: HIV.D8 Capture or update client history\n@description: Client's HIV status is different from a current partner's HIV status\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Serodiscordant partner D.DE37&quot;:\n  exists &quot;Serodiscordant partner D.DE37 Observation&quot;\ndefine &quot;Serodiscordant partner D.DE37 Observation&quot;:\n  Elements.&quot;Serodiscordant partner D.DE37 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Serodiscordant partner D.DE37 */\n\n/*\n@dataElement: HIV.D.DE38 - On ART\n@activity: HIV.D8 Capture or update client history\n@description: Client is currently taking ART\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;On ART D.DE38&quot;:\n  Elements.&quot;On ART D.DE38&quot; MS\n      where MS.effective.toInterval() starts on or before Today\n/* End of On ART D.DE38 */\n\n/*\n@dataElement: HIV.D.DE39 - ART start date\n@activity: HIV.D8 Capture or update client history\n@description: The date on which the client started or restarted ART\n*/\ndefine &quot;ART start date D.DE39&quot;:\n  &quot;On ART D.DE38&quot; MS\n  return start of MS.effective.toInterval()\n/* End of ART start date D.DE39 */\n\n/*\n@dataElement: HIV.D.DE42 - Established on ART\n@activity: HIV.D8 Capture or update client history\n@description: Is the client successfully established on ART?\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Established on ART&quot;:\n  exists &quot;Established on ART Observation&quot;\ndefine &quot;Established on ART Observation&quot;:\n  Elements.&quot;Established on ART Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Established on ART */\n\n/*\n@dataElement: HIV.D.DE43 - ART start type\n@activity: HIV.D8 Capture or update client history\n@description: Whether the client is ART naive or is restarting ART\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ART start type&quot;:\n  exists &quot;ART start type Observation&quot;\ndefine &quot;ART start type Observation&quot;:\n  Elements.&quot;ART start type Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of ART start type */\n\n/*\n@dataElement: HIV.D.DE44 - First-time user of ART\n@activity: HIV.D8 Capture or update client history\n@description: Client is ART naive, having never taken ART to treat HIV before\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;First-time user of ART&quot;:\n  exists &quot;First-time user of ART Condition&quot;\n    or exists &quot;First-time user of ART Observation&quot;\ndefine &quot;First-time user of ART Condition&quot;:\n  Elements.&quot;First-time user of ART Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;First-time user of ART Observation&quot;:\n  Elements.&quot;First-time user of ART Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of First-time user of ART */\n\n/*\n@dataElement: HIV.D.DE45 - Restarting ART\n@activity: HIV.D8 Capture or update client history\n@description: Client is restarting ART after stopping treatment for any reason\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Restarting ART&quot;:\n  exists &quot;Restarting ART Condition&quot;\n    or exists &quot;Restarting ART Observation&quot;\ndefine &quot;Restarting ART Condition&quot;:\n  Elements.&quot;Restarting ART Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Restarting ART Observation&quot;:\n  Elements.&quot;Restarting ART Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Restarting ART */\n\n/*\n@dataElement: HIV.D.DE75 - Current ART regimen\n@activity: HIV.D8 Capture or update client history\n@description: The current ART regimen the client is taking\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Current ART regimen&quot;:\n  exists &quot;Current ART regimen Observation&quot;\ndefine &quot;Current ART regimen Observation&quot;:\n  Elements.&quot;Current ART regimen Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Current ART regimen */\n\n/*\n@dataElement: HIV.D.DE77 - Preferred first-line ART regimen\n@activity: HIV.D8 Capture or update client history\n@description: The preferred first-line ART regimen for the client according to WHO (or national) guidelines\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Preferred first-line ART regimen&quot;:\n  exists &quot;Preferred first-line ART regimen Observation&quot;\ndefine &quot;Preferred first-line ART regimen Observation&quot;:\n  Elements.&quot;Preferred first-line ART regimen Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Preferred first-line ART regimen */\n\n/*\n@dataElement: HIV.D.DE78 - Alternative first-line ART regimen\n@activity: HIV.D8 Capture or update client history\n@description: The alternative first-line ART regimen for the client according to WHO (or national) guidelines\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Alternative first-line ART regimen&quot;:\n  exists &quot;Alternative first-line ART regimen Observation&quot;\ndefine &quot;Alternative first-line ART regimen Observation&quot;:\n  Elements.&quot;Alternative first-line ART regimen Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Alternative first-line ART regimen */\n\n/*\n@dataElement: HIV.D.DE79 - First-line ART regimen under special circumstances\n@activity: HIV.D8 Capture or update client history\n@description: The first-line ART regimen for the client under special circumstances according to WHO (or national) guidelines\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;First-line ART regimen under special circumstances&quot;:\n  exists &quot;First-line ART regimen under special circumstances Observation&quot;\ndefine &quot;First-line ART regimen under special circumstances Observation&quot;:\n  Elements.&quot;First-line ART regimen under special circumstances Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of First-line ART regimen under special circumstances */\n\n/*\n@dataElement: HIV.D.DE80 - Preferred second-line ART regimen\n@activity: HIV.D8 Capture or update client history\n@description: The preferred second-line ART regimen for the client according to WHO (or national) guidelines\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Preferred second-line ART regimen&quot;:\n  exists &quot;Preferred second-line ART regimen Observation&quot;\ndefine &quot;Preferred second-line ART regimen Observation&quot;:\n  Elements.&quot;Preferred second-line ART regimen Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Preferred second-line ART regimen */\n\n/*\n@dataElement: HIV.D.DE81 - Alternative second-line ART regimen\n@activity: HIV.D8 Capture or update client history\n@description: The alternative second-line ART regimen for the client according to WHO (or national) guidelines\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Alternative second-line ART regimen&quot;:\n  exists &quot;Alternative second-line ART regimen Observation&quot;\ndefine &quot;Alternative second-line ART regimen Observation&quot;:\n  Elements.&quot;Alternative second-line ART regimen Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Alternative second-line ART regimen */\n\n/*\n@dataElement: HIV.D.DE82 - Optimal regimen for transition\n@activity: HIV.D8 Capture or update client history\n@description: The optimal regimen for transition to DTG-based regimens for children established on ART\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Optimal regimen for transition&quot;:\n  exists &quot;Optimal regimen for transition Observation&quot;\ndefine &quot;Optimal regimen for transition Observation&quot;:\n  Elements.&quot;Optimal regimen for transition Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Optimal regimen for transition */\n\n/*\n@dataElement: HIV.D.DE83 - Current ART regimen first-, second-, or third-line\n@activity: HIV.D8 Capture or update client history\n@description: ART regimen for treating clients living with HIV, based on national guidance\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Current ART regimen first-, second-, or third-line&quot;:\n  exists &quot;Current ART regimen first-, second-, or third-line Observation&quot;\ndefine &quot;Current ART regimen first-, second-, or third-line Observation&quot;:\n  Elements.&quot;Current ART regimen first-, second-, or third-line Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Current ART regimen first-, second-, or third-line */\n\n/*\n@dataElement: HIV.D.DE84 - First-line ART regimen for adults and adolescents\n@activity: HIV.D8 Capture or update client history\n@description: First-line ART regimen for adults and adolescents living with HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;First-line ART regimen for adults and adolescents&quot;:\n  exists &quot;First-line ART regimen for adults and adolescents Condition&quot;\n    or exists &quot;First-line ART regimen for adults and adolescents Observation&quot;\ndefine &quot;First-line ART regimen for adults and adolescents Condition&quot;:\n  Elements.&quot;First-line ART regimen for adults and adolescents Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;First-line ART regimen for adults and adolescents Observation&quot;:\n  Elements.&quot;First-line ART regimen for adults and adolescents Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of First-line ART regimen for adults and adolescents */\n\n/*\n@dataElement: HIV.D.DE85 - First-line ART regimen for children\n@activity: HIV.D8 Capture or update client history\n@description: First-line ART regimen for children living with HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;First-line ART regimen for children&quot;:\n  exists &quot;First-line ART regimen for children Condition&quot;\n    or exists &quot;First-line ART regimen for children Observation&quot;\ndefine &quot;First-line ART regimen for children Condition&quot;:\n  Elements.&quot;First-line ART regimen for children Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;First-line ART regimen for children Observation&quot;:\n  Elements.&quot;First-line ART regimen for children Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of First-line ART regimen for children */\n\n/*\n@dataElement: HIV.D.DE86 - First-line ART regimen for neonates\n@activity: HIV.D8 Capture or update client history\n@description: First-line ART regimen for neonates living with HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;First-line ART regimen for neonates&quot;:\n  exists &quot;First-line ART regimen for neonates Condition&quot;\n    or exists &quot;First-line ART regimen for neonates Observation&quot;\ndefine &quot;First-line ART regimen for neonates Condition&quot;:\n  Elements.&quot;First-line ART regimen for neonates Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;First-line ART regimen for neonates Observation&quot;:\n  Elements.&quot;First-line ART regimen for neonates Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of First-line ART regimen for neonates */\n\n/*\n@dataElement: HIV.D.DE87 - Second-line ART regimen for adults and adolescents\n@activity: HIV.D8 Capture or update client history\n@description: Second-line ART regimen for adults and adolescents living with HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Second-line ART regimen for adults and adolescents&quot;:\n  exists &quot;Second-line ART regimen for adults and adolescents Condition&quot;\n    or exists &quot;Second-line ART regimen for adults and adolescents Observation&quot;\ndefine &quot;Second-line ART regimen for adults and adolescents Condition&quot;:\n  Elements.&quot;Second-line ART regimen for adults and adolescents Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Second-line ART regimen for adults and adolescents Observation&quot;:\n  Elements.&quot;Second-line ART regimen for adults and adolescents Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Second-line ART regimen for adults and adolescents */\n\n/*\n@dataElement: HIV.D.DE88 - Second-line ART regimen for children\n@activity: HIV.D8 Capture or update client history\n@description: Second-line ART regimen for children living with HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Second-line ART regimen for children&quot;:\n  exists &quot;Second-line ART regimen for children Condition&quot;\n    or exists &quot;Second-line ART regimen for children Observation&quot;\ndefine &quot;Second-line ART regimen for children Condition&quot;:\n  Elements.&quot;Second-line ART regimen for children Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Second-line ART regimen for children Observation&quot;:\n  Elements.&quot;Second-line ART regimen for children Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Second-line ART regimen for children */\n\n/*\n@dataElement: HIV.D.DE89 - Third-line ART regimen\n@activity: HIV.D8 Capture or update client history\n@description: Third-line ART regimen for people living with HIV (Not defined by WHO. National programmes should develop policies for third-line ART)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Third-line ART regimen&quot;:\n  exists &quot;Third-line ART regimen Condition&quot;\n    or exists &quot;Third-line ART regimen Observation&quot;\ndefine &quot;Third-line ART regimen Condition&quot;:\n  Elements.&quot;Third-line ART regimen Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Third-line ART regimen Observation&quot;:\n  Elements.&quot;Third-line ART regimen Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Third-line ART regimen */\n\n/*\n@dataElement: HIV.D.DE128 - ART regimen composition\n@activity: HIV.D8 Capture or update client history\n@description: Drug composition of client's current ART regimen\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ART regimen composition&quot;:\n  exists &quot;ART regimen composition Observation&quot;\ndefine &quot;ART regimen composition Observation&quot;:\n  Elements.&quot;ART regimen composition Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of ART regimen composition */\n\n/*\n@dataElement: HIV.D.DE129 - ABC\n@activity: HIV.D8 Capture or update client history\n@description: Treated with abacavir (ABC)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ABC&quot;:\n  exists &quot;ABC Condition&quot;\n    or exists &quot;ABC Observation&quot;\ndefine &quot;ABC Condition&quot;:\n  Elements.&quot;ABC Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;ABC Observation&quot;:\n  Elements.&quot;ABC Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of ABC */\n\n/*\n@dataElement: HIV.D.DE130 - FTC\n@activity: HIV.D8 Capture or update client history\n@description: Treated with emtricitabine (FTC)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;FTC&quot;:\n  exists &quot;FTC Condition&quot;\n    or exists &quot;FTC Observation&quot;\ndefine &quot;FTC Condition&quot;:\n  Elements.&quot;FTC Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;FTC Observation&quot;:\n  Elements.&quot;FTC Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of FTC */\n\n/*\n@dataElement: HIV.D.DE131 - 3TC\n@activity: HIV.D8 Capture or update client history\n@description: Treated with lamivudine (3TC)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;3TC&quot;:\n  exists &quot;3TC Condition&quot;\n    or exists &quot;3TC Observation&quot;\ndefine &quot;3TC Condition&quot;:\n  Elements.&quot;3TC Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;3TC Observation&quot;:\n  Elements.&quot;3TC Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of 3TC */\n\n/*\n@dataElement: HIV.D.DE132 - AZT\n@activity: HIV.D8 Capture or update client history\n@description: Treated with zidovudine (AZT)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;AZT&quot;:\n  exists &quot;AZT Condition&quot;\n    or exists &quot;AZT Observation&quot;\ndefine &quot;AZT Condition&quot;:\n  Elements.&quot;AZT Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;AZT Observation&quot;:\n  Elements.&quot;AZT Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of AZT */\n\n/*\n@dataElement: HIV.D.DE133 - DDI\n@activity: HIV.D8 Capture or update client history\n@description: Treated with didanosine (DDI)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;DDI&quot;:\n  exists &quot;DDI Condition&quot;\n    or exists &quot;DDI Observation&quot;\ndefine &quot;DDI Condition&quot;:\n  Elements.&quot;DDI Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;DDI Observation&quot;:\n  Elements.&quot;DDI Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of DDI */\n\n/*\n@dataElement: HIV.D.DE134 - D4T\n@activity: HIV.D8 Capture or update client history\n@description: Treated with stavudine (D4T)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;D4T&quot;:\n  exists &quot;D4T Condition&quot;\n    or exists &quot;D4T Observation&quot;\ndefine &quot;D4T Condition&quot;:\n  Elements.&quot;D4T Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;D4T Observation&quot;:\n  Elements.&quot;D4T Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of D4T */\n\n/*\n@dataElement: HIV.D.DE135 - TDF\n@activity: HIV.D8 Capture or update client history\n@description: Treated with tenofovir (TDF)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TDF D.DE135&quot;:\n  exists &quot;TDF D.DE135 Condition&quot;\n    or exists &quot;TDF D.DE135 Observation&quot;\ndefine &quot;TDF D.DE135 Condition&quot;:\n  Elements.&quot;TDF D.DE135 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;TDF D.DE135 Observation&quot;:\n  Elements.&quot;TDF D.DE135 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TDF D.DE135 */\n\n/*\n@dataElement: HIV.D.DE136 - EFV\n@activity: HIV.D8 Capture or update client history\n@description: Treated with efavirenz (EFV)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;EFV&quot;:\n  exists &quot;EFV Condition&quot;\n    or exists &quot;EFV Observation&quot;\ndefine &quot;EFV Condition&quot;:\n  Elements.&quot;EFV Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;EFV Observation&quot;:\n  Elements.&quot;EFV Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of EFV */\n\n/*\n@dataElement: HIV.D.DE137 - ETV\n@activity: HIV.D8 Capture or update client history\n@description: Treated with etravirine (ETV)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ETV&quot;:\n  exists &quot;ETV Condition&quot;\n    or exists &quot;ETV Observation&quot;\ndefine &quot;ETV Condition&quot;:\n  Elements.&quot;ETV Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;ETV Observation&quot;:\n  Elements.&quot;ETV Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of ETV */\n\n/*\n@dataElement: HIV.D.DE138 - NVP\n@activity: HIV.D8 Capture or update client history\n@description: Treated with nevirapine (NVP)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;NVP&quot;:\n  exists &quot;NVP Condition&quot;\n    or exists &quot;NVP Observation&quot;\ndefine &quot;NVP Condition&quot;:\n  Elements.&quot;NVP Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;NVP Observation&quot;:\n  Elements.&quot;NVP Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of NVP */\n\n/*\n@dataElement: HIV.D.DE139 - RIL\n@activity: HIV.D8 Capture or update client history\n@description: Treated with rilpivirine (RIL)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;RIL&quot;:\n  exists &quot;RIL Condition&quot;\n    or exists &quot;RIL Observation&quot;\ndefine &quot;RIL Condition&quot;:\n  Elements.&quot;RIL Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;RIL Observation&quot;:\n  Elements.&quot;RIL Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of RIL */\n\n/*\n@dataElement: HIV.D.DE140 - ATV/r\n@activity: HIV.D8 Capture or update client history\n@description: Treated with atazanavir/ritonavir (ATV/r)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ATV/r D.DE140&quot;:\n  exists &quot;ATV/r D.DE140 Condition&quot;\n    or exists &quot;ATV/r D.DE140 Observation&quot;\ndefine &quot;ATV/r D.DE140 Condition&quot;:\n  Elements.&quot;ATV/r D.DE140 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;ATV/r D.DE140 Observation&quot;:\n  Elements.&quot;ATV/r D.DE140 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of ATV/r D.DE140 */\n\n/*\n@dataElement: HIV.D.DE141 - LPV/r\n@activity: HIV.D8 Capture or update client history\n@description: Treated with lopinavir/ritonavir (LPV/r)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;LPV/r D.DE141&quot;:\n  exists &quot;LPV/r D.DE141 Condition&quot;\n    or exists &quot;LPV/r D.DE141 Observation&quot;\ndefine &quot;LPV/r D.DE141 Condition&quot;:\n  Elements.&quot;LPV/r D.DE141 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;LPV/r D.DE141 Observation&quot;:\n  Elements.&quot;LPV/r D.DE141 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of LPV/r D.DE141 */\n\n/*\n@dataElement: HIV.D.DE142 - DRV/r\n@activity: HIV.D8 Capture or update client history\n@description: Treated with darunavir/ritonavir (DRV/r)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;DRV/r D.DE142&quot;:\n  exists &quot;DRV/r D.DE142 Condition&quot;\n    or exists &quot;DRV/r D.DE142 Observation&quot;\ndefine &quot;DRV/r D.DE142 Condition&quot;:\n  Elements.&quot;DRV/r D.DE142 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;DRV/r D.DE142 Observation&quot;:\n  Elements.&quot;DRV/r D.DE142 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of DRV/r D.DE142 */\n\n/*\n@dataElement: HIV.D.DE143 - RTV\n@activity: HIV.D8 Capture or update client history\n@description: Treated with ritonavir (RTV)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;RTV&quot;:\n  exists &quot;RTV Condition&quot;\n    or exists &quot;RTV Observation&quot;\ndefine &quot;RTV Condition&quot;:\n  Elements.&quot;RTV Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;RTV Observation&quot;:\n  Elements.&quot;RTV Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of RTV */\n\n/*\n@dataElement: HIV.D.DE144 - DTG\n@activity: HIV.D8 Capture or update client history\n@description: Treated with dolutegravir (DTG)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;DTG D.DE144&quot;:\n  exists &quot;DTG D.DE144 Condition&quot;\n    or exists &quot;DTG D.DE144 Observation&quot;\ndefine &quot;DTG D.DE144 Condition&quot;:\n  Elements.&quot;DTG D.DE144 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;DTG D.DE144 Observation&quot;:\n  Elements.&quot;DTG D.DE144 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of DTG D.DE144 */\n\n/*\n@dataElement: HIV.D.DE145 - RAL\n@activity: HIV.D8 Capture or update client history\n@description: Treated with raltegravir (RAL)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;RAL D.DE145&quot;:\n  exists &quot;RAL D.DE145 Condition&quot;\n    or exists &quot;RAL D.DE145 Observation&quot;\ndefine &quot;RAL D.DE145 Condition&quot;:\n  Elements.&quot;RAL D.DE145 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;RAL D.DE145 Observation&quot;:\n  Elements.&quot;RAL D.DE145 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of RAL D.DE145 */\n\n/*\n@dataElement: HIV.D.DE152 - Prevention services offered and referrals\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: Offer or refer for prevention services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Prevention services offered and referrals D.DE152&quot;:\n  exists &quot;Prevention services offered and referrals D.DE152 Observation&quot;\ndefine &quot;Prevention services offered and referrals D.DE152 Observation&quot;:\n  Elements.&quot;Prevention services offered and referrals D.DE152 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Prevention services offered and referrals D.DE152 */\n\n/*\n@dataElement: HIV.D.DE153 - Offer male and female condoms and condom-compatible lubricants\n@activity: HIV.D26 Offer sexual and reproductive health services\n@description: Offer male and female condoms and condom-compatible lubricants\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Offer male and female condoms and condom-compatible lubricants D.DE153&quot;:\n  exists &quot;Offer male and female condoms and condom-compatible lubricants D.DE153 Condition&quot;\n    or exists &quot;Offer male and female condoms and condom-compatible lubricants D.DE153 Observation&quot;\ndefine &quot;Offer male and female condoms and condom-compatible lubricants D.DE153 Condition&quot;:\n  Elements.&quot;Offer male and female condoms and condom-compatible lubricants D.DE153 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Offer male and female condoms and condom-compatible lubricants D.DE153 Observation&quot;:\n  Elements.&quot;Offer male and female condoms and condom-compatible lubricants D.DE153 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Offer male and female condoms and condom-compatible lubricants D.DE153 */\n\n/*\n@dataElement: HIV.D.DE154 - Harm reduction for people who inject drugs\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: Offer or refer people who inject drugs to harm reduction services (needle and syringe programmes, opioid substitution therapy, other drug-dependence treatment and opioid overdose prevention and management)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Harm reduction for people who inject drugs D.DE154&quot;:\n  exists &quot;Harm reduction for people who inject drugs D.DE154 Condition&quot;\n    or exists &quot;Harm reduction for people who inject drugs D.DE154 Observation&quot;\ndefine &quot;Harm reduction for people who inject drugs D.DE154 Condition&quot;:\n  Elements.&quot;Harm reduction for people who inject drugs D.DE154 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Harm reduction for people who inject drugs D.DE154 Observation&quot;:\n  Elements.&quot;Harm reduction for people who inject drugs D.DE154 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Harm reduction for people who inject drugs D.DE154 */\n\n/*\n@dataElement: HIV.D.DE155 - Behavioural interventions to support risk reduction\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: Offer or refer to services for behavioural interventions to support risk reduction, particularly for people with HIV and members of key populations\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Behavioural interventions to support risk reduction D.DE155&quot;:\n  exists &quot;Behavioural interventions to support risk reduction D.DE155 Condition&quot;\n    or exists &quot;Behavioural interventions to support risk reduction D.DE155 Observation&quot;\ndefine &quot;Behavioural interventions to support risk reduction D.DE155 Condition&quot;:\n  Elements.&quot;Behavioural interventions to support risk reduction D.DE155 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Behavioural interventions to support risk reduction D.DE155 Observation&quot;:\n  Elements.&quot;Behavioural interventions to support risk reduction D.DE155 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Behavioural interventions to support risk reduction D.DE155 */\n\n/*\n@dataElement: HIV.D.DE156 - Sexual and reproductive health integrated services\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: Offer or refer to sexual and reproductive health services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Sexual and reproductive health integrated services D.DE156&quot;:\n  exists &quot;Sexual and reproductive health integrated services D.DE156 Observation&quot;\ndefine &quot;Sexual and reproductive health integrated services D.DE156 Observation&quot;:\n  Elements.&quot;Sexual and reproductive health integrated services D.DE156 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Sexual and reproductive health integrated services D.DE156 */\n\n/*\n@dataElement: HIV.D.DE157 - Contraception and family planning\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: Offer contraception and family planning services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Contraception and family planning D.DE157&quot;:\n  exists &quot;Contraception and family planning D.DE157 Condition&quot;\n    or exists &quot;Contraception and family planning D.DE157 Observation&quot;\ndefine &quot;Contraception and family planning D.DE157 Condition&quot;:\n  Elements.&quot;Contraception and family planning D.DE157 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Contraception and family planning D.DE157 Observation&quot;:\n  Elements.&quot;Contraception and family planning D.DE157 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Contraception and family planning D.DE157 */\n\n/*\n@dataElement: HIV.D.DE158 - Check pregnancy status\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: Check woman's pregnancy status\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Check pregnancy status D.DE158&quot;:\n  exists &quot;Check pregnancy status D.DE158 Condition&quot;\n    or exists &quot;Check pregnancy status D.DE158 Observation&quot;\ndefine &quot;Check pregnancy status D.DE158 Condition&quot;:\n  Elements.&quot;Check pregnancy status D.DE158 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Check pregnancy status D.DE158 Observation&quot;:\n  Elements.&quot;Check pregnancy status D.DE158 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Check pregnancy status D.DE158 */\n\n/*\n@dataElement: HIV.D.DE159 - Prevention of mother-to-child transmission\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: Offer prevention of mother-to-child transmission services (counselling)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Prevention of mother-to-child transmission&quot;:\n  exists &quot;Prevention of mother-to-child transmission Condition&quot;\n    or exists &quot;Prevention of mother-to-child transmission Observation&quot;\ndefine &quot;Prevention of mother-to-child transmission Condition&quot;:\n  Elements.&quot;Prevention of mother-to-child transmission Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Prevention of mother-to-child transmission Observation&quot;:\n  Elements.&quot;Prevention of mother-to-child transmission Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Prevention of mother-to-child transmission */\n\n/*\n@dataElement: HIV.D.DE160 - STI testing and treatment\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: Offer STI testing and treatment services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;STI testing and treatment D.DE160&quot;:\n  exists &quot;STI testing and treatment D.DE160 Condition&quot;\n    or exists &quot;STI testing and treatment D.DE160 Observation&quot;\ndefine &quot;STI testing and treatment D.DE160 Condition&quot;:\n  Elements.&quot;STI testing and treatment D.DE160 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;STI testing and treatment D.DE160 Observation&quot;:\n  Elements.&quot;STI testing and treatment D.DE160 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of STI testing and treatment D.DE160 */\n\n/*\n@dataElement: HIV.D.DE162 - HBsAg test result\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: Hepatitis B virus test result (HBsAg)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HBsAg test result D.DE162&quot;:\n  exists &quot;HBsAg test result D.DE162 Observation&quot;\ndefine &quot;HBsAg test result D.DE162 Observation&quot;:\n  Elements.&quot;HBsAg test result D.DE162 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HBsAg test result D.DE162 */\n\n/*\n@dataElement: HIV.D.DE163 - Positive\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: HBsAg test result was positive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Positive D.DE163&quot;:\n  exists &quot;Positive D.DE163 Condition&quot;\n    or exists &quot;Positive D.DE163 Observation&quot;\ndefine &quot;Positive D.DE163 Condition&quot;:\n  Elements.&quot;Positive D.DE163 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Positive D.DE163 Observation&quot;:\n  Elements.&quot;Positive D.DE163 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Positive D.DE163 */\n\n/*\n@dataElement: HIV.D.DE164 - Negative\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: HBsAg test result was negative\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Negative D.DE164&quot;:\n  exists &quot;Negative D.DE164 Condition&quot;\n    or exists &quot;Negative D.DE164 Observation&quot;\ndefine &quot;Negative D.DE164 Condition&quot;:\n  Elements.&quot;Negative D.DE164 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Negative D.DE164 Observation&quot;:\n  Elements.&quot;Negative D.DE164 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Negative D.DE164 */\n\n/*\n@dataElement: HIV.D.DE165 - Indeterminate\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: HBsAg test result was indeterminate\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Indeterminate D.DE165&quot;:\n  exists &quot;Indeterminate D.DE165 Condition&quot;\n    or exists &quot;Indeterminate D.DE165 Observation&quot;\ndefine &quot;Indeterminate D.DE165 Condition&quot;:\n  Elements.&quot;Indeterminate D.DE165 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Indeterminate D.DE165 Observation&quot;:\n  Elements.&quot;Indeterminate D.DE165 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Indeterminate D.DE165 */\n\n/*\n@dataElement: HIV.D.DE170 - HCV test result\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: Hepatitis C virus test result (HCV antibody, HCV RNA or HCV core antigen)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HCV test result D.DE170&quot;:\n  exists &quot;HCV test result D.DE170 Observation&quot;\ndefine &quot;HCV test result D.DE170 Observation&quot;:\n  Elements.&quot;HCV test result D.DE170 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HCV test result D.DE170 */\n\n/*\n@dataElement: HIV.D.DE171 - Positive\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: HCV test result was positive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Positive D.DE171&quot;:\n  exists &quot;Positive D.DE171 Condition&quot;\n    or exists &quot;Positive D.DE171 Observation&quot;\ndefine &quot;Positive D.DE171 Condition&quot;:\n  Elements.&quot;Positive D.DE171 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Positive D.DE171 Observation&quot;:\n  Elements.&quot;Positive D.DE171 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Positive D.DE171 */\n\n/*\n@dataElement: HIV.D.DE172 - Negative\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: HCV test result was negative\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Negative D.DE172&quot;:\n  exists &quot;Negative D.DE172 Condition&quot;\n    or exists &quot;Negative D.DE172 Observation&quot;\ndefine &quot;Negative D.DE172 Condition&quot;:\n  Elements.&quot;Negative D.DE172 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Negative D.DE172 Observation&quot;:\n  Elements.&quot;Negative D.DE172 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Negative D.DE172 */\n\n/*\n@dataElement: HIV.D.DE173 - Indeterminate\n@activity: HIV.D12 Determine recommended screenings and tests\n@description: HCV test result was indeterminate\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Indeterminate D.DE173&quot;:\n  exists &quot;Indeterminate D.DE173 Condition&quot;\n    or exists &quot;Indeterminate D.DE173 Observation&quot;\ndefine &quot;Indeterminate D.DE173 Condition&quot;:\n  Elements.&quot;Indeterminate D.DE173 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Indeterminate D.DE173 Observation&quot;:\n  Elements.&quot;Indeterminate D.DE173 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Indeterminate D.DE173 */\n\n/*\n@dataElement: HIV.D.DE186 - HIV clinical stage\n@activity: HIV.D8 Capture or update client history\n@description: WHO clinical stage of client based on signs and symptoms. WHO clinical staging is a way to categorize HIV disease severity based on new or recurrent clinical events. There are 4 WHO clinical stages that range from mild symptoms (WHO clinical stage 1) to severe symptoms (WHO clinical stage 4).\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV clinical stage D.DE186&quot;:\n  exists &quot;HIV clinical stage D.DE186 Observation&quot;\ndefine &quot;HIV clinical stage D.DE186 Observation&quot;:\n  Elements.&quot;HIV clinical stage D.DE186 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV clinical stage D.DE186 */\n\n/*\n@dataElement: HIV.D.DE187 - WHO HIV clinical stage 1\n@activity: HIV.D8 Capture or update client history\n@description: Client is currently assessed to be at a clinical stage 1, based on clinical assessment and diagnostics\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;WHO HIV clinical stage 1&quot;:\n  exists &quot;WHO HIV clinical stage 1 Condition&quot;\n    or exists &quot;WHO HIV clinical stage 1 Observation&quot;\ndefine &quot;WHO HIV clinical stage 1 Condition&quot;:\n  Elements.&quot;WHO HIV clinical stage 1 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;WHO HIV clinical stage 1 Observation&quot;:\n  Elements.&quot;WHO HIV clinical stage 1 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of WHO HIV clinical stage 1 */\n\n/*\n@dataElement: HIV.D.DE188 - WHO HIV clinical stage 2\n@activity: HIV.D8 Capture or update client history\n@description: Client is currently assessed to be at a clinical stage 2, based on clinical assessment and diagnostics\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;WHO HIV clinical stage 2&quot;:\n  exists &quot;WHO HIV clinical stage 2 Condition&quot;\n    or exists &quot;WHO HIV clinical stage 2 Observation&quot;\ndefine &quot;WHO HIV clinical stage 2 Condition&quot;:\n  Elements.&quot;WHO HIV clinical stage 2 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;WHO HIV clinical stage 2 Observation&quot;:\n  Elements.&quot;WHO HIV clinical stage 2 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of WHO HIV clinical stage 2 */\n\n/*\n@dataElement: HIV.D.DE189 - WHO HIV clinical stage 3\n@activity: HIV.D8 Capture or update client history\n@description: Client is currently assessed to be at a clinical stage 3, based on clinical assessment and diagnostics\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;WHO HIV clinical stage 3&quot;:\n  exists &quot;WHO HIV clinical stage 3 Condition&quot;\n    or exists &quot;WHO HIV clinical stage 3 Observation&quot;\ndefine &quot;WHO HIV clinical stage 3 Condition&quot;:\n  Elements.&quot;WHO HIV clinical stage 3 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;WHO HIV clinical stage 3 Observation&quot;:\n  Elements.&quot;WHO HIV clinical stage 3 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of WHO HIV clinical stage 3 */\n\n/*\n@dataElement: HIV.D.DE190 - WHO HIV clinical stage 4\n@activity: HIV.D8 Capture or update client history\n@description: Client is currently assessed to be at a clinical stage 4, based on clinical assessment and diagnostics\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;WHO HIV clinical stage 4&quot;:\n  exists &quot;WHO HIV clinical stage 4 Condition&quot;\n    or exists &quot;WHO HIV clinical stage 4 Observation&quot;\ndefine &quot;WHO HIV clinical stage 4 Condition&quot;:\n  Elements.&quot;WHO HIV clinical stage 4 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;WHO HIV clinical stage 4 Observation&quot;:\n  Elements.&quot;WHO HIV clinical stage 4 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of WHO HIV clinical stage 4 */\n\n/*\n@dataElement: HIV.D.DE194 - Date of viral load sample collection\n@activity: HIV.D10 Counsel returning client\n@description: Date and time when the sample was collected to test the client's HIV viral load\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date of viral load sample collection D.DE194&quot;:\n  Elements.&quot;Date of viral load sample collection D.DE194&quot; P\n    where P.encounter.references(EncounterId)\n      or P.performed.toInterval() starts on or before Today\n/* End of Date of viral load sample collection D.DE194 */\n\n/*\n@dataElement: HIV.D.DE195 - Date of scheduled review of viral load test results\n@activity: HIV.D10 Counsel returning client\n@description: Expected date when client's viral load test results will be returned and reviewed\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date of scheduled review of viral load test results&quot;:\n  Elements.&quot;Date of scheduled review of viral load test results&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Date of scheduled review of viral load test results Value&quot;:\n  &quot;Date of scheduled review of viral load test results&quot; O\n  return O.value\n/* End of Date of scheduled review of viral load test results */\n\n/*\n@dataElement: HIV.D.DE225 - Treatment failure\n@activity: HIV.D17 Check for signs of treatment failure\n@description: ART treatment failure\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Treatment failure&quot;:\n  exists &quot;Treatment failure Observation&quot;\ndefine &quot;Treatment failure Observation&quot;:\n  Elements.&quot;Treatment failure Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Treatment failure */\n\n/*\n@dataElement: HIV.D.DE226 - Clinical failure\n@activity: HIV.D17 Check for signs of treatment failure\n@description: New or recurrent clinical event indicating severe immunodeficiency in adults or advanced or severe immunodeficiency in children\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Clinical failure&quot;:\n  exists &quot;Clinical failure Condition&quot;\n    or exists &quot;Clinical failure Observation&quot;\ndefine &quot;Clinical failure Condition&quot;:\n  Elements.&quot;Clinical failure Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Clinical failure Observation&quot;:\n  Elements.&quot;Clinical failure Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Clinical failure */\n\n/*\n@dataElement: HIV.D.DE227 - Immunological failure\n@activity: HIV.D17 Check for signs of treatment failure\n@description: CD4 count at or below 250 cells/mm3 following clinical failure\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Immunological failure&quot;:\n  exists &quot;Immunological failure Condition&quot;\n    or exists &quot;Immunological failure Observation&quot;\ndefine &quot;Immunological failure Condition&quot;:\n  Elements.&quot;Immunological failure Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Immunological failure Observation&quot;:\n  Elements.&quot;Immunological failure Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Immunological failure */\n\n/*\n@dataElement: HIV.D.DE228 - Virological failure\n@activity: HIV.D17 Check for signs of treatment failure\n@description: The inability to achieve or maintain viral suppression below a certain threshold indicated by viral load above 1000 copies/mL based on two consecutive viral load measurements in 3 months, with adherence support following the first viral load test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Virological failure&quot;:\n  exists &quot;Virological failure Condition&quot;\n    or exists &quot;Virological failure Observation&quot;\ndefine &quot;Virological failure Condition&quot;:\n  Elements.&quot;Virological failure Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Virological failure Observation&quot;:\n  Elements.&quot;Virological failure Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Virological failure */\n\n/*\n@dataElement: HIV.D.DE259 - Risk factors, comorbidities and coinfections signs and symptoms\n@activity: HIV.D14 Prevent, screen, and manage comorbidities and coinfections\n@description: Signs and symptoms of opportunistic infections or other comorbidities experienced by client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Risk factors, comorbidities and coinfections signs and symptoms&quot;:\n  exists &quot;Risk factors, comorbidities and coinfections signs and symptoms Observation&quot;\ndefine &quot;Risk factors, comorbidities and coinfections signs and symptoms Observation&quot;:\n  Elements.&quot;Risk factors, comorbidities and coinfections signs and symptoms Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Risk factors, comorbidities and coinfections signs and symptoms */\n\n/*\n@dataElement: HIV.D.DE282 - Presumptive TB\n@activity: HIV.D14 Prevent, screen, and manage comorbidities and coinfections\n@description: Client's comorbidities or coinfections or symptoms of these include presumptive TB\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Presumptive TB D.DE282&quot;:\n  exists &quot;Presumptive TB D.DE282 Condition&quot;\n    or exists &quot;Presumptive TB D.DE282 Observation&quot;\ndefine &quot;Presumptive TB D.DE282 Condition&quot;:\n  Elements.&quot;Presumptive TB D.DE282 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Presumptive TB D.DE282 Observation&quot;:\n  Elements.&quot;Presumptive TB D.DE282 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Presumptive TB D.DE282 */\n\n/*\n@dataElement: HIV.D.DE289 - WHO HIV clinical stage condition or symptom\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: New or recurrent clinical events used to categorize HIV disease severity based at baseline and follow up\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;WHO HIV clinical stage condition or symptom D.DE289&quot;:\n  exists &quot;WHO HIV clinical stage condition or symptom D.DE289 Observation&quot;\ndefine &quot;WHO HIV clinical stage condition or symptom D.DE289 Observation&quot;:\n  Elements.&quot;WHO HIV clinical stage condition or symptom D.DE289 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of WHO HIV clinical stage condition or symptom D.DE289 */\n\n/*\n@dataElement: HIV.D.DE290 - Asymptomatic\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: No HIV-related symptoms reported and no clinical signs on examination\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Asymptomatic&quot;:\n  exists &quot;Asymptomatic Condition&quot;\n    or exists &quot;Asymptomatic Observation&quot;\ndefine &quot;Asymptomatic Condition&quot;:\n  Elements.&quot;Asymptomatic Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Asymptomatic Observation&quot;:\n  Elements.&quot;Asymptomatic Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Asymptomatic */\n\n/*\n@dataElement: HIV.D.DE291 - Persistent generalized lymphadenopathy\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Persistent enlarged lymph nodes &gt;1 cm at two or more non-contiguous sites (excluding inguinal) without known cause\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Persistent generalized lymphadenopathy&quot;:\n  exists &quot;Persistent generalized lymphadenopathy Condition&quot;\n    or exists &quot;Persistent generalized lymphadenopathy Observation&quot;\ndefine &quot;Persistent generalized lymphadenopathy Condition&quot;:\n  Elements.&quot;Persistent generalized lymphadenopathy Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Persistent generalized lymphadenopathy Observation&quot;:\n  Elements.&quot;Persistent generalized lymphadenopathy Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Persistent generalized lymphadenopathy */\n\n/*\n@dataElement: HIV.D.DE292 - Moderate unexplained weight loss\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Moderate unexplained weight loss (&lt;10% of presumed or measured body weight)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Moderate unexplained weight loss&quot;:\n  exists &quot;Moderate unexplained weight loss Condition&quot;\n    or exists &quot;Moderate unexplained weight loss Observation&quot;\ndefine &quot;Moderate unexplained weight loss Condition&quot;:\n  Elements.&quot;Moderate unexplained weight loss Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Moderate unexplained weight loss Observation&quot;:\n  Elements.&quot;Moderate unexplained weight loss Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Moderate unexplained weight loss */\n\n/*\n@dataElement: HIV.D.DE293 - Recurrent respiratory tract infections\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include recurrent respiratory tract infections including sinusitis, tonsillitis, otitis media or pharyngitis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Recurrent respiratory tract infections&quot;:\n  exists &quot;Recurrent respiratory tract infections Condition&quot;\n    or exists &quot;Recurrent respiratory tract infections Observation&quot;\ndefine &quot;Recurrent respiratory tract infections Condition&quot;:\n  Elements.&quot;Recurrent respiratory tract infections Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Recurrent respiratory tract infections Observation&quot;:\n  Elements.&quot;Recurrent respiratory tract infections Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Recurrent respiratory tract infections */\n\n/*\n@dataElement: HIV.D.DE294 - Unexplained persistent hepatosplenomegaly\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include unexplained persistent hepatosplenomegaly\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unexplained persistent hepatosplenomegaly&quot;:\n  exists &quot;Unexplained persistent hepatosplenomegaly Condition&quot;\n    or exists &quot;Unexplained persistent hepatosplenomegaly Observation&quot;\ndefine &quot;Unexplained persistent hepatosplenomegaly Condition&quot;:\n  Elements.&quot;Unexplained persistent hepatosplenomegaly Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unexplained persistent hepatosplenomegaly Observation&quot;:\n  Elements.&quot;Unexplained persistent hepatosplenomegaly Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unexplained persistent hepatosplenomegaly */\n\n/*\n@dataElement: HIV.D.DE295 - Herpes zoster\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include herpes zoster\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Herpes zoster&quot;:\n  exists &quot;Herpes zoster Condition&quot;\n    or exists &quot;Herpes zoster Observation&quot;\ndefine &quot;Herpes zoster Condition&quot;:\n  Elements.&quot;Herpes zoster Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Herpes zoster Observation&quot;:\n  Elements.&quot;Herpes zoster Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Herpes zoster */\n\n/*\n@dataElement: HIV.D.DE296 - Angular cheilitis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include angular cheilitis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Angular cheilitis&quot;:\n  exists &quot;Angular cheilitis Condition&quot;\n    or exists &quot;Angular cheilitis Observation&quot;\ndefine &quot;Angular cheilitis Condition&quot;:\n  Elements.&quot;Angular cheilitis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Angular cheilitis Observation&quot;:\n  Elements.&quot;Angular cheilitis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Angular cheilitis */\n\n/*\n@dataElement: HIV.D.DE297 - Linear gingival erythema\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include linear gingival erythema\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Linear gingival erythema&quot;:\n  exists &quot;Linear gingival erythema Condition&quot;\n    or exists &quot;Linear gingival erythema Observation&quot;\ndefine &quot;Linear gingival erythema Condition&quot;:\n  Elements.&quot;Linear gingival erythema Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Linear gingival erythema Observation&quot;:\n  Elements.&quot;Linear gingival erythema Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Linear gingival erythema */\n\n/*\n@dataElement: HIV.D.DE298 - Recurrent oral ulceration\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include recurrent oral ulceration\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Recurrent oral ulceration&quot;:\n  exists &quot;Recurrent oral ulceration Condition&quot;\n    or exists &quot;Recurrent oral ulceration Observation&quot;\ndefine &quot;Recurrent oral ulceration Condition&quot;:\n  Elements.&quot;Recurrent oral ulceration Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Recurrent oral ulceration Observation&quot;:\n  Elements.&quot;Recurrent oral ulceration Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Recurrent oral ulceration */\n\n/*\n@dataElement: HIV.D.DE299 - Papular pruritic eruption\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include papular pruritic eruption\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Papular pruritic eruption&quot;:\n  exists &quot;Papular pruritic eruption Condition&quot;\n    or exists &quot;Papular pruritic eruption Observation&quot;\ndefine &quot;Papular pruritic eruption Condition&quot;:\n  Elements.&quot;Papular pruritic eruption Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Papular pruritic eruption Observation&quot;:\n  Elements.&quot;Papular pruritic eruption Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Papular pruritic eruption */\n\n/*\n@dataElement: HIV.D.DE300 - Fungal nail infections\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include fungal nail infections\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Fungal nail infections&quot;:\n  exists &quot;Fungal nail infections Condition&quot;\n    or exists &quot;Fungal nail infections Observation&quot;\ndefine &quot;Fungal nail infections Condition&quot;:\n  Elements.&quot;Fungal nail infections Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Fungal nail infections Observation&quot;:\n  Elements.&quot;Fungal nail infections Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Fungal nail infections */\n\n/*\n@dataElement: HIV.D.DE301 - Seborrhoeic dermatitis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include seborrhoeic dermatitis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Seborrhoeic dermatitis&quot;:\n  exists &quot;Seborrhoeic dermatitis Condition&quot;\n    or exists &quot;Seborrhoeic dermatitis Observation&quot;\ndefine &quot;Seborrhoeic dermatitis Condition&quot;:\n  Elements.&quot;Seborrhoeic dermatitis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Seborrhoeic dermatitis Observation&quot;:\n  Elements.&quot;Seborrhoeic dermatitis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Seborrhoeic dermatitis */\n\n/*\n@dataElement: HIV.D.DE302 - Extensive wart virus infection\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include extensive wart virus infection\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Extensive wart virus infection&quot;:\n  exists &quot;Extensive wart virus infection Condition&quot;\n    or exists &quot;Extensive wart virus infection Observation&quot;\ndefine &quot;Extensive wart virus infection Condition&quot;:\n  Elements.&quot;Extensive wart virus infection Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Extensive wart virus infection Observation&quot;:\n  Elements.&quot;Extensive wart virus infection Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Extensive wart virus infection */\n\n/*\n@dataElement: HIV.D.DE303 - Extensive molluscum contagiosum\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include extensive molluscum contagiosum\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Extensive molluscum contagiosum&quot;:\n  exists &quot;Extensive molluscum contagiosum Condition&quot;\n    or exists &quot;Extensive molluscum contagiosum Observation&quot;\ndefine &quot;Extensive molluscum contagiosum Condition&quot;:\n  Elements.&quot;Extensive molluscum contagiosum Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Extensive molluscum contagiosum Observation&quot;:\n  Elements.&quot;Extensive molluscum contagiosum Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Extensive molluscum contagiosum */\n\n/*\n@dataElement: HIV.D.DE304 - Unexplained persistent parotid enlargement\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include unexplained persistent parotid enlargement\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unexplained persistent parotid enlargement&quot;:\n  exists &quot;Unexplained persistent parotid enlargement Condition&quot;\n    or exists &quot;Unexplained persistent parotid enlargement Observation&quot;\ndefine &quot;Unexplained persistent parotid enlargement Condition&quot;:\n  Elements.&quot;Unexplained persistent parotid enlargement Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unexplained persistent parotid enlargement Observation&quot;:\n  Elements.&quot;Unexplained persistent parotid enlargement Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unexplained persistent parotid enlargement */\n\n/*\n@dataElement: HIV.D.DE305 - Unexplained severe weight loss in adults\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Unexplained severe weight loss (&gt;10% of presumed or measured body weight)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unexplained severe weight loss in adults&quot;:\n  exists &quot;Unexplained severe weight loss in adults Condition&quot;\n    or exists &quot;Unexplained severe weight loss in adults Observation&quot;\ndefine &quot;Unexplained severe weight loss in adults Condition&quot;:\n  Elements.&quot;Unexplained severe weight loss in adults Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unexplained severe weight loss in adults Observation&quot;:\n  Elements.&quot;Unexplained severe weight loss in adults Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unexplained severe weight loss in adults */\n\n/*\n@dataElement: HIV.D.DE306 - Unexplained moderate malnutrition not adequately responding to standard therapy\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Defined as weight-for-height &lt; - 2 z-score or mid-upper arm circumference 115 mm to &lt;125 mm. For children younger than five years of age: stunting is defined as severe acute malnutrition - either weight for height &lt; -3 z-score or mid-upper arm circumference &lt;115 mm or the presence of oedema.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unexplained moderate malnutrition not adequately responding to standard therapy&quot;:\n  exists &quot;Unexplained moderate malnutrition not adequately responding to standard therapy Condition&quot;\n    or exists &quot;Unexplained moderate malnutrition not adequately responding to standard therapy Observation&quot;\ndefine &quot;Unexplained moderate malnutrition not adequately responding to standard therapy Condition&quot;:\n  Elements.&quot;Unexplained moderate malnutrition not adequately responding to standard therapy Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unexplained moderate malnutrition not adequately responding to standard therapy Observation&quot;:\n  Elements.&quot;Unexplained moderate malnutrition not adequately responding to standard therapy Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unexplained moderate malnutrition not adequately responding to standard therapy */\n\n/*\n@dataElement: HIV.D.DE307 - Unexplained chronic diarrhoea for longer than 1 month\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include unexplained chronic diarrhoea for longer than 1 month\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unexplained chronic diarrhoea for longer than 1 month&quot;:\n  exists &quot;Unexplained chronic diarrhoea for longer than 1 month Condition&quot;\n    or exists &quot;Unexplained chronic diarrhoea for longer than 1 month Observation&quot;\ndefine &quot;Unexplained chronic diarrhoea for longer than 1 month Condition&quot;:\n  Elements.&quot;Unexplained chronic diarrhoea for longer than 1 month Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unexplained chronic diarrhoea for longer than 1 month Observation&quot;:\n  Elements.&quot;Unexplained chronic diarrhoea for longer than 1 month Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unexplained chronic diarrhoea for longer than 1 month */\n\n/*\n@dataElement: HIV.D.DE308 - Unexplained persistent diarrhoea 14 days or more\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include unexplained persistent diarrhoea (14 days or more)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unexplained persistent diarrhoea 14 days or more&quot;:\n  exists &quot;Unexplained persistent diarrhoea 14 days or more Condition&quot;\n    or exists &quot;Unexplained persistent diarrhoea 14 days or more Observation&quot;\ndefine &quot;Unexplained persistent diarrhoea 14 days or more Condition&quot;:\n  Elements.&quot;Unexplained persistent diarrhoea 14 days or more Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unexplained persistent diarrhoea 14 days or more Observation&quot;:\n  Elements.&quot;Unexplained persistent diarrhoea 14 days or more Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unexplained persistent diarrhoea 14 days or more */\n\n/*\n@dataElement: HIV.D.DE309 - Unexplained persistent fever above 37.5 C, intermittent or constant, for longer than one 1 month\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include unexplained persistent fever (above 37.5 C, intermittent or constant, for longer than one 1 month)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unexplained persistent fever above 37.5 C, intermittent or constant, for longer than one 1 month&quot;:\n  exists &quot;Unexplained persistent fever above 37.5 C, intermittent or constant, for longer than one 1 month Condition&quot;\n    or exists &quot;Unexplained persistent fever above 37.5 C, intermittent or constant, for longer than one 1 month Observation&quot;\ndefine &quot;Unexplained persistent fever above 37.5 C, intermittent or constant, for longer than one 1 month Condition&quot;:\n  Elements.&quot;Unexplained persistent fever above 37.5 C, intermittent or constant, for longer than one 1 month Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unexplained persistent fever above 37.5 C, intermittent or constant, for longer than one 1 month Observation&quot;:\n  Elements.&quot;Unexplained persistent fever above 37.5 C, intermittent or constant, for longer than one 1 month Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unexplained persistent fever above 37.5 C, intermittent or constant, for longer than one 1 month */\n\n/*\n@dataElement: HIV.D.DE310 - Persistent oral candidiasis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include persistent oral candidiasis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Persistent oral candidiasis&quot;:\n  exists &quot;Persistent oral candidiasis Condition&quot;\n    or exists &quot;Persistent oral candidiasis Observation&quot;\ndefine &quot;Persistent oral candidiasis Condition&quot;:\n  Elements.&quot;Persistent oral candidiasis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Persistent oral candidiasis Observation&quot;:\n  Elements.&quot;Persistent oral candidiasis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Persistent oral candidiasis */\n\n/*\n@dataElement: HIV.D.DE311 - Oral hairy leukoplakia\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client has fine white small linear or corrugated lesions on lateral borders of the tongue that do not scrape off\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Oral hairy leukoplakia&quot;:\n  exists &quot;Oral hairy leukoplakia Condition&quot;\n    or exists &quot;Oral hairy leukoplakia Observation&quot;\ndefine &quot;Oral hairy leukoplakia Condition&quot;:\n  Elements.&quot;Oral hairy leukoplakia Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Oral hairy leukoplakia Observation&quot;:\n  Elements.&quot;Oral hairy leukoplakia Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Oral hairy leukoplakia */\n\n/*\n@dataElement: HIV.D.DE312 - Pulmonary TB\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include pulmonary TB\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Pulmonary TB D.DE312&quot;:\n  exists &quot;Pulmonary TB D.DE312 Condition&quot;\n    or exists &quot;Pulmonary TB D.DE312 Observation&quot;\ndefine &quot;Pulmonary TB D.DE312 Condition&quot;:\n  Elements.&quot;Pulmonary TB D.DE312 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Pulmonary TB D.DE312 Observation&quot;:\n  Elements.&quot;Pulmonary TB D.DE312 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Pulmonary TB D.DE312 */\n\n/*\n@dataElement: HIV.D.DE313 - Lymph node TB\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include lymph node TB\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Lymph node TB D.DE313&quot;:\n  exists &quot;Lymph node TB D.DE313 Condition&quot;\n    or exists &quot;Lymph node TB D.DE313 Observation&quot;\ndefine &quot;Lymph node TB D.DE313 Condition&quot;:\n  Elements.&quot;Lymph node TB D.DE313 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Lymph node TB D.DE313 Observation&quot;:\n  Elements.&quot;Lymph node TB D.DE313 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Lymph node TB D.DE313 */\n\n/*\n@dataElement: HIV.D.DE314 - Severe bacterial infections such as pneumonia, empyema, pyomyositis, bone or joint infection, meningitis, bacteraemia\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include severe bacterial infections (such as pneumonia, empyema, pyomyositis, bone or joint infection, meningitis, bacteraemia)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Severe bacterial infections such as pneumonia, empyema, pyomyositis, bone or joint infection, meningitis, bacteraemia&quot;:\n  exists &quot;Severe bacterial infections such as pneumonia, empyema, pyomyositis, bone or joint infection, meningitis, bacteraemia Condition&quot;\n    or exists &quot;Severe bacterial infections such as pneumonia, empyema, pyomyositis, bone or joint infection, meningitis, bacteraemia Observation&quot;\ndefine &quot;Severe bacterial infections such as pneumonia, empyema, pyomyositis, bone or joint infection, meningitis, bacteraemia Condition&quot;:\n  Elements.&quot;Severe bacterial infections such as pneumonia, empyema, pyomyositis, bone or joint infection, meningitis, bacteraemia Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Severe bacterial infections such as pneumonia, empyema, pyomyositis, bone or joint infection, meningitis, bacteraemia Observation&quot;:\n  Elements.&quot;Severe bacterial infections such as pneumonia, empyema, pyomyositis, bone or joint infection, meningitis, bacteraemia Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Severe bacterial infections such as pneumonia, empyema, pyomyositis, bone or joint infection, meningitis, bacteraemia */\n\n/*\n@dataElement: HIV.D.DE315 - Severe recurrent bacterial pneumonia\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include severe recurrent bacterial pneumonia\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Severe recurrent bacterial pneumonia&quot;:\n  exists &quot;Severe recurrent bacterial pneumonia Condition&quot;\n    or exists &quot;Severe recurrent bacterial pneumonia Observation&quot;\ndefine &quot;Severe recurrent bacterial pneumonia Condition&quot;:\n  Elements.&quot;Severe recurrent bacterial pneumonia Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Severe recurrent bacterial pneumonia Observation&quot;:\n  Elements.&quot;Severe recurrent bacterial pneumonia Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Severe recurrent bacterial pneumonia */\n\n/*\n@dataElement: HIV.D.DE316 - Acute necrotizing ulcerative stomatitis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include acute necrotizing ulcerative stomatitis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Acute necrotizing ulcerative stomatitis&quot;:\n  exists &quot;Acute necrotizing ulcerative stomatitis Condition&quot;\n    or exists &quot;Acute necrotizing ulcerative stomatitis Observation&quot;\ndefine &quot;Acute necrotizing ulcerative stomatitis Condition&quot;:\n  Elements.&quot;Acute necrotizing ulcerative stomatitis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Acute necrotizing ulcerative stomatitis Observation&quot;:\n  Elements.&quot;Acute necrotizing ulcerative stomatitis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Acute necrotizing ulcerative stomatitis */\n\n/*\n@dataElement: HIV.D.DE317 - Acute necrotizing ulcerative gingivitis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include acute necrotizing ulcerative gingivitis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Acute necrotizing ulcerative gingivitis&quot;:\n  exists &quot;Acute necrotizing ulcerative gingivitis Condition&quot;\n    or exists &quot;Acute necrotizing ulcerative gingivitis Observation&quot;\ndefine &quot;Acute necrotizing ulcerative gingivitis Condition&quot;:\n  Elements.&quot;Acute necrotizing ulcerative gingivitis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Acute necrotizing ulcerative gingivitis Observation&quot;:\n  Elements.&quot;Acute necrotizing ulcerative gingivitis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Acute necrotizing ulcerative gingivitis */\n\n/*\n@dataElement: HIV.D.DE318 - Acute necrotizing ulcerative periodontitis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include acute necrotizing ulcerative periodontitis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Acute necrotizing ulcerative periodontitis&quot;:\n  exists &quot;Acute necrotizing ulcerative periodontitis Condition&quot;\n    or exists &quot;Acute necrotizing ulcerative periodontitis Observation&quot;\ndefine &quot;Acute necrotizing ulcerative periodontitis Condition&quot;:\n  Elements.&quot;Acute necrotizing ulcerative periodontitis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Acute necrotizing ulcerative periodontitis Observation&quot;:\n  Elements.&quot;Acute necrotizing ulcerative periodontitis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Acute necrotizing ulcerative periodontitis */\n\n/*\n@dataElement: HIV.D.DE319 - Unexplained anaemia &lt;8 g/dL\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include unexplained anaemia (&lt;8 g/dL)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unexplained anaemia &lt;8 g/dL&quot;:\n  exists &quot;Unexplained anaemia &lt;8 g/dL Condition&quot;\n    or exists &quot;Unexplained anaemia &lt;8 g/dL Observation&quot;\ndefine &quot;Unexplained anaemia &lt;8 g/dL Condition&quot;:\n  Elements.&quot;Unexplained anaemia &lt;8 g/dL Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unexplained anaemia &lt;8 g/dL Observation&quot;:\n  Elements.&quot;Unexplained anaemia &lt;8 g/dL Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unexplained anaemia &lt;8 g/dL */\n\n/*\n@dataElement: HIV.D.DE320 - Neutropaenia &lt;0.5 x 10^9/L\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include neutropaenia (&lt;0.5 x 10^9/L)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Neutropaenia &lt;0.5 x 10^9/L&quot;:\n  exists &quot;Neutropaenia &lt;0.5 x 10^9/L Condition&quot;\n    or exists &quot;Neutropaenia &lt;0.5 x 10^9/L Observation&quot;\ndefine &quot;Neutropaenia &lt;0.5 x 10^9/L Condition&quot;:\n  Elements.&quot;Neutropaenia &lt;0.5 x 10^9/L Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Neutropaenia &lt;0.5 x 10^9/L Observation&quot;:\n  Elements.&quot;Neutropaenia &lt;0.5 x 10^9/L Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Neutropaenia &lt;0.5 x 10^9/L */\n\n/*\n@dataElement: HIV.D.DE321 - Chronic thrombocytopaenia &lt;50 x 10^9/L\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include chronic thrombocytopaenia (&lt;50 x 10^9/L)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Chronic thrombocytopaenia &lt;50 x 10^9/L&quot;:\n  exists &quot;Chronic thrombocytopaenia &lt;50 x 10^9/L Condition&quot;\n    or exists &quot;Chronic thrombocytopaenia &lt;50 x 10^9/L Observation&quot;\ndefine &quot;Chronic thrombocytopaenia &lt;50 x 10^9/L Condition&quot;:\n  Elements.&quot;Chronic thrombocytopaenia &lt;50 x 10^9/L Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Chronic thrombocytopaenia &lt;50 x 10^9/L Observation&quot;:\n  Elements.&quot;Chronic thrombocytopaenia &lt;50 x 10^9/L Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Chronic thrombocytopaenia &lt;50 x 10^9/L */\n\n/*\n@dataElement: HIV.D.DE322 - Symptomatic lymphoid interstitial pneumonitis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include symptomatic lymphoid interstitial pneumonitis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Symptomatic lymphoid interstitial pneumonitis&quot;:\n  exists &quot;Symptomatic lymphoid interstitial pneumonitis Condition&quot;\n    or exists &quot;Symptomatic lymphoid interstitial pneumonitis Observation&quot;\ndefine &quot;Symptomatic lymphoid interstitial pneumonitis Condition&quot;:\n  Elements.&quot;Symptomatic lymphoid interstitial pneumonitis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Symptomatic lymphoid interstitial pneumonitis Observation&quot;:\n  Elements.&quot;Symptomatic lymphoid interstitial pneumonitis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Symptomatic lymphoid interstitial pneumonitis */\n\n/*\n@dataElement: HIV.D.DE323 - Chronic HIV-associated lung disease, including bronchiectasis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include chronic HIV-associated lung disease, including bronchiectasis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Chronic HIV-associated lung disease, including bronchiectasis&quot;:\n  exists &quot;Chronic HIV-associated lung disease, including bronchiectasis Condition&quot;\n    or exists &quot;Chronic HIV-associated lung disease, including bronchiectasis Observation&quot;\ndefine &quot;Chronic HIV-associated lung disease, including bronchiectasis Condition&quot;:\n  Elements.&quot;Chronic HIV-associated lung disease, including bronchiectasis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Chronic HIV-associated lung disease, including bronchiectasis Observation&quot;:\n  Elements.&quot;Chronic HIV-associated lung disease, including bronchiectasis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Chronic HIV-associated lung disease, including bronchiectasis */\n\n/*\n@dataElement: HIV.D.DE324 - HIV wasting syndrome\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Unexplained involuntary weight loss (&gt;10% baseline body weight), with obvious wasting or body mass index &lt;18.5; PLUS EITHER unexplained chronic reported for longer than one month; OR reports of fever or night sweats for more than one month without other cause and lack of response to antibiotics or antimalarial agents; malaria must be excluded in malarious areas.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV wasting syndrome&quot;:\n  exists &quot;HIV wasting syndrome Condition&quot;\n    or exists &quot;HIV wasting syndrome Observation&quot;\ndefine &quot;HIV wasting syndrome Condition&quot;:\n  Elements.&quot;HIV wasting syndrome Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV wasting syndrome Observation&quot;:\n  Elements.&quot;HIV wasting syndrome Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV wasting syndrome */\n\n/*\n@dataElement: HIV.D.DE325 - Unexplained severe wasting not responding to standard therapy\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client has unexplained severe wasting not responding to standard therapy . For under 5 years old, defined as weight-for-height &lt; -3 z-score\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unexplained severe wasting not responding to standard therapy&quot;:\n  exists &quot;Unexplained severe wasting not responding to standard therapy Condition&quot;\n    or exists &quot;Unexplained severe wasting not responding to standard therapy Observation&quot;\ndefine &quot;Unexplained severe wasting not responding to standard therapy Condition&quot;:\n  Elements.&quot;Unexplained severe wasting not responding to standard therapy Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unexplained severe wasting not responding to standard therapy Observation&quot;:\n  Elements.&quot;Unexplained severe wasting not responding to standard therapy Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unexplained severe wasting not responding to standard therapy */\n\n/*\n@dataElement: HIV.D.DE326 - Unexplained stunting not responding to standard therapy\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client has unexplained stunting not responding to standard therapy . For under 5 years old, defined as length-for- age/height-for-age &lt; -2 z-score\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unexplained stunting not responding to standard therapy&quot;:\n  exists &quot;Unexplained stunting not responding to standard therapy Condition&quot;\n    or exists &quot;Unexplained stunting not responding to standard therapy Observation&quot;\ndefine &quot;Unexplained stunting not responding to standard therapy Condition&quot;:\n  Elements.&quot;Unexplained stunting not responding to standard therapy Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unexplained stunting not responding to standard therapy Observation&quot;:\n  Elements.&quot;Unexplained stunting not responding to standard therapy Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unexplained stunting not responding to standard therapy */\n\n/*\n@dataElement: HIV.D.DE327 - Unexplained severe malnutrition not responding to standard therapy\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client has unexplained severe malnutrition not responding to standard therapy . For under 5 years old, weight for height &lt; -3 z-score or mid-upper arm circumference &lt;115 mm or the presence of oedema\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Unexplained severe malnutrition not responding to standard therapy&quot;:\n  exists &quot;Unexplained severe malnutrition not responding to standard therapy Condition&quot;\n    or exists &quot;Unexplained severe malnutrition not responding to standard therapy Observation&quot;\ndefine &quot;Unexplained severe malnutrition not responding to standard therapy Condition&quot;:\n  Elements.&quot;Unexplained severe malnutrition not responding to standard therapy Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Unexplained severe malnutrition not responding to standard therapy Observation&quot;:\n  Elements.&quot;Unexplained severe malnutrition not responding to standard therapy Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Unexplained severe malnutrition not responding to standard therapy */\n\n/*\n@dataElement: HIV.D.DE328 - Pneumocystis jirovecii pneumonia\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include pneumocystis (jirovecii) pneumonia\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Pneumocystis jirovecii pneumonia&quot;:\n  exists &quot;Pneumocystis jirovecii pneumonia Condition&quot;\n    or exists &quot;Pneumocystis jirovecii pneumonia Observation&quot;\ndefine &quot;Pneumocystis jirovecii pneumonia Condition&quot;:\n  Elements.&quot;Pneumocystis jirovecii pneumonia Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Pneumocystis jirovecii pneumonia Observation&quot;:\n  Elements.&quot;Pneumocystis jirovecii pneumonia Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Pneumocystis jirovecii pneumonia */\n\n/*\n@dataElement: HIV.D.DE329 - Recurrent severe bacterial pneumonia\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include recurrent severe bacterial pneumonia\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Recurrent severe bacterial pneumonia&quot;:\n  exists &quot;Recurrent severe bacterial pneumonia Condition&quot;\n    or exists &quot;Recurrent severe bacterial pneumonia Observation&quot;\ndefine &quot;Recurrent severe bacterial pneumonia Condition&quot;:\n  Elements.&quot;Recurrent severe bacterial pneumonia Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Recurrent severe bacterial pneumonia Observation&quot;:\n  Elements.&quot;Recurrent severe bacterial pneumonia Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Recurrent severe bacterial pneumonia */\n\n/*\n@dataElement: HIV.D.DE330 - Recurrent severe bacterial infections such as empyema, pyomyositis, bone or joint infection, meningitis, but excluding pneumonia\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include recurrent severe bacterial infections (such as empyema, pyomyositis, bone or joint infection, meningitis, but excluding pneumonia)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Recurrent severe bacterial infections such as empyema, pyomyositis, bone or joint infection, meningitis, but excluding pneumonia&quot;:\n  exists &quot;Recurrent severe bacterial infections such as empyema, pyomyositis, bone or joint infection, meningitis, but excluding pneumonia Condition&quot;\n    or exists &quot;Recurrent severe bacterial infections such as empyema, pyomyositis, bone or joint infection, meningitis, but excluding pneumonia Observation&quot;\ndefine &quot;Recurrent severe bacterial infections such as empyema, pyomyositis, bone or joint infection, meningitis, but excluding pneumonia Condition&quot;:\n  Elements.&quot;Recurrent severe bacterial infections such as empyema, pyomyositis, bone or joint infection, meningitis, but excluding pneumonia Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Recurrent severe bacterial infections such as empyema, pyomyositis, bone or joint infection, meningitis, but excluding pneumonia Observation&quot;:\n  Elements.&quot;Recurrent severe bacterial infections such as empyema, pyomyositis, bone or joint infection, meningitis, but excluding pneumonia Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Recurrent severe bacterial infections such as empyema, pyomyositis, bone or joint infection, meningitis, but excluding pneumonia */\n\n/*\n@dataElement: HIV.D.DE331 - Empyema\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include recurrent empyema\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Empyema&quot;:\n  exists &quot;Empyema Condition&quot;\n    or exists &quot;Empyema Observation&quot;\ndefine &quot;Empyema Condition&quot;:\n  Elements.&quot;Empyema Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Empyema Observation&quot;:\n  Elements.&quot;Empyema Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Empyema */\n\n/*\n@dataElement: HIV.D.DE332 - Pyomyositis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include recurrent pyomyositis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Pyomyositis&quot;:\n  exists &quot;Pyomyositis Condition&quot;\n    or exists &quot;Pyomyositis Observation&quot;\ndefine &quot;Pyomyositis Condition&quot;:\n  Elements.&quot;Pyomyositis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Pyomyositis Observation&quot;:\n  Elements.&quot;Pyomyositis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Pyomyositis */\n\n/*\n@dataElement: HIV.D.DE333 - Bone or joint infection\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include recurrent bone or joint infections\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Bone or joint infection&quot;:\n  exists &quot;Bone or joint infection Condition&quot;\n    or exists &quot;Bone or joint infection Observation&quot;\ndefine &quot;Bone or joint infection Condition&quot;:\n  Elements.&quot;Bone or joint infection Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Bone or joint infection Observation&quot;:\n  Elements.&quot;Bone or joint infection Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Bone or joint infection */\n\n/*\n@dataElement: HIV.D.DE334 - Meningitis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include recurrent meningitis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Meningitis&quot;:\n  exists &quot;Meningitis Condition&quot;\n    or exists &quot;Meningitis Observation&quot;\ndefine &quot;Meningitis Condition&quot;:\n  Elements.&quot;Meningitis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Meningitis Observation&quot;:\n  Elements.&quot;Meningitis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Meningitis */\n\n/*\n@dataElement: HIV.D.DE335 - Chronic herpes simplex infection orolabial or cutaneous of more than 1 month duration or visceral at any site\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include chronic herpes simplex infection (orolabial or cutaneous of more than 1 month duration or visceral at any site)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Chronic herpes simplex infection orolabial or cutaneous of more than 1 month duration or visceral at any site&quot;:\n  exists &quot;Chronic herpes simplex infection orolabial or cutaneous of more than 1 month duration or visceral at any site Condition&quot;\n    or exists &quot;Chronic herpes simplex infection orolabial or cutaneous of more than 1 month duration or visceral at any site Observation&quot;\ndefine &quot;Chronic herpes simplex infection orolabial or cutaneous of more than 1 month duration or visceral at any site Condition&quot;:\n  Elements.&quot;Chronic herpes simplex infection orolabial or cutaneous of more than 1 month duration or visceral at any site Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Chronic herpes simplex infection orolabial or cutaneous of more than 1 month duration or visceral at any site Observation&quot;:\n  Elements.&quot;Chronic herpes simplex infection orolabial or cutaneous of more than 1 month duration or visceral at any site Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Chronic herpes simplex infection orolabial or cutaneous of more than 1 month duration or visceral at any site */\n\n/*\n@dataElement: HIV.D.DE336 - Chronic herpes simplex infection orolabial, genital or anorectal of more than 1 month in duration or visceral at any site\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include chronic herpes simplex infection (orolabial, genital or anorectal of more than one month in duration or visceral at any site)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Chronic herpes simplex infection orolabial, genital or anorectal of more than 1 month in duration or visceral at any site&quot;:\n  exists &quot;Chronic herpes simplex infection orolabial, genital or anorectal of more than 1 month in duration or visceral at any site Condition&quot;\n    or exists &quot;Chronic herpes simplex infection orolabial, genital or anorectal of more than 1 month in duration or visceral at any site Observation&quot;\ndefine &quot;Chronic herpes simplex infection orolabial, genital or anorectal of more than 1 month in duration or visceral at any site Condition&quot;:\n  Elements.&quot;Chronic herpes simplex infection orolabial, genital or anorectal of more than 1 month in duration or visceral at any site Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Chronic herpes simplex infection orolabial, genital or anorectal of more than 1 month in duration or visceral at any site Observation&quot;:\n  Elements.&quot;Chronic herpes simplex infection orolabial, genital or anorectal of more than 1 month in duration or visceral at any site Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Chronic herpes simplex infection orolabial, genital or anorectal of more than 1 month in duration or visceral at any site */\n\n/*\n@dataElement: HIV.D.DE337 - Oesophageal candidiasis or candidiasis of trachea, bronchi or lungs\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include oesophageal candidiasis (or candidiasis of trachea, bronchi or lungs)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Oesophageal candidiasis or candidiasis of trachea, bronchi or lungs&quot;:\n  exists &quot;Oesophageal candidiasis or candidiasis of trachea, bronchi or lungs Condition&quot;\n    or exists &quot;Oesophageal candidiasis or candidiasis of trachea, bronchi or lungs Observation&quot;\ndefine &quot;Oesophageal candidiasis or candidiasis of trachea, bronchi or lungs Condition&quot;:\n  Elements.&quot;Oesophageal candidiasis or candidiasis of trachea, bronchi or lungs Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Oesophageal candidiasis or candidiasis of trachea, bronchi or lungs Observation&quot;:\n  Elements.&quot;Oesophageal candidiasis or candidiasis of trachea, bronchi or lungs Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Oesophageal candidiasis or candidiasis of trachea, bronchi or lungs */\n\n/*\n@dataElement: HIV.D.DE338 - Extrapulmonary TB\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include extrapulmonary tuberculosis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Extrapulmonary TB D.DE338&quot;:\n  exists &quot;Extrapulmonary TB D.DE338 Condition&quot;\n    or exists &quot;Extrapulmonary TB D.DE338 Observation&quot;\ndefine &quot;Extrapulmonary TB D.DE338 Condition&quot;:\n  Elements.&quot;Extrapulmonary TB D.DE338 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Extrapulmonary TB D.DE338 Observation&quot;:\n  Elements.&quot;Extrapulmonary TB D.DE338 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Extrapulmonary TB D.DE338 */\n\n/*\n@dataElement: HIV.D.DE339 - Kaposi sarcoma\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include Kaposi sarcoma\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Kaposi sarcoma&quot;:\n  exists &quot;Kaposi sarcoma Condition&quot;\n    or exists &quot;Kaposi sarcoma Observation&quot;\ndefine &quot;Kaposi sarcoma Condition&quot;:\n  Elements.&quot;Kaposi sarcoma Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Kaposi sarcoma Observation&quot;:\n  Elements.&quot;Kaposi sarcoma Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Kaposi sarcoma */\n\n/*\n@dataElement: HIV.D.DE340 - Cytomegalovirus infection retinitis or infection of other organs\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include cytomegalovirus infection (retinitis or infection of other organs)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Cytomegalovirus infection retinitis or infection of other organs&quot;:\n  exists &quot;Cytomegalovirus infection retinitis or infection of other organs Condition&quot;\n    or exists &quot;Cytomegalovirus infection retinitis or infection of other organs Observation&quot;\ndefine &quot;Cytomegalovirus infection retinitis or infection of other organs Condition&quot;:\n  Elements.&quot;Cytomegalovirus infection retinitis or infection of other organs Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Cytomegalovirus infection retinitis or infection of other organs Observation&quot;:\n  Elements.&quot;Cytomegalovirus infection retinitis or infection of other organs Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Cytomegalovirus infection retinitis or infection of other organs */\n\n/*\n@dataElement: HIV.D.DE341 - Central nervous system toxoplasmosis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include central nervous system toxoplasmosis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Central nervous system toxoplasmosis&quot;:\n  exists &quot;Central nervous system toxoplasmosis Condition&quot;\n    or exists &quot;Central nervous system toxoplasmosis Observation&quot;\ndefine &quot;Central nervous system toxoplasmosis Condition&quot;:\n  Elements.&quot;Central nervous system toxoplasmosis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Central nervous system toxoplasmosis Observation&quot;:\n  Elements.&quot;Central nervous system toxoplasmosis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Central nervous system toxoplasmosis */\n\n/*\n@dataElement: HIV.D.DE342 - HIV encephalopathy\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include HIV encephalopathy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV encephalopathy&quot;:\n  exists &quot;HIV encephalopathy Condition&quot;\n    or exists &quot;HIV encephalopathy Observation&quot;\ndefine &quot;HIV encephalopathy Condition&quot;:\n  Elements.&quot;HIV encephalopathy Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV encephalopathy Observation&quot;:\n  Elements.&quot;HIV encephalopathy Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV encephalopathy */\n\n/*\n@dataElement: HIV.D.DE343 - Extrapulmonary cryptococcosis, including meningitis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include extrapulmonary cryptococcosis, including meningitis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Extrapulmonary cryptococcosis, including meningitis&quot;:\n  exists &quot;Extrapulmonary cryptococcosis, including meningitis Condition&quot;\n    or exists &quot;Extrapulmonary cryptococcosis, including meningitis Observation&quot;\ndefine &quot;Extrapulmonary cryptococcosis, including meningitis Condition&quot;:\n  Elements.&quot;Extrapulmonary cryptococcosis, including meningitis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Extrapulmonary cryptococcosis, including meningitis Observation&quot;:\n  Elements.&quot;Extrapulmonary cryptococcosis, including meningitis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Extrapulmonary cryptococcosis, including meningitis */\n\n/*\n@dataElement: HIV.D.DE344 - Disseminated nontuberculous mycobacterial infection\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include disseminated nontuberculous mycobacterial infection\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Disseminated nontuberculous mycobacterial infection&quot;:\n  exists &quot;Disseminated nontuberculous mycobacterial infection Condition&quot;\n    or exists &quot;Disseminated nontuberculous mycobacterial infection Observation&quot;\ndefine &quot;Disseminated nontuberculous mycobacterial infection Condition&quot;:\n  Elements.&quot;Disseminated nontuberculous mycobacterial infection Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Disseminated nontuberculous mycobacterial infection Observation&quot;:\n  Elements.&quot;Disseminated nontuberculous mycobacterial infection Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Disseminated nontuberculous mycobacterial infection */\n\n/*\n@dataElement: HIV.D.DE345 - Progressive multifocal leukoencephalopathy\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include progressive multifocal leukoencephalopathy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Progressive multifocal leukoencephalopathy&quot;:\n  exists &quot;Progressive multifocal leukoencephalopathy Condition&quot;\n    or exists &quot;Progressive multifocal leukoencephalopathy Observation&quot;\ndefine &quot;Progressive multifocal leukoencephalopathy Condition&quot;:\n  Elements.&quot;Progressive multifocal leukoencephalopathy Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Progressive multifocal leukoencephalopathy Observation&quot;:\n  Elements.&quot;Progressive multifocal leukoencephalopathy Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Progressive multifocal leukoencephalopathy */\n\n/*\n@dataElement: HIV.D.DE346 - Chronic cryptosporidiosis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include chronic cryptosporidiosis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Chronic cryptosporidiosis&quot;:\n  exists &quot;Chronic cryptosporidiosis Condition&quot;\n    or exists &quot;Chronic cryptosporidiosis Observation&quot;\ndefine &quot;Chronic cryptosporidiosis Condition&quot;:\n  Elements.&quot;Chronic cryptosporidiosis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Chronic cryptosporidiosis Observation&quot;:\n  Elements.&quot;Chronic cryptosporidiosis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Chronic cryptosporidiosis */\n\n/*\n@dataElement: HIV.D.DE347 - Chronic cryptosporidiosis with diarrhoea\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include chronic cryptosporidiosis (with diarrhoea)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Chronic cryptosporidiosis with diarrhoea&quot;:\n  exists &quot;Chronic cryptosporidiosis with diarrhoea Condition&quot;\n    or exists &quot;Chronic cryptosporidiosis with diarrhoea Observation&quot;\ndefine &quot;Chronic cryptosporidiosis with diarrhoea Condition&quot;:\n  Elements.&quot;Chronic cryptosporidiosis with diarrhoea Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Chronic cryptosporidiosis with diarrhoea Observation&quot;:\n  Elements.&quot;Chronic cryptosporidiosis with diarrhoea Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Chronic cryptosporidiosis with diarrhoea */\n\n/*\n@dataElement: HIV.D.DE348 - Chronic isosporiasis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include chronic isosporiasis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Chronic isosporiasis&quot;:\n  exists &quot;Chronic isosporiasis Condition&quot;\n    or exists &quot;Chronic isosporiasis Observation&quot;\ndefine &quot;Chronic isosporiasis Condition&quot;:\n  Elements.&quot;Chronic isosporiasis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Chronic isosporiasis Observation&quot;:\n  Elements.&quot;Chronic isosporiasis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Chronic isosporiasis */\n\n/*\n@dataElement: HIV.D.DE349 - Disseminated mycosis extrapulmonary histoplasmosis, coccidioidomycosis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include disseminated mycosis (extrapulmonary histoplasmosis, coccidioidomycosis)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Disseminated mycosis extrapulmonary histoplasmosis, coccidioidomycosis&quot;:\n  exists &quot;Disseminated mycosis extrapulmonary histoplasmosis, coccidioidomycosis Condition&quot;\n    or exists &quot;Disseminated mycosis extrapulmonary histoplasmosis, coccidioidomycosis Observation&quot;\ndefine &quot;Disseminated mycosis extrapulmonary histoplasmosis, coccidioidomycosis Condition&quot;:\n  Elements.&quot;Disseminated mycosis extrapulmonary histoplasmosis, coccidioidomycosis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Disseminated mycosis extrapulmonary histoplasmosis, coccidioidomycosis Observation&quot;:\n  Elements.&quot;Disseminated mycosis extrapulmonary histoplasmosis, coccidioidomycosis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Disseminated mycosis extrapulmonary histoplasmosis, coccidioidomycosis */\n\n/*\n@dataElement: HIV.D.DE350 - Disseminated endemic mycosis extrapulmonary histoplasmosis, coccidioidomycosis, penicilliosis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include disseminated endemic mycosis (extrapulmonary histoplasmosis, coccidioidomycosis, penicilliosis)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Disseminated endemic mycosis extrapulmonary histoplasmosis, coccidioidomycosis, penicilliosis&quot;:\n  exists &quot;Disseminated endemic mycosis extrapulmonary histoplasmosis, coccidioidomycosis, penicilliosis Condition&quot;\n    or exists &quot;Disseminated endemic mycosis extrapulmonary histoplasmosis, coccidioidomycosis, penicilliosis Observation&quot;\ndefine &quot;Disseminated endemic mycosis extrapulmonary histoplasmosis, coccidioidomycosis, penicilliosis Condition&quot;:\n  Elements.&quot;Disseminated endemic mycosis extrapulmonary histoplasmosis, coccidioidomycosis, penicilliosis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Disseminated endemic mycosis extrapulmonary histoplasmosis, coccidioidomycosis, penicilliosis Observation&quot;:\n  Elements.&quot;Disseminated endemic mycosis extrapulmonary histoplasmosis, coccidioidomycosis, penicilliosis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Disseminated endemic mycosis extrapulmonary histoplasmosis, coccidioidomycosis, penicilliosis */\n\n/*\n@dataElement: HIV.D.DE351 - Cerebral lymphoma\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include cerebral lymphoma\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Cerebral lymphoma&quot;:\n  exists &quot;Cerebral lymphoma Condition&quot;\n    or exists &quot;Cerebral lymphoma Observation&quot;\ndefine &quot;Cerebral lymphoma Condition&quot;:\n  Elements.&quot;Cerebral lymphoma Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Cerebral lymphoma Observation&quot;:\n  Elements.&quot;Cerebral lymphoma Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Cerebral lymphoma */\n\n/*\n@dataElement: HIV.D.DE352 - B-cell non-Hodgkin lymphoma\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include b-cell non-Hodgkin lymphoma\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;B-cell non-Hodgkin lymphoma&quot;:\n  exists &quot;B-cell non-Hodgkin lymphoma Condition&quot;\n    or exists &quot;B-cell non-Hodgkin lymphoma Observation&quot;\ndefine &quot;B-cell non-Hodgkin lymphoma Condition&quot;:\n  Elements.&quot;B-cell non-Hodgkin lymphoma Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;B-cell non-Hodgkin lymphoma Observation&quot;:\n  Elements.&quot;B-cell non-Hodgkin lymphoma Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of B-cell non-Hodgkin lymphoma */\n\n/*\n@dataElement: HIV.D.DE353 - HIV-associated nephropathy or cardiomyopathy\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include HIV- associated nephropathy or cardiomyopathy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV-associated nephropathy or cardiomyopathy&quot;:\n  exists &quot;HIV-associated nephropathy or cardiomyopathy Condition&quot;\n    or exists &quot;HIV-associated nephropathy or cardiomyopathy Observation&quot;\ndefine &quot;HIV-associated nephropathy or cardiomyopathy Condition&quot;:\n  Elements.&quot;HIV-associated nephropathy or cardiomyopathy Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV-associated nephropathy or cardiomyopathy Observation&quot;:\n  Elements.&quot;HIV-associated nephropathy or cardiomyopathy Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV-associated nephropathy or cardiomyopathy */\n\n/*\n@dataElement: HIV.D.DE354 - Recurrent septicaemia including nontyphoidal Salmonella\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include recurrent bacteraemia (septicaemia) (including nontyphoidal salmonella)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Recurrent septicaemia including nontyphoidal Salmonella&quot;:\n  exists &quot;Recurrent septicaemia including nontyphoidal Salmonella Condition&quot;\n    or exists &quot;Recurrent septicaemia including nontyphoidal Salmonella Observation&quot;\ndefine &quot;Recurrent septicaemia including nontyphoidal Salmonella Condition&quot;:\n  Elements.&quot;Recurrent septicaemia including nontyphoidal Salmonella Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Recurrent septicaemia including nontyphoidal Salmonella Observation&quot;:\n  Elements.&quot;Recurrent septicaemia including nontyphoidal Salmonella Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Recurrent septicaemia including nontyphoidal Salmonella */\n\n/*\n@dataElement: HIV.D.DE355 - Invasive cervical carcinoma\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include invasive cervical carcinoma\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Invasive cervical carcinoma&quot;:\n  exists &quot;Invasive cervical carcinoma Condition&quot;\n    or exists &quot;Invasive cervical carcinoma Observation&quot;\ndefine &quot;Invasive cervical carcinoma Condition&quot;:\n  Elements.&quot;Invasive cervical carcinoma Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Invasive cervical carcinoma Observation&quot;:\n  Elements.&quot;Invasive cervical carcinoma Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Invasive cervical carcinoma */\n\n/*\n@dataElement: HIV.D.DE356 - Atypical disseminated leishmaniasis\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include atypical disseminated leishmaniasis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Atypical disseminated leishmaniasis&quot;:\n  exists &quot;Atypical disseminated leishmaniasis Condition&quot;\n    or exists &quot;Atypical disseminated leishmaniasis Observation&quot;\ndefine &quot;Atypical disseminated leishmaniasis Condition&quot;:\n  Elements.&quot;Atypical disseminated leishmaniasis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Atypical disseminated leishmaniasis Observation&quot;:\n  Elements.&quot;Atypical disseminated leishmaniasis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Atypical disseminated leishmaniasis */\n\n/*\n@dataElement: HIV.D.DE357 - Neutropenia\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include neutropenia, an abnormally low count of a type of white blood cell (neutrophils)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Neutropenia&quot;:\n  exists &quot;Neutropenia Condition&quot;\n    or exists &quot;Neutropenia Observation&quot;\ndefine &quot;Neutropenia Condition&quot;:\n  Elements.&quot;Neutropenia Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Neutropenia Observation&quot;:\n  Elements.&quot;Neutropenia Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Neutropenia */\n\n/*\n@dataElement: HIV.D.DE364 - CD4 count\n@activity: HIV.D20 Diagnostics\n@description: CD4 cell count in cells/mm^3\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;CD4 count D.DE364&quot;:\n  Elements.&quot;CD4 count D.DE364&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;CD4 count D.DE364 Value&quot;:\n  &quot;CD4 count D.DE364&quot; O\n  return O.value\n/* End of CD4 count D.DE364 */\n\n/*\n@dataElement: HIV.D.DE387 - Viral load test result\n@activity: HIV.D20 Diagnostics\n@description: Result from the viral load test in number of copies/mL\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Viral load test result D.DE387&quot;:\n  Elements.&quot;Viral load test result D.DE387&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Viral load test result D.DE387 Value&quot;:\n  &quot;Viral load test result D.DE387&quot; O\n  return O.value\n/* End of Viral load test result D.DE387 */\n\n/*\n@dataElement: HIV.D.DE391 - Reason for HIV viral load test\n@activity: HIV.D20 Diagnostics\n@description: Whether the viral load is being tested for routine monitoring on a set schedule or for targeted monitoring for suspected treatment failure\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reason for HIV viral load test&quot;:\n  exists &quot;Reason for HIV viral load test Observation&quot;\ndefine &quot;Reason for HIV viral load test Observation&quot;:\n  Elements.&quot;Reason for HIV viral load test Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reason for HIV viral load test */\n\n/*\n@dataElement: HIV.D.DE392 - Routine viral load test\n@activity: HIV.D20 Diagnostics\n@description: Routine refers to viral load tests obtained at standard intervals following ART initiation to monitor viral load response to ART\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Routine viral load test&quot;:\n  exists &quot;Routine viral load test Condition&quot;\n    or exists &quot;Routine viral load test Observation&quot;\ndefine &quot;Routine viral load test Condition&quot;:\n  Elements.&quot;Routine viral load test Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Routine viral load test Observation&quot;:\n  Elements.&quot;Routine viral load test Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Routine viral load test */\n\n/*\n@dataElement: HIV.D.DE393 - Targeted viral load monitoring\n@activity: HIV.D20 Diagnostics\n@description: Targeted refers to viral load tests obtained based on a specific clinical indication (such as concern about disease progression or failure to respond to ART)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Targeted viral load monitoring&quot;:\n  exists &quot;Targeted viral load monitoring Condition&quot;\n    or exists &quot;Targeted viral load monitoring Observation&quot;\ndefine &quot;Targeted viral load monitoring Condition&quot;:\n  Elements.&quot;Targeted viral load monitoring Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Targeted viral load monitoring Observation&quot;:\n  Elements.&quot;Targeted viral load monitoring Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Targeted viral load monitoring */\n\n/*\n@dataElement: HIV.D.DE394 - Initial viral load test\n@activity: HIV.D20 Diagnostics\n@description: The first viral load test of the client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Initial viral load test&quot;:\n  exists &quot;Initial viral load test Condition&quot;\n    or exists &quot;Initial viral load test Observation&quot;\ndefine &quot;Initial viral load test Condition&quot;:\n  Elements.&quot;Initial viral load test Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Initial viral load test Observation&quot;:\n  Elements.&quot;Initial viral load test Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Initial viral load test */\n\n/*\n@dataElement: HIV.D.DE395 - Follow-up viral load test after receiving enhanced adherence counselling\n@activity: HIV.D20 Diagnostics\n@description: A follow-up viral load test within 3-6 months after enhanced adherence counselling after client received a high viral load test result\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Follow-up viral load test after receiving enhanced adherence counselling&quot;:\n  exists &quot;Follow-up viral load test after receiving enhanced adherence counselling Condition&quot;\n    or exists &quot;Follow-up viral load test after receiving enhanced adherence counselling Observation&quot;\ndefine &quot;Follow-up viral load test after receiving enhanced adherence counselling Condition&quot;:\n  Elements.&quot;Follow-up viral load test after receiving enhanced adherence counselling Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Follow-up viral load test after receiving enhanced adherence counselling Observation&quot;:\n  Elements.&quot;Follow-up viral load test after receiving enhanced adherence counselling Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Follow-up viral load test after receiving enhanced adherence counselling */\n\n/*\n@dataElement: HIV.D.DE399 - Monitoring examinations\n@activity: HIV.D20 Diagnostics\n@description: Name of examinations, test and results for any relevant investigations carried out for client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Monitoring examinations&quot;:\n  exists &quot;Monitoring examinations Observation&quot;\ndefine &quot;Monitoring examinations Observation&quot;:\n  Elements.&quot;Monitoring examinations Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Monitoring examinations */\n\n/*\n@dataElement: HIV.D.DE400 - Haemoglobin Hb\n@activity: HIV.D20 Diagnostics\n@description: Provider ordered a Haemoglobin (Hb) test, number in g/dL test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Haemoglobin Hb&quot;:\n  exists &quot;Haemoglobin Hb Condition&quot;\n    or exists &quot;Haemoglobin Hb Observation&quot;\ndefine &quot;Haemoglobin Hb Condition&quot;:\n  Elements.&quot;Haemoglobin Hb Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Haemoglobin Hb Observation&quot;:\n  Elements.&quot;Haemoglobin Hb Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Haemoglobin Hb */\n\n/*\n@dataElement: HIV.D.DE401 - Pregnancy test\n@activity: HIV.D20 Diagnostics\n@description: Provider ordered a pregnancy test for client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Pregnancy test&quot;:\n  exists &quot;Pregnancy test Condition&quot;\n    or exists &quot;Pregnancy test Observation&quot;\ndefine &quot;Pregnancy test Condition&quot;:\n  Elements.&quot;Pregnancy test Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Pregnancy test Observation&quot;:\n  Elements.&quot;Pregnancy test Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Pregnancy test */\n\n/*\n@dataElement: HIV.D.DE402 - Syphilis test\n@activity: HIV.D20 Diagnostics\n@description: Provider ordered a syphilis test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Syphilis test&quot;:\n  exists &quot;Syphilis test Condition&quot;\n    or exists &quot;Syphilis test Observation&quot;\ndefine &quot;Syphilis test Condition&quot;:\n  Elements.&quot;Syphilis test Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Syphilis test Observation&quot;:\n  Elements.&quot;Syphilis test Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Syphilis test */\n\n/*\n@dataElement: HIV.D.DE403 - Chest X-ray CXR\n@activity: HIV.D20 Diagnostics\n@description: Provider ordered a chest X-ray (CXR)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Chest X-ray CXR&quot;:\n  exists &quot;Chest X-ray CXR Condition&quot;\n    or exists &quot;Chest X-ray CXR Observation&quot;\ndefine &quot;Chest X-ray CXR Condition&quot;:\n  Elements.&quot;Chest X-ray CXR Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Chest X-ray CXR Observation&quot;:\n  Elements.&quot;Chest X-ray CXR Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Chest X-ray CXR */\n\n/*\n@dataElement: HIV.D.DE404 - Sputum or culture for TB\n@activity: HIV.D20 Diagnostics\n@description: Provider ordered sputum or culture for TB\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Sputum or culture for TB&quot;:\n  exists &quot;Sputum or culture for TB Condition&quot;\n    or exists &quot;Sputum or culture for TB Observation&quot;\ndefine &quot;Sputum or culture for TB Condition&quot;:\n  Elements.&quot;Sputum or culture for TB Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Sputum or culture for TB Observation&quot;:\n  Elements.&quot;Sputum or culture for TB Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Sputum or culture for TB */\n\n/*\n@dataElement: HIV.D.DE405 - HBsAg test HBV\n@activity: HIV.D20 Diagnostics\n@description: Provider ordered an HBsAg test (HBV) test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HBsAg test HBV&quot;:\n  exists &quot;HBsAg test HBV Condition&quot;\n    or exists &quot;HBsAg test HBV Observation&quot;\ndefine &quot;HBsAg test HBV Condition&quot;:\n  Elements.&quot;HBsAg test HBV Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HBsAg test HBV Observation&quot;:\n  Elements.&quot;HBsAg test HBV Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HBsAg test HBV */\n\n/*\n@dataElement: HIV.D.DE406 - HIV viral load test ordered\n@activity: HIV.D20 Diagnostics\n@description: Provider ordered an HIV viral load test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV viral load test ordered&quot;:\n  exists &quot;HIV viral load test ordered Condition&quot;\n    or exists &quot;HIV viral load test ordered Observation&quot;\ndefine &quot;HIV viral load test ordered Condition&quot;:\n  Elements.&quot;HIV viral load test ordered Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV viral load test ordered Observation&quot;:\n  Elements.&quot;HIV viral load test ordered Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV viral load test ordered */\n\n/*\n@dataElement: HIV.D.DE407 - HIV viral load test scheduled\n@activity: HIV.D20 Diagnostics\n@description: Scheduled an HIV viral load test with client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV viral load test scheduled&quot;:\n  exists &quot;HIV viral load test scheduled Condition&quot;\n    or exists &quot;HIV viral load test scheduled Observation&quot;\ndefine &quot;HIV viral load test scheduled Condition&quot;:\n  Elements.&quot;HIV viral load test scheduled Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HIV viral load test scheduled Observation&quot;:\n  Elements.&quot;HIV viral load test scheduled Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV viral load test scheduled */\n\n/*\n@dataElement: HIV.D.DE408 - CD4 count ordered\n@activity: HIV.D20 Diagnostics\n@description: Provider ordered a CD4 cell count\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;CD4 count ordered&quot;:\n  exists &quot;CD4 count ordered Condition&quot;\n    or exists &quot;CD4 count ordered Observation&quot;\ndefine &quot;CD4 count ordered Condition&quot;:\n  Elements.&quot;CD4 count ordered Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;CD4 count ordered Observation&quot;:\n  Elements.&quot;CD4 count ordered Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of CD4 count ordered */\n\n/*\n@dataElement: HIV.D.DE409 - CD4 count test scheduled\n@activity: HIV.D20 Diagnostics\n@description: Scheduled a CD4 test with client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;CD4 count test scheduled&quot;:\n  exists &quot;CD4 count test scheduled Condition&quot;\n    or exists &quot;CD4 count test scheduled Observation&quot;\ndefine &quot;CD4 count test scheduled Condition&quot;:\n  Elements.&quot;CD4 count test scheduled Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;CD4 count test scheduled Observation&quot;:\n  Elements.&quot;CD4 count test scheduled Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of CD4 count test scheduled */\n\n/*\n@dataElement: HIV.D.DE410 - Cryptococcal antigen test\n@activity: HIV.D20 Diagnostics\n@description: Provider ordered a cryptococcal antigen test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Cryptococcal antigen test&quot;:\n  exists &quot;Cryptococcal antigen test Condition&quot;\n    or exists &quot;Cryptococcal antigen test Observation&quot;\ndefine &quot;Cryptococcal antigen test Condition&quot;:\n  Elements.&quot;Cryptococcal antigen test Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Cryptococcal antigen test Observation&quot;:\n  Elements.&quot;Cryptococcal antigen test Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Cryptococcal antigen test */\n\n/*\n@dataElement: HIV.D.DE411 - Histoplasmosis antigen test\n@activity: HIV.D20 Diagnostics\n@description: Provider ordered a histoplasmosis antigen test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Histoplasmosis antigen test&quot;:\n  exists &quot;Histoplasmosis antigen test Condition&quot;\n    or exists &quot;Histoplasmosis antigen test Observation&quot;\ndefine &quot;Histoplasmosis antigen test Condition&quot;:\n  Elements.&quot;Histoplasmosis antigen test Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Histoplasmosis antigen test Observation&quot;:\n  Elements.&quot;Histoplasmosis antigen test Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Histoplasmosis antigen test */\n\n/*\n@dataElement: HIV.D.DE412 - Cervical cancer screening scheduled\n@activity: HIV.D28 Offer other services\n@description: Scheduled cervical cancer screening with client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Cervical cancer screening scheduled&quot;:\n  exists &quot;Cervical cancer screening scheduled Condition&quot;\n    or exists &quot;Cervical cancer screening scheduled Observation&quot;\ndefine &quot;Cervical cancer screening scheduled Condition&quot;:\n  Elements.&quot;Cervical cancer screening scheduled Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Cervical cancer screening scheduled Observation&quot;:\n  Elements.&quot;Cervical cancer screening scheduled Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Cervical cancer screening scheduled */\n\n/*\n@dataElement: HIV.D.DE413 - Date of scheduled monitoring examination\n@activity: HIV.D28 Offer other services\n@description: Date of scheduled monitoring examination\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date of scheduled monitoring examination&quot;:\n  Elements.&quot;Date of scheduled monitoring examination&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Date of scheduled monitoring examination Value&quot;:\n  &quot;Date of scheduled monitoring examination&quot; O\n  return O.value\n/* End of Date of scheduled monitoring examination */\n\n/*\n@dataElement: HIV.D.DE427 - Switch to second-line ART regimen recommended\n@activity: HIV.D21 Determine regimen and treatment options\n@description: A switch to second-line ART regimen is recommended\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Switch to second-line ART regimen recommended&quot;:\n  exists &quot;Switch to second-line ART regimen recommended Observation&quot;\ndefine &quot;Switch to second-line ART regimen recommended Observation&quot;:\n  Elements.&quot;Switch to second-line ART regimen recommended Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Switch to second-line ART regimen recommended */\n\n/*\n@dataElement: HIV.D.DE436 - Regimen substitution recommended\n@activity: HIV.D23 Prescribe\n@description: A drug substitution is recommended\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Regimen substitution recommended&quot;:\n  exists &quot;Regimen substitution recommended Observation&quot;\ndefine &quot;Regimen substitution recommended Observation&quot;:\n  Elements.&quot;Regimen substitution recommended Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Regimen substitution recommended */\n\n/*\n@dataElement: HIV.D.DE437 - Dose adjustment recommended\n@activity: HIV.D23 Prescribe\n@description: A dosage change is recommended\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Dose adjustment recommended&quot;:\n  exists &quot;Dose adjustment recommended Observation&quot;\ndefine &quot;Dose adjustment recommended Observation&quot;:\n  Elements.&quot;Dose adjustment recommended Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Dose adjustment recommended */\n\n/*\n@dataElement: HIV.D.DE443 - Suspicion of treatment failure or interruption\n@activity: HIV.D23 Prescribe\n@description: Client has been on ART, but has stopped taking it or a treatment failure is suspected\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Suspicion of treatment failure or interruption&quot;:\n  exists &quot;Suspicion of treatment failure or interruption Observation&quot;\ndefine &quot;Suspicion of treatment failure or interruption Observation&quot;:\n  Elements.&quot;Suspicion of treatment failure or interruption Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Suspicion of treatment failure or interruption */\n\n/*\n@dataElement: HIV.D.DE465 - Adherence counselling provided\n@activity: HIV.D24 Counsel\n@description: Counselling was carried out during visit\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Adherence counselling provided D.DE465&quot;:\n  exists &quot;Adherence counselling provided D.DE465 Observation&quot;\ndefine &quot;Adherence counselling provided D.DE465 Observation&quot;:\n  Elements.&quot;Adherence counselling provided D.DE465 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Adherence counselling provided D.DE465 */\n\n/*\n@dataElement: HIV.D.DE496 - Enhanced adherence counselling provided\n@activity: HIV.D24 Counsel\n@description: Enhanced adherence counselling was provided to the client during the visit\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Enhanced adherence counselling provided&quot;:\n  exists &quot;Enhanced adherence counselling provided Observation&quot;\ndefine &quot;Enhanced adherence counselling provided Observation&quot;:\n  Elements.&quot;Enhanced adherence counselling provided Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Enhanced adherence counselling provided */\n\n/*\n@dataElement: HIV.D.DE507 - Counselling provided on diagnoses\n@activity: HIV.D24 Counsel\n@description: Counselling provided on diagnoses\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Counselling provided on diagnoses&quot;:\n  exists &quot;Counselling provided on diagnoses Observation&quot;\ndefine &quot;Counselling provided on diagnoses Observation&quot;:\n  Elements.&quot;Counselling provided on diagnoses Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Counselling provided on diagnoses */\n\n/*\n@dataElement: HIV.D.DE510 - Syphilis counselling and treatment\n@activity: HIV.D24 Counsel\n@description: Whether counselling and treatment was provided to a client who has been diagnosed with syphilis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Syphilis counselling and treatment&quot;:\n  exists &quot;Syphilis counselling and treatment Observation&quot;\ndefine &quot;Syphilis counselling and treatment Observation&quot;:\n  Elements.&quot;Syphilis counselling and treatment Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Syphilis counselling and treatment */\n\n/*\n@dataElement: HIV.D.DE519 - Other support services\n@activity: HIV.D28 Offer other services\n@description: Offer or refer for other support services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other support services D.DE519&quot;:\n  exists &quot;Other support services D.DE519 Observation&quot;\ndefine &quot;Other support services D.DE519 Observation&quot;:\n  Elements.&quot;Other support services D.DE519 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other support services D.DE519 */\n\n/*\n@dataElement: HIV.D.DE520 - Mental health services\n@activity: HIV.D28 Offer other services\n@description: Offer or refer for mental health services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Mental health services D.DE520&quot;:\n  exists &quot;Mental health services D.DE520 Condition&quot;\n    or exists &quot;Mental health services D.DE520 Observation&quot;\ndefine &quot;Mental health services D.DE520 Condition&quot;:\n  Elements.&quot;Mental health services D.DE520 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Mental health services D.DE520 Observation&quot;:\n  Elements.&quot;Mental health services D.DE520 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Mental health services D.DE520 */\n\n/*\n@dataElement: HIV.D.DE521 - Psychosocial counselling, support and treatment adherence counselling\n@activity: HIV.D28 Offer other services\n@description: Offer or refer for psychosocial counselling, support and treatment adherence counselling\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Psychosocial counselling, support and treatment adherence counselling D.DE521&quot;:\n  exists &quot;Psychosocial counselling, support and treatment adherence counselling D.DE521 Condition&quot;\n    or exists &quot;Psychosocial counselling, support and treatment adherence counselling D.DE521 Observation&quot;\ndefine &quot;Psychosocial counselling, support and treatment adherence counselling D.DE521 Condition&quot;:\n  Elements.&quot;Psychosocial counselling, support and treatment adherence counselling D.DE521 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Psychosocial counselling, support and treatment adherence counselling D.DE521 Observation&quot;:\n  Elements.&quot;Psychosocial counselling, support and treatment adherence counselling D.DE521 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Psychosocial counselling, support and treatment adherence counselling D.DE521 */\n\n/*\n@dataElement: HIV.D.DE522 - Legal and social services\n@activity: HIV.D28 Offer other services\n@description: Offer or refer for legal and social services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Legal and social services D.DE522&quot;:\n  exists &quot;Legal and social services D.DE522 Condition&quot;\n    or exists &quot;Legal and social services D.DE522 Observation&quot;\ndefine &quot;Legal and social services D.DE522 Condition&quot;:\n  Elements.&quot;Legal and social services D.DE522 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Legal and social services D.DE522 Observation&quot;:\n  Elements.&quot;Legal and social services D.DE522 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Legal and social services D.DE522 */\n\n/*\n@dataElement: HIV.D.DE523 - Services for responding to violence against women\n@activity: HIV.D28 Offer other services\n@description: Offer or refer for services for responding to violence against women, including first-line support and psychosocial support, post-rape care and other support services including shelters, legal services and women and child protection services\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Services for responding to violence against women D.DE523&quot;:\n  exists &quot;Services for responding to violence against women D.DE523 Condition&quot;\n    or exists &quot;Services for responding to violence against women D.DE523 Observation&quot;\ndefine &quot;Services for responding to violence against women D.DE523 Condition&quot;:\n  Elements.&quot;Services for responding to violence against women D.DE523 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Services for responding to violence against women D.DE523 Observation&quot;:\n  Elements.&quot;Services for responding to violence against women D.DE523 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Services for responding to violence against women D.DE523 */\n\n/*\n@dataElement: HIV.D.DE524 - Date/time of follow-up appointment\n@activity: HIV.D29 Schedule follow-up\n@description: Date the client is to return for monitoring, re-supply or any other reason\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date/time of follow-up appointment D.DE524&quot;:\n  Elements.&quot;Date/time of follow-up appointment D.DE524&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Date/time of follow-up appointment D.DE524 Value&quot;:\n  &quot;Date/time of follow-up appointment D.DE524&quot; O\n  return O.value\n/* End of Date/time of follow-up appointment D.DE524 */\n\n/*\n@dataElement: HIV.D.DE525 - Type of follow-up appointment\n@activity: HIV.D29 Schedule follow-up\n@description: Whether the visit will be clinical only, ARV drug pick-up or other. Client may have multiple follow-ups scheduled.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Type of follow-up appointment D.DE525&quot;:\n  exists &quot;Type of follow-up appointment D.DE525 Observation&quot;\ndefine &quot;Type of follow-up appointment D.DE525 Observation&quot;:\n  Elements.&quot;Type of follow-up appointment D.DE525 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Type of follow-up appointment D.DE525 */\n\n/*\n@dataElement: HIV.D.DE526 - Clinical visit\n@activity: HIV.D29 Schedule follow-up\n@description: Appointment for clinical care by a provider\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Clinical visit D.DE526&quot;:\n  exists &quot;Clinical visit D.DE526 Condition&quot;\n    or exists &quot;Clinical visit D.DE526 Observation&quot;\ndefine &quot;Clinical visit D.DE526 Condition&quot;:\n  Elements.&quot;Clinical visit D.DE526 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Clinical visit D.DE526 Observation&quot;:\n  Elements.&quot;Clinical visit D.DE526 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Clinical visit D.DE526 */\n\n/*\n@dataElement: HIV.D.DE527 - Antiretroviral drug pick up\n@activity: HIV.D29 Schedule follow-up\n@description: Appointment for a drug pick up\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Antiretroviral drug pick up&quot;:\n  exists &quot;Antiretroviral drug pick up Condition&quot;\n    or exists &quot;Antiretroviral drug pick up Observation&quot;\ndefine &quot;Antiretroviral drug pick up Condition&quot;:\n  Elements.&quot;Antiretroviral drug pick up Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Antiretroviral drug pick up Observation&quot;:\n  Elements.&quot;Antiretroviral drug pick up Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Antiretroviral drug pick up */\n\n/*\n@dataElement: HIV.D.DE528 - Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer\n@activity: HIV.D29 Schedule follow-up\n@description: Appointment for a post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE528&quot;:\n  exists &quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE528 Condition&quot;\n    or exists &quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE528 Observation&quot;\ndefine &quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE528 Condition&quot;:\n  Elements.&quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE528 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE528 Observation&quot;:\n  Elements.&quot;Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE528 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Post-treatment follow-up visit for cervical precancer lesions or invasive cervical cancer D.DE528 */\n\n/*\n@dataElement: HIV.D.DE529 - Other\n@activity: HIV.D29 Schedule follow-up\n@description: Other reason for the follow-up appointment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other D.DE529&quot;:\n  exists &quot;Other D.DE529 Condition&quot;\n    or exists &quot;Other D.DE529 Observation&quot;\ndefine &quot;Other D.DE529 Condition&quot;:\n  Elements.&quot;Other D.DE529 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other D.DE529 Observation&quot;:\n  Elements.&quot;Other D.DE529 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other D.DE529 */\n\n/*\n@dataElement: HIV.D.DE531 - Follow-up test recommended date\n@activity: HIV.D29 Schedule follow-up\n@description: A test or screening recommended for the client's care plan at a future date\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Follow-up test recommended date&quot;:\n  Elements.&quot;Follow-up test recommended date&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Follow-up test recommended date Value&quot;:\n  &quot;Follow-up test recommended date&quot; O\n  return O.value\n/* End of Follow-up test recommended date */\n\n/*\n@dataElement: HIV.D.DE537 - Current medications\n@activity: HIV.D8 Capture or update client history\n@description: List of all of the medications the client is currently taking\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Current medications&quot;:\n  exists &quot;Current medications Observation&quot;\ndefine &quot;Current medications Observation&quot;:\n  Elements.&quot;Current medications Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Current medications */\n\n/*\n@dataElement: HIV.D.DE538 - No medications\n@activity: HIV.D8 Capture or update client history\n@description: The client is currently not on any medications\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;No medications&quot;:\n  exists &quot;No medications Condition&quot;\n    or exists &quot;No medications Observation&quot;\ndefine &quot;No medications Condition&quot;:\n  Elements.&quot;No medications Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;No medications Observation&quot;:\n  Elements.&quot;No medications Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of No medications */\n\n/*\n@dataElement: HIV.D.DE539 - Dont know of any current medications\n@activity: HIV.D8 Capture or update client history\n@description: The client does not know if she is on any medications\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Dont know of any current medications&quot;:\n  exists &quot;Dont know of any current medications Condition&quot;\n    or exists &quot;Dont know of any current medications Observation&quot;\ndefine &quot;Dont know of any current medications Condition&quot;:\n  Elements.&quot;Dont know of any current medications Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Dont know of any current medications Observation&quot;:\n  Elements.&quot;Dont know of any current medications Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Dont know of any current medications */\n\n/*\n@dataElement: HIV.D.DE540 - Analgesic\n@activity: HIV.D8 Capture or update client history\n@description: Analgesic medication (painkiller)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Analgesic&quot;:\n  exists &quot;Analgesic Condition&quot;\n    or exists &quot;Analgesic Observation&quot;\ndefine &quot;Analgesic Condition&quot;:\n  Elements.&quot;Analgesic Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Analgesic Observation&quot;:\n  Elements.&quot;Analgesic Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Analgesic */\n\n/*\n@dataElement: HIV.D.DE541 - Antacids\n@activity: HIV.D8 Capture or update client history\n@description: Antacids\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Antacids&quot;:\n  exists &quot;Antacids Condition&quot;\n    or exists &quot;Antacids Observation&quot;\ndefine &quot;Antacids Condition&quot;:\n  Elements.&quot;Antacids Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Antacids Observation&quot;:\n  Elements.&quot;Antacids Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Antacids */\n\n/*\n@dataElement: HIV.D.DE542 - Antibiotics broad-spectrum\n@activity: HIV.D8 Capture or update client history\n@description: Client is currently taking broad-spectrum antibiotics\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Antibiotics broad-spectrum&quot;:\n  exists &quot;Antibiotics broad-spectrum Condition&quot;\n    or exists &quot;Antibiotics broad-spectrum Observation&quot;\ndefine &quot;Antibiotics broad-spectrum Condition&quot;:\n  Elements.&quot;Antibiotics broad-spectrum Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Antibiotics broad-spectrum Observation&quot;:\n  Elements.&quot;Antibiotics broad-spectrum Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Antibiotics broad-spectrum */\n\n/*\n@dataElement: HIV.D.DE543 - Anticonvulsive\n@activity: HIV.D8 Capture or update client history\n@description: Anticonvulsive medication\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Anticonvulsive&quot;:\n  exists &quot;Anticonvulsive Condition&quot;\n    or exists &quot;Anticonvulsive Observation&quot;\ndefine &quot;Anticonvulsive Condition&quot;:\n  Elements.&quot;Anticonvulsive Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Anticonvulsive Observation&quot;:\n  Elements.&quot;Anticonvulsive Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Anticonvulsive */\n\n/*\n@dataElement: HIV.D.DE544 - Antidiabetic\n@activity: HIV.D8 Capture or update client history\n@description: Antidiabetic medication\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Antidiabetic&quot;:\n  exists &quot;Antidiabetic Condition&quot;\n    or exists &quot;Antidiabetic Observation&quot;\ndefine &quot;Antidiabetic Condition&quot;:\n  Elements.&quot;Antidiabetic Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Antidiabetic Observation&quot;:\n  Elements.&quot;Antidiabetic Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Antidiabetic */\n\n/*\n@dataElement: HIV.D.DE545 - Antifungals\n@activity: HIV.D8 Capture or update client history\n@description: Client is currently taking antifungals\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Antifungals&quot;:\n  exists &quot;Antifungals Condition&quot;\n    or exists &quot;Antifungals Observation&quot;\ndefine &quot;Antifungals Condition&quot;:\n  Elements.&quot;Antifungals Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Antifungals Observation&quot;:\n  Elements.&quot;Antifungals Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Antifungals */\n\n/*\n@dataElement: HIV.D.DE546 - Antihelmintic\n@activity: HIV.D8 Capture or update client history\n@description: Antihelmintic or antiparasitic medication\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Antihelmintic&quot;:\n  exists &quot;Antihelmintic Condition&quot;\n    or exists &quot;Antihelmintic Observation&quot;\ndefine &quot;Antihelmintic Condition&quot;:\n  Elements.&quot;Antihelmintic Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Antihelmintic Observation&quot;:\n  Elements.&quot;Antihelmintic Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Antihelmintic */\n\n/*\n@dataElement: HIV.D.DE547 - Antihypertensive\n@activity: HIV.D8 Capture or update client history\n@description: Antihypertensive medication\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Antihypertensive&quot;:\n  exists &quot;Antihypertensive Condition&quot;\n    or exists &quot;Antihypertensive Observation&quot;\ndefine &quot;Antihypertensive Condition&quot;:\n  Elements.&quot;Antihypertensive Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Antihypertensive Observation&quot;:\n  Elements.&quot;Antihypertensive Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Antihypertensive */\n\n/*\n@dataElement: HIV.D.DE548 - Antimalarials\n@activity: HIV.D8 Capture or update client history\n@description: Antimalarial medication\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Antimalarials&quot;:\n  exists &quot;Antimalarials Condition&quot;\n    or exists &quot;Antimalarials Observation&quot;\ndefine &quot;Antimalarials Condition&quot;:\n  Elements.&quot;Antimalarials Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Antimalarials Observation&quot;:\n  Elements.&quot;Antimalarials Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Antimalarials */\n\n/*\n@dataElement: HIV.D.DE549 - Antiretrovirals ARVs\n@activity: HIV.D8 Capture or update client history\n@description: Antiretrovirals (ARVs)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Antiretrovirals ARVs&quot;:\n  exists &quot;Antiretrovirals ARVs Condition&quot;\n    or exists &quot;Antiretrovirals ARVs Observation&quot;\ndefine &quot;Antiretrovirals ARVs Condition&quot;:\n  Elements.&quot;Antiretrovirals ARVs Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Antiretrovirals ARVs Observation&quot;:\n  Elements.&quot;Antiretrovirals ARVs Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Antiretrovirals ARVs */\n\n/*\n@dataElement: HIV.D.DE550 - Antiparasitics\n@activity: HIV.D8 Capture or update client history\n@description: Client is currently taking antiparasitics\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Antiparasitics&quot;:\n  exists &quot;Antiparasitics Condition&quot;\n    or exists &quot;Antiparasitics Observation&quot;\ndefine &quot;Antiparasitics Condition&quot;:\n  Elements.&quot;Antiparasitics Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Antiparasitics Observation&quot;:\n  Elements.&quot;Antiparasitics Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Antiparasitics */\n\n/*\n@dataElement: HIV.D.DE551 - Antivirals\n@activity: HIV.D8 Capture or update client history\n@description: Antiviral medication\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Antivirals&quot;:\n  exists &quot;Antivirals Condition&quot;\n    or exists &quot;Antivirals Observation&quot;\ndefine &quot;Antivirals Condition&quot;:\n  Elements.&quot;Antivirals Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Antivirals Observation&quot;:\n  Elements.&quot;Antivirals Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Antivirals */\n\n/*\n@dataElement: HIV.D.DE552 - Buprenorphine\n@activity: HIV.D8 Capture or update client history\n@description: Opioid substitution to treat opioid dependence\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Buprenorphine D.DE552&quot;:\n  exists &quot;Buprenorphine D.DE552 Condition&quot;\n    or exists &quot;Buprenorphine D.DE552 Observation&quot;\ndefine &quot;Buprenorphine D.DE552 Condition&quot;:\n  Elements.&quot;Buprenorphine D.DE552 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Buprenorphine D.DE552 Observation&quot;:\n  Elements.&quot;Buprenorphine D.DE552 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Buprenorphine D.DE552 */\n\n/*\n@dataElement: HIV.D.DE553 - Co-trimoxazole preventive therapy CPT\n@activity: HIV.D8 Capture or update client history\n@description: Combination of two antimicrobial drugs (sulfamethoxazole and trimethoprim) that covers a variety of bacterial, fungal and protozoan infections\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Co-trimoxazole preventive therapy CPT&quot;:\n  exists &quot;Co-trimoxazole preventive therapy CPT Condition&quot;\n    or exists &quot;Co-trimoxazole preventive therapy CPT Observation&quot;\ndefine &quot;Co-trimoxazole preventive therapy CPT Condition&quot;:\n  Elements.&quot;Co-trimoxazole preventive therapy CPT Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Co-trimoxazole preventive therapy CPT Observation&quot;:\n  Elements.&quot;Co-trimoxazole preventive therapy CPT Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Co-trimoxazole preventive therapy CPT */\n\n/*\n@dataElement: HIV.D.DE554 - Hormonal family planning method\n@activity: HIV.D8 Capture or update client history\n@description: Hormonal family planning method\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Hormonal family planning method&quot;:\n  exists &quot;Hormonal family planning method Condition&quot;\n    or exists &quot;Hormonal family planning method Observation&quot;\ndefine &quot;Hormonal family planning method Condition&quot;:\n  Elements.&quot;Hormonal family planning method Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Hormonal family planning method Observation&quot;:\n  Elements.&quot;Hormonal family planning method Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Hormonal family planning method */\n\n/*\n@dataElement: HIV.D.DE555 - Methadone\n@activity: HIV.D8 Capture or update client history\n@description: Opioid substitution to treat opioid dependence\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Methadone D.DE555&quot;:\n  exists &quot;Methadone D.DE555 Condition&quot;\n    or exists &quot;Methadone D.DE555 Observation&quot;\ndefine &quot;Methadone D.DE555 Condition&quot;:\n  Elements.&quot;Methadone D.DE555 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Methadone D.DE555 Observation&quot;:\n  Elements.&quot;Methadone D.DE555 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Methadone D.DE555 */\n\n/*\n@dataElement: HIV.D.DE556 - PrEP to prevent HIV\n@activity: HIV.D8 Capture or update client history\n@description: Pre-exposure prophylaxis (PrEP) medication for preventing the acquisition of HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;PrEP to prevent HIV&quot;:\n  exists &quot;PrEP to prevent HIV Condition&quot;\n    or exists &quot;PrEP to prevent HIV Observation&quot;\ndefine &quot;PrEP to prevent HIV Condition&quot;:\n  Elements.&quot;PrEP to prevent HIV Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;PrEP to prevent HIV Observation&quot;:\n  Elements.&quot;PrEP to prevent HIV Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of PrEP to prevent HIV */\n\n/*\n@dataElement: HIV.D.DE557 - Other antibiotics\n@activity: HIV.D8 Capture or update client history\n@description: Other antibiotics not listed above\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other antibiotics&quot;:\n  exists &quot;Other antibiotics Condition&quot;\n    or exists &quot;Other antibiotics Observation&quot;\ndefine &quot;Other antibiotics Condition&quot;:\n  Elements.&quot;Other antibiotics Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other antibiotics Observation&quot;:\n  Elements.&quot;Other antibiotics Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other antibiotics */\n\n/*\n@dataElement: HIV.D.DE558 - Other medications\n@activity: HIV.D8 Capture or update client history\n@description: Other medications or supplements that are not listed above\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other medications&quot;:\n  exists &quot;Other medications Condition&quot;\n    or exists &quot;Other medications Observation&quot;\ndefine &quot;Other medications Condition&quot;:\n  Elements.&quot;Other medications Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other medications Observation&quot;:\n  Elements.&quot;Other medications Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other medications */\n\n/*\n@dataElement: HIV.D.DE656 - Date of cervical cancer screening test\n@activity: HIV.D28 Offer other services\n@description: Date of cervical cancer screening test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date of cervical cancer screening test&quot;:\n  Elements.&quot;Date of cervical cancer screening test&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Date of cervical cancer screening test Value&quot;:\n  &quot;Date of cervical cancer screening test&quot; O\n  return O.value\n/* End of Date of cervical cancer screening test */\n\n/*\n@dataElement: HIV.D.DE657 - Lifetime screening test number\n@activity: HIV.D28 Offer other services\n@description: Client's lifetime number of screenings for cervical cancer\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Lifetime screening test number&quot;:\n  Elements.&quot;Lifetime screening test number&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Lifetime screening test number Value&quot;:\n  &quot;Lifetime screening test number&quot; O\n  return O.value\n/* End of Lifetime screening test number */\n\n/*\n@dataElement: HIV.D.DE658 - Cervical cancer primary screening test type\n@activity: HIV.D28 Offer other services\n@description: Type of cervical cancer screening test used in primary screening\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Cervical cancer primary screening test type&quot;:\n  exists &quot;Cervical cancer primary screening test type Observation&quot;\ndefine &quot;Cervical cancer primary screening test type Observation&quot;:\n  Elements.&quot;Cervical cancer primary screening test type Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Cervical cancer primary screening test type */\n\n/*\n@dataElement: HIV.D.DE659 - HPV-DNA\n@activity: HIV.D28 Offer other services\n@description: Screened for cervical cancer using HPV-DNA test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HPV-DNA&quot;:\n  exists &quot;HPV-DNA Condition&quot;\n    or exists &quot;HPV-DNA Observation&quot;\ndefine &quot;HPV-DNA Condition&quot;:\n  Elements.&quot;HPV-DNA Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;HPV-DNA Observation&quot;:\n  Elements.&quot;HPV-DNA Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HPV-DNA */\n\n/*\n@dataElement: HIV.D.DE660 - VIA\n@activity: HIV.D28 Offer other services\n@description: Screened for cervical cancer using visual inspection with acetic acid (VIA)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;VIA&quot;:\n  exists &quot;VIA Condition&quot;\n    or exists &quot;VIA Observation&quot;\ndefine &quot;VIA Condition&quot;:\n  Elements.&quot;VIA Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;VIA Observation&quot;:\n  Elements.&quot;VIA Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of VIA */\n\n/*\n@dataElement: HIV.D.DE661 - Cervical cytology\n@activity: HIV.D28 Offer other services\n@description: Screened for cervical cancer using cervical cytology\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Cervical cytology&quot;:\n  exists &quot;Cervical cytology Condition&quot;\n    or exists &quot;Cervical cytology Observation&quot;\ndefine &quot;Cervical cytology Condition&quot;:\n  Elements.&quot;Cervical cytology Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Cervical cytology Observation&quot;:\n  Elements.&quot;Cervical cytology Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Cervical cytology */\n\n/*\n@dataElement: HIV.D.DE662 - Other\n@activity: HIV.D28 Offer other services\n@description: Screened for cervical cancer using other method\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other D.DE662&quot;:\n  exists &quot;Other D.DE662 Condition&quot;\n    or exists &quot;Other D.DE662 Observation&quot;\ndefine &quot;Other D.DE662 Condition&quot;:\n  Elements.&quot;Other D.DE662 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other D.DE662 Observation&quot;:\n  Elements.&quot;Other D.DE662 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other D.DE662 */\n\n/*\n@dataElement: HIV.D.DE745 - Cervical cancer screening interval amongst WLHIV\n@activity: HIV.D28 Offer other services\n@description: Country-specific interval between cancer screenings amongst women living with HIV (typically 3 or 5 years)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Cervical cancer screening interval amongst WLHIV&quot;:\n  Elements.&quot;Cervical cancer screening interval amongst WLHIV&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Cervical cancer screening interval amongst WLHIV Value&quot;:\n  &quot;Cervical cancer screening interval amongst WLHIV&quot; O\n  return O.value\n/* End of Cervical cancer screening interval amongst WLHIV */\n\n/*\n@dataElement: HIV.D.DE753 - Offer other clinical services\n@activity: HIV.D28 Offer other services\n@description: Other clinical services offered or referrals given to the client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Offer other clinical services D.DE753&quot;:\n  exists &quot;Offer other clinical services D.DE753 Observation&quot;\ndefine &quot;Offer other clinical services D.DE753 Observation&quot;:\n  Elements.&quot;Offer other clinical services D.DE753 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Offer other clinical services D.DE753 */\n\n/*\n@dataElement: HIV.D.DE754 - Assessment and provision of vaccinations\n@activity: HIV.D28 Offer other services\n@description: Assessment and provision of vaccinations, such as for people from Key population member type, pregnant women and infants; and, where appropriate, tetanus vaccination for adolescent boys and men receiving VMMC\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assessment and provision of vaccinations D.DE754&quot;:\n  exists &quot;Assessment and provision of vaccinations D.DE754 Condition&quot;\n    or exists &quot;Assessment and provision of vaccinations D.DE754 Observation&quot;\ndefine &quot;Assessment and provision of vaccinations D.DE754 Condition&quot;:\n  Elements.&quot;Assessment and provision of vaccinations D.DE754 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assessment and provision of vaccinations D.DE754 Observation&quot;:\n  Elements.&quot;Assessment and provision of vaccinations D.DE754 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assessment and provision of vaccinations D.DE754 */\n\n/*\n@dataElement: HIV.D.DE755 - Hepatitis B HBV and hepatitis C virus HCV testing and treatment\n@activity: HIV.D28 Offer other services\n@description: Offer or refer for HBV and/or HCV testing and treatment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment&quot;:\n  exists &quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment Condition&quot;\n    or exists &quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment Observation&quot;\ndefine &quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment Condition&quot;:\n  Elements.&quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment Observation&quot;:\n  Elements.&quot;Hepatitis B HBV and hepatitis C virus HCV testing and treatment Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Hepatitis B HBV and hepatitis C virus HCV testing and treatment */\n\n/*\n@dataElement: HIV.D.DE756 - Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia\n@activity: HIV.D28 Offer other services\n@description: Offer or refer for co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia D.DE756&quot;:\n  exists &quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia D.DE756 Condition&quot;\n    or exists &quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia D.DE756 Observation&quot;\ndefine &quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia D.DE756 Condition&quot;:\n  Elements.&quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia D.DE756 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia D.DE756 Observation&quot;:\n  Elements.&quot;Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia D.DE756 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Co-trimoxazole chemoprophylaxis to prevent pneumocystis carinii pneumonia D.DE756 */\n\n/*\n@dataElement: HIV.D.DE757 - Intensified TB case finding and linkage to TB treatment\n@activity: HIV.D28 Offer other services\n@description: Offer or refer for intensified TB case finding and linkage to TB treatment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Intensified TB case finding and linkage to TB treatment D.DE757&quot;:\n  exists &quot;Intensified TB case finding and linkage to TB treatment D.DE757 Condition&quot;\n    or exists &quot;Intensified TB case finding and linkage to TB treatment D.DE757 Observation&quot;\ndefine &quot;Intensified TB case finding and linkage to TB treatment D.DE757 Condition&quot;:\n  Elements.&quot;Intensified TB case finding and linkage to TB treatment D.DE757 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Intensified TB case finding and linkage to TB treatment D.DE757 Observation&quot;:\n  Elements.&quot;Intensified TB case finding and linkage to TB treatment D.DE757 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Intensified TB case finding and linkage to TB treatment D.DE757 */\n\n/*\n@dataElement: HIV.D.DE758 - Provision of isoniazid preventive therapy if person does not have TB\n@activity: HIV.D28 Offer other services\n@description: Offer or refer for provision of isoniazid preventive therapy if person does not have TB\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Provision of isoniazid preventive therapy if person does not have TB D.DE758&quot;:\n  exists &quot;Provision of isoniazid preventive therapy if person does not have TB D.DE758 Condition&quot;\n    or exists &quot;Provision of isoniazid preventive therapy if person does not have TB D.DE758 Observation&quot;\ndefine &quot;Provision of isoniazid preventive therapy if person does not have TB D.DE758 Condition&quot;:\n  Elements.&quot;Provision of isoniazid preventive therapy if person does not have TB D.DE758 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Provision of isoniazid preventive therapy if person does not have TB D.DE758 Observation&quot;:\n  Elements.&quot;Provision of isoniazid preventive therapy if person does not have TB D.DE758 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Provision of isoniazid preventive therapy if person does not have TB D.DE758 */\n\n/*\n@dataElement: HIV.D.DE759 - Malaria prevention such as bed nets and prophylaxis, depending on epidemiology\n@activity: HIV.D28 Offer other services\n@description: Offer or refer for malaria prevention (such as bed nets and prophylaxis), depending on epidemiology\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology D.DE759&quot;:\n  exists &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology D.DE759 Condition&quot;\n    or exists &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology D.DE759 Observation&quot;\ndefine &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology D.DE759 Condition&quot;:\n  Elements.&quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology D.DE759 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology D.DE759 Observation&quot;:\n  Elements.&quot;Malaria prevention such as bed nets and prophylaxis, depending on epidemiology D.DE759 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Malaria prevention such as bed nets and prophylaxis, depending on epidemiology D.DE759 */\n\n/*\n@dataElement: HIV.D.DE802 - Syphilis test result\n@activity: HIV.D26 Offer sexual and reproductive health services\n@description: Result from syphilis test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Syphilis test result D.DE802&quot;:\n  exists &quot;Syphilis test result D.DE802 Observation&quot;\ndefine &quot;Syphilis test result D.DE802 Observation&quot;:\n  Elements.&quot;Syphilis test result D.DE802 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Syphilis test result D.DE802 */\n\n/*\n@dataElement: HIV.D.DE803 - Positive\n@activity: HIV.D26 Offer sexual and reproductive health services\n@description: Test result is positive for syphilis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Positive D.DE803&quot;:\n  exists &quot;Positive D.DE803 Condition&quot;\n    or exists &quot;Positive D.DE803 Observation&quot;\ndefine &quot;Positive D.DE803 Condition&quot;:\n  Elements.&quot;Positive D.DE803 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Positive D.DE803 Observation&quot;:\n  Elements.&quot;Positive D.DE803 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Positive D.DE803 */\n\n/*\n@dataElement: HIV.D.DE804 - Negative\n@activity: HIV.D26 Offer sexual and reproductive health services\n@description: Test result is negative for syphilis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Negative D.DE804&quot;:\n  exists &quot;Negative D.DE804 Condition&quot;\n    or exists &quot;Negative D.DE804 Observation&quot;\ndefine &quot;Negative D.DE804 Condition&quot;:\n  Elements.&quot;Negative D.DE804 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Negative D.DE804 Observation&quot;:\n  Elements.&quot;Negative D.DE804 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Negative D.DE804 */\n\n/*\n@dataElement: HIV.D.DE805 - Inconclusive\n@activity: HIV.D26 Offer sexual and reproductive health services\n@description: Test result is inconclusive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Inconclusive D.DE805&quot;:\n  exists &quot;Inconclusive D.DE805 Condition&quot;\n    or exists &quot;Inconclusive D.DE805 Observation&quot;\ndefine &quot;Inconclusive D.DE805 Condition&quot;:\n  Elements.&quot;Inconclusive D.DE805 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Inconclusive D.DE805 Observation&quot;:\n  Elements.&quot;Inconclusive D.DE805 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Inconclusive D.DE805 */\n\n/*\n@dataElement: HIV.D.DE903 - Medication/drug\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Current or considered medication/drug, for the purpose of determining drug interactions\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Medication/drug&quot;:\n  exists &quot;Medication/drug Observation&quot;\ndefine &quot;Medication/drug Observation&quot;:\n  Elements.&quot;Medication/drug Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Medication/drug */\n\n/*\n@dataElement: HIV.D.DE904 - Rifampicin\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Rifampicin currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Rifampicin&quot;:\n  exists &quot;Rifampicin Condition&quot;\n    or exists &quot;Rifampicin Observation&quot;\ndefine &quot;Rifampicin Condition&quot;:\n  Elements.&quot;Rifampicin Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Rifampicin Observation&quot;:\n  Elements.&quot;Rifampicin Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Rifampicin */\n\n/*\n@dataElement: HIV.D.DE905 - Halofantrine\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Halofantrine currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Halofantrine&quot;:\n  exists &quot;Halofantrine Condition&quot;\n    or exists &quot;Halofantrine Observation&quot;\ndefine &quot;Halofantrine Condition&quot;:\n  Elements.&quot;Halofantrine Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Halofantrine Observation&quot;:\n  Elements.&quot;Halofantrine Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Halofantrine */\n\n/*\n@dataElement: HIV.D.DE906 - Lovastatin\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Lovastatin currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Lovastatin&quot;:\n  exists &quot;Lovastatin Condition&quot;\n    or exists &quot;Lovastatin Observation&quot;\ndefine &quot;Lovastatin Condition&quot;:\n  Elements.&quot;Lovastatin Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Lovastatin Observation&quot;:\n  Elements.&quot;Lovastatin Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Lovastatin */\n\n/*\n@dataElement: HIV.D.DE907 - Simvastatin\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Simvastatin currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Simvastatin&quot;:\n  exists &quot;Simvastatin Condition&quot;\n    or exists &quot;Simvastatin Observation&quot;\ndefine &quot;Simvastatin Condition&quot;:\n  Elements.&quot;Simvastatin Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Simvastatin Observation&quot;:\n  Elements.&quot;Simvastatin Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Simvastatin */\n\n/*\n@dataElement: HIV.D.DE908 - Hormonal contraception\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Hormonal contraception currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Hormonal contraception&quot;:\n  exists &quot;Hormonal contraception Condition&quot;\n    or exists &quot;Hormonal contraception Observation&quot;\ndefine &quot;Hormonal contraception Condition&quot;:\n  Elements.&quot;Hormonal contraception Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Hormonal contraception Observation&quot;:\n  Elements.&quot;Hormonal contraception Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Hormonal contraception */\n\n/*\n@dataElement: HIV.D.DE909 - Metformin\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Metformin currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Metformin&quot;:\n  exists &quot;Metformin Condition&quot;\n    or exists &quot;Metformin Observation&quot;\ndefine &quot;Metformin Condition&quot;:\n  Elements.&quot;Metformin Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Metformin Observation&quot;:\n  Elements.&quot;Metformin Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Metformin */\n\n/*\n@dataElement: HIV.D.DE910 - Astemizole\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Astemizole currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Astemizole&quot;:\n  exists &quot;Astemizole Condition&quot;\n    or exists &quot;Astemizole Observation&quot;\ndefine &quot;Astemizole Condition&quot;:\n  Elements.&quot;Astemizole Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Astemizole Observation&quot;:\n  Elements.&quot;Astemizole Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Astemizole */\n\n/*\n@dataElement: HIV.D.DE911 - Terfenadine\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Terfenadine currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Terfenadine&quot;:\n  exists &quot;Terfenadine Condition&quot;\n    or exists &quot;Terfenadine Observation&quot;\ndefine &quot;Terfenadine Condition&quot;:\n  Elements.&quot;Terfenadine Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Terfenadine Observation&quot;:\n  Elements.&quot;Terfenadine Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Terfenadine */\n\n/*\n@dataElement: HIV.D.DE912 - TDF\n@activity: HIV.D21 Determine regimen and treatment options\n@description: TDF currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TDF D.DE912&quot;:\n  exists &quot;TDF D.DE912 Condition&quot;\n    or exists &quot;TDF D.DE912 Observation&quot;\ndefine &quot;TDF D.DE912 Condition&quot;:\n  Elements.&quot;TDF D.DE912 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;TDF D.DE912 Observation&quot;:\n  Elements.&quot;TDF D.DE912 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TDF D.DE912 */\n\n/*\n@dataElement: HIV.D.DE913 - Simeprevir\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Simeprevir currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Simeprevir&quot;:\n  exists &quot;Simeprevir Condition&quot;\n    or exists &quot;Simeprevir Observation&quot;\ndefine &quot;Simeprevir Condition&quot;:\n  Elements.&quot;Simeprevir Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Simeprevir Observation&quot;:\n  Elements.&quot;Simeprevir Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Simeprevir */\n\n/*\n@dataElement: HIV.D.DE914 - Ombitasvir + paritaprevir/ritonavir + dasabuvir\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Ombitasvir + paritaprevir/ritonavir + dasabuvir currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Ombitasvir + paritaprevir/ritonavir + dasabuvir&quot;:\n  exists &quot;Ombitasvir + paritaprevir/ritonavir + dasabuvir Condition&quot;\n    or exists &quot;Ombitasvir + paritaprevir/ritonavir + dasabuvir Observation&quot;\ndefine &quot;Ombitasvir + paritaprevir/ritonavir + dasabuvir Condition&quot;:\n  Elements.&quot;Ombitasvir + paritaprevir/ritonavir + dasabuvir Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Ombitasvir + paritaprevir/ritonavir + dasabuvir Observation&quot;:\n  Elements.&quot;Ombitasvir + paritaprevir/ritonavir + dasabuvir Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Ombitasvir + paritaprevir/ritonavir + dasabuvir */\n\n/*\n@dataElement: HIV.D.DE915 - Methadone\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Methadone currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Methadone D.DE915&quot;:\n  exists &quot;Methadone D.DE915 Condition&quot;\n    or exists &quot;Methadone D.DE915 Observation&quot;\ndefine &quot;Methadone D.DE915 Condition&quot;:\n  Elements.&quot;Methadone D.DE915 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Methadone D.DE915 Observation&quot;:\n  Elements.&quot;Methadone D.DE915 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Methadone D.DE915 */\n\n/*\n@dataElement: HIV.D.DE916 - Buprenorphine\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Buprenorphine currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Buprenorphine D.DE916&quot;:\n  exists &quot;Buprenorphine D.DE916 Condition&quot;\n    or exists &quot;Buprenorphine D.DE916 Observation&quot;\ndefine &quot;Buprenorphine D.DE916 Condition&quot;:\n  Elements.&quot;Buprenorphine D.DE916 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Buprenorphine D.DE916 Observation&quot;:\n  Elements.&quot;Buprenorphine D.DE916 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Buprenorphine D.DE916 */\n\n/*\n@dataElement: HIV.D.DE917 - Dofetilide\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Dofetilide currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Dofetilide&quot;:\n  exists &quot;Dofetilide Condition&quot;\n    or exists &quot;Dofetilide Observation&quot;\ndefine &quot;Dofetilide Condition&quot;:\n  Elements.&quot;Dofetilide Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Dofetilide Observation&quot;:\n  Elements.&quot;Dofetilide Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Dofetilide */\n\n/*\n@dataElement: HIV.D.DE918 - Carbamazepine\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Carbamazepine currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Carbamazepine&quot;:\n  exists &quot;Carbamazepine Condition&quot;\n    or exists &quot;Carbamazepine Observation&quot;\ndefine &quot;Carbamazepine Condition&quot;:\n  Elements.&quot;Carbamazepine Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Carbamazepine Observation&quot;:\n  Elements.&quot;Carbamazepine Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Carbamazepine */\n\n/*\n@dataElement: HIV.D.DE919 - Phenobarbital\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Phenobarbital currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Phenobarbital&quot;:\n  exists &quot;Phenobarbital Condition&quot;\n    or exists &quot;Phenobarbital Observation&quot;\ndefine &quot;Phenobarbital Condition&quot;:\n  Elements.&quot;Phenobarbital Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Phenobarbital Observation&quot;:\n  Elements.&quot;Phenobarbital Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Phenobarbital */\n\n/*\n@dataElement: HIV.D.DE920 - Phenytoin\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Phenytoin currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Phenytoin&quot;:\n  exists &quot;Phenytoin Condition&quot;\n    or exists &quot;Phenytoin Observation&quot;\ndefine &quot;Phenytoin Condition&quot;:\n  Elements.&quot;Phenytoin Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Phenytoin Observation&quot;:\n  Elements.&quot;Phenytoin Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Phenytoin */\n\n/*\n@dataElement: HIV.D.DE921 - Polyvalent cation products containing Mg, Al, Fe, Ca and Zn\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Polyvalent cation products containing Mg, Al, Fe, Ca and Zn currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Polyvalent cation products containing Mg, Al, Fe, Ca and Zn&quot;:\n  exists &quot;Polyvalent cation products containing Mg, Al, Fe, Ca and Zn Condition&quot;\n    or exists &quot;Polyvalent cation products containing Mg, Al, Fe, Ca and Zn Observation&quot;\ndefine &quot;Polyvalent cation products containing Mg, Al, Fe, Ca and Zn Condition&quot;:\n  Elements.&quot;Polyvalent cation products containing Mg, Al, Fe, Ca and Zn Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Polyvalent cation products containing Mg, Al, Fe, Ca and Zn Observation&quot;:\n  Elements.&quot;Polyvalent cation products containing Mg, Al, Fe, Ca and Zn Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Polyvalent cation products containing Mg, Al, Fe, Ca and Zn */\n\n/*\n@dataElement: HIV.D.DE922 - Amodiaquine\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Amodiaquine currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Amodiaquine&quot;:\n  exists &quot;Amodiaquine Condition&quot;\n    or exists &quot;Amodiaquine Observation&quot;\ndefine &quot;Amodiaquine Condition&quot;:\n  Elements.&quot;Amodiaquine Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Amodiaquine Observation&quot;:\n  Elements.&quot;Amodiaquine Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Amodiaquine */\n\n/*\n@dataElement: HIV.D.DE923 - Cisapride\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Cisapride currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Cisapride&quot;:\n  exists &quot;Cisapride Condition&quot;\n    or exists &quot;Cisapride Observation&quot;\ndefine &quot;Cisapride Condition&quot;:\n  Elements.&quot;Cisapride Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Cisapride Observation&quot;:\n  Elements.&quot;Cisapride Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Cisapride */\n\n/*\n@dataElement: HIV.D.DE924 - Ergotamine\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Ergotamine currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Ergotamine&quot;:\n  exists &quot;Ergotamine Condition&quot;\n    or exists &quot;Ergotamine Observation&quot;\ndefine &quot;Ergotamine Condition&quot;:\n  Elements.&quot;Ergotamine Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Ergotamine Observation&quot;:\n  Elements.&quot;Ergotamine Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Ergotamine */\n\n/*\n@dataElement: HIV.D.DE925 - Dihydroergotamine\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Dihydroergotamine currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Dihydroergotamine&quot;:\n  exists &quot;Dihydroergotamine Condition&quot;\n    or exists &quot;Dihydroergotamine Observation&quot;\ndefine &quot;Dihydroergotamine Condition&quot;:\n  Elements.&quot;Dihydroergotamine Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Dihydroergotamine Observation&quot;:\n  Elements.&quot;Dihydroergotamine Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Dihydroergotamine */\n\n/*\n@dataElement: HIV.D.DE926 - Midazolam\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Midazolam currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Midazolam&quot;:\n  exists &quot;Midazolam Condition&quot;\n    or exists &quot;Midazolam Observation&quot;\ndefine &quot;Midazolam Condition&quot;:\n  Elements.&quot;Midazolam Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Midazolam Observation&quot;:\n  Elements.&quot;Midazolam Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Midazolam */\n\n/*\n@dataElement: HIV.D.DE927 - Triazolam\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Triazolam currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Triazolam&quot;:\n  exists &quot;Triazolam Condition&quot;\n    or exists &quot;Triazolam Observation&quot;\ndefine &quot;Triazolam Condition&quot;:\n  Elements.&quot;Triazolam Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Triazolam Observation&quot;:\n  Elements.&quot;Triazolam Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Triazolam */\n\n/*\n@dataElement: HIV.D.DE928 - Estrogen-based hormonal contraception\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Estrogen-based hormonal contraception currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Estrogen-based hormonal contraception&quot;:\n  exists &quot;Estrogen-based hormonal contraception Condition&quot;\n    or exists &quot;Estrogen-based hormonal contraception Observation&quot;\ndefine &quot;Estrogen-based hormonal contraception Condition&quot;:\n  Elements.&quot;Estrogen-based hormonal contraception Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Estrogen-based hormonal contraception Observation&quot;:\n  Elements.&quot;Estrogen-based hormonal contraception Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Estrogen-based hormonal contraception */\n\n/*\n@dataElement: HIV.D.DE929 - Ribavirin\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Ribavirin currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Ribavirin&quot;:\n  exists &quot;Ribavirin Condition&quot;\n    or exists &quot;Ribavirin Observation&quot;\ndefine &quot;Ribavirin Condition&quot;:\n  Elements.&quot;Ribavirin Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Ribavirin Observation&quot;:\n  Elements.&quot;Ribavirin Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Ribavirin */\n\n/*\n@dataElement: HIV.D.DE930 - Peginterferon alfa-2a\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Peginterferon alfa-2a currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Peginterferon alfa-2a&quot;:\n  exists &quot;Peginterferon alfa-2a Condition&quot;\n    or exists &quot;Peginterferon alfa-2a Observation&quot;\ndefine &quot;Peginterferon alfa-2a Condition&quot;:\n  Elements.&quot;Peginterferon alfa-2a Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Peginterferon alfa-2a Observation&quot;:\n  Elements.&quot;Peginterferon alfa-2a Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Peginterferon alfa-2a */\n\n/*\n@dataElement: HIV.D.DE931 - Other\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Other medication currently being taken by, or considered for, client\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other D.DE931&quot;:\n  exists &quot;Other D.DE931 Condition&quot;\n    or exists &quot;Other D.DE931 Observation&quot;\ndefine &quot;Other D.DE931 Condition&quot;:\n  Elements.&quot;Other D.DE931 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other D.DE931 Observation&quot;:\n  Elements.&quot;Other D.DE931 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other D.DE931 */\n\n/*\n@dataElement: HIV.D.DE933 - Medication change recommended\n@activity: HIV.D21 Determine regimen and treatment options\n@description: A medication change is recommended for the client based upon current or considered medications\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Medication change recommended&quot;:\n  exists &quot;Medication change recommended Observation&quot;\ndefine &quot;Medication change recommended Observation&quot;:\n  Elements.&quot;Medication change recommended Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Medication change recommended */\n\n/*\n@dataElement: HIV.D.DE934 - WHO HIV clinical stage condition or symptom\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: New or recurrent clinical events used to categorize HIV disease severity based at baseline and follow up\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;WHO HIV clinical stage condition or symptom D.DE934&quot;:\n  exists &quot;WHO HIV clinical stage condition or symptom D.DE934 Observation&quot;\ndefine &quot;WHO HIV clinical stage condition or symptom D.DE934 Observation&quot;:\n  Elements.&quot;WHO HIV clinical stage condition or symptom D.DE934 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of WHO HIV clinical stage condition or symptom D.DE934 */\n\n/*\n@dataElement: HIV.D.DE935 - Pulmonary TB\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include pulmonary TB\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Pulmonary TB D.DE935&quot;:\n  exists &quot;Pulmonary TB D.DE935 Condition&quot;\n    or exists &quot;Pulmonary TB D.DE935 Observation&quot;\ndefine &quot;Pulmonary TB D.DE935 Condition&quot;:\n  Elements.&quot;Pulmonary TB D.DE935 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Pulmonary TB D.DE935 Observation&quot;:\n  Elements.&quot;Pulmonary TB D.DE935 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Pulmonary TB D.DE935 */\n\n/*\n@dataElement: HIV.D.DE936 - Lymph node TB\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include lymph node TB\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Lymph node TB D.DE936&quot;:\n  exists &quot;Lymph node TB D.DE936 Condition&quot;\n    or exists &quot;Lymph node TB D.DE936 Observation&quot;\ndefine &quot;Lymph node TB D.DE936 Condition&quot;:\n  Elements.&quot;Lymph node TB D.DE936 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Lymph node TB D.DE936 Observation&quot;:\n  Elements.&quot;Lymph node TB D.DE936 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Lymph node TB D.DE936 */\n\n/*\n@dataElement: HIV.D.DE937 - Extrapulmonary TB\n@activity: HIV.D15 Determine clinical stage of HIV\n@description: Client's symptoms include extrapulmonary tuberculosis (TB)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Extrapulmonary TB D.DE937&quot;:\n  exists &quot;Extrapulmonary TB D.DE937 Condition&quot;\n    or exists &quot;Extrapulmonary TB D.DE937 Observation&quot;\ndefine &quot;Extrapulmonary TB D.DE937 Condition&quot;:\n  Elements.&quot;Extrapulmonary TB D.DE937 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Extrapulmonary TB D.DE937 Observation&quot;:\n  Elements.&quot;Extrapulmonary TB D.DE937 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Extrapulmonary TB D.DE937 */\n\n/*\n@dataElement: HIV.D.DE939 - TB diagnosis result\n@activity: HIV.D8 Capture or update client history\n@description: Final result of the TB investigation (bacteriological and/or clinical)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TB diagnosis result&quot;:\n  exists &quot;TB diagnosis result Observation&quot;\ndefine &quot;TB diagnosis result Observation&quot;:\n  Elements.&quot;TB diagnosis result Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TB diagnosis result */\n\n/*\n@dataElement: HIV.D.DE940 - Diagnosed TB\n@activity: HIV.D8 Capture or update client history\n@description: Client is diagnosed with TB disease\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Diagnosed TB&quot;:\n  exists &quot;Diagnosed TB Condition&quot;\n    or exists &quot;Diagnosed TB Observation&quot;\ndefine &quot;Diagnosed TB Condition&quot;:\n  Elements.&quot;Diagnosed TB Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Diagnosed TB Observation&quot;:\n  Elements.&quot;Diagnosed TB Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Diagnosed TB */\n\n/*\n@dataElement: HIV.D.DE941 - TB excluded\n@activity: HIV.D8 Capture or update client history\n@description: Client is not diagnosed with TB\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TB excluded&quot;:\n  exists &quot;TB excluded Condition&quot;\n    or exists &quot;TB excluded Observation&quot;\ndefine &quot;TB excluded Condition&quot;:\n  Elements.&quot;TB excluded Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;TB excluded Observation&quot;:\n  Elements.&quot;TB excluded Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TB excluded */\n\n/*\n@dataElement: HIV.D.DE945 - Presumptive TB\n@activity: HIV.D8 Capture or update client history\n@description: Client has signs or symptoms of tuberculosis (TB) without laboratory confirmation\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Presumptive TB D.DE945&quot;:\n  exists &quot;Presumptive TB D.DE945 Observation&quot;\ndefine &quot;Presumptive TB D.DE945 Observation&quot;:\n  Elements.&quot;Presumptive TB D.DE945 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Presumptive TB D.DE945 */\n\n/*\n@dataElement: HIV.D.DE956 - TB screening algorithm\n@activity: HIV.D4 Screen for TB\n@description: Screening algorithm selected for screening activities\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TB screening algorithm&quot;:\n  exists &quot;TB screening algorithm Observation&quot;\ndefine &quot;TB screening algorithm Observation&quot;:\n  Elements.&quot;TB screening algorithm Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TB screening algorithm */\n\n/*\n@dataElement: HIV.D.DE957 - Screening with cough\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB based on cough symptom\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Screening with cough&quot;:\n  exists &quot;Screening with cough Condition&quot;\n    or exists &quot;Screening with cough Observation&quot;\ndefine &quot;Screening with cough Condition&quot;:\n  Elements.&quot;Screening with cough Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Screening with cough Observation&quot;:\n  Elements.&quot;Screening with cough Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Screening with cough */\n\n/*\n@dataElement: HIV.D.DE958 - Screening with any TB symptom\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB based on any TB symptom\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Screening with any TB symptom&quot;:\n  exists &quot;Screening with any TB symptom Condition&quot;\n    or exists &quot;Screening with any TB symptom Observation&quot;\ndefine &quot;Screening with any TB symptom Condition&quot;:\n  Elements.&quot;Screening with any TB symptom Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Screening with any TB symptom Observation&quot;:\n  Elements.&quot;Screening with any TB symptom Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Screening with any TB symptom */\n\n/*\n@dataElement: HIV.D.DE959 - W4SS single screening algorithm\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB based on the WHO-recommended four-symptom screen\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;W4SS single screening algorithm&quot;:\n  exists &quot;W4SS single screening algorithm Condition&quot;\n    or exists &quot;W4SS single screening algorithm Observation&quot;\ndefine &quot;W4SS single screening algorithm Condition&quot;:\n  Elements.&quot;W4SS single screening algorithm Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;W4SS single screening algorithm Observation&quot;:\n  Elements.&quot;W4SS single screening algorithm Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of W4SS single screening algorithm */\n\n/*\n@dataElement: HIV.D.DE960 - CRP single screening algorithm\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB based on C-reactive protein (CRP) testing\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;CRP single screening algorithm&quot;:\n  exists &quot;CRP single screening algorithm Condition&quot;\n    or exists &quot;CRP single screening algorithm Observation&quot;\ndefine &quot;CRP single screening algorithm Condition&quot;:\n  Elements.&quot;CRP single screening algorithm Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;CRP single screening algorithm Observation&quot;:\n  Elements.&quot;CRP single screening algorithm Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of CRP single screening algorithm */\n\n/*\n@dataElement: HIV.D.DE961 - CXR single screening algorithm\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB with a chest radiography (CXR)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;CXR single screening algorithm&quot;:\n  exists &quot;CXR single screening algorithm Condition&quot;\n    or exists &quot;CXR single screening algorithm Observation&quot;\ndefine &quot;CXR single screening algorithm Condition&quot;:\n  Elements.&quot;CXR single screening algorithm Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;CXR single screening algorithm Observation&quot;:\n  Elements.&quot;CXR single screening algorithm Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of CXR single screening algorithm */\n\n/*\n@dataElement: HIV.D.DE962 - Parallel screening algorithm with W4SS and CRP\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB using parallel screening with WHO-recommended four-symptom screen and C-reactive protein (CRP) testing\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Parallel screening algorithm with W4SS and CRP&quot;:\n  exists &quot;Parallel screening algorithm with W4SS and CRP Condition&quot;\n    or exists &quot;Parallel screening algorithm with W4SS and CRP Observation&quot;\ndefine &quot;Parallel screening algorithm with W4SS and CRP Condition&quot;:\n  Elements.&quot;Parallel screening algorithm with W4SS and CRP Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Parallel screening algorithm with W4SS and CRP Observation&quot;:\n  Elements.&quot;Parallel screening algorithm with W4SS and CRP Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Parallel screening algorithm with W4SS and CRP */\n\n/*\n@dataElement: HIV.D.DE963 - Sequential positive screening algorithm with W4SS and CRP\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB using sequential positive screening with WHO-recommended four-symptom screen and C-reactive protein (CRP) testing.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Sequential positive screening algorithm with W4SS and CRP&quot;:\n  exists &quot;Sequential positive screening algorithm with W4SS and CRP Condition&quot;\n    or exists &quot;Sequential positive screening algorithm with W4SS and CRP Observation&quot;\ndefine &quot;Sequential positive screening algorithm with W4SS and CRP Condition&quot;:\n  Elements.&quot;Sequential positive screening algorithm with W4SS and CRP Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Sequential positive screening algorithm with W4SS and CRP Observation&quot;:\n  Elements.&quot;Sequential positive screening algorithm with W4SS and CRP Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Sequential positive screening algorithm with W4SS and CRP */\n\n/*\n@dataElement: HIV.D.DE964 - Sequential negative screening algorithm with W4SS and CRP\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB using sequential negative screening with WHO-recommended four-symptom screen and C-reactive protein (CRP) testing\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Sequential negative screening algorithm with W4SS and CRP&quot;:\n  exists &quot;Sequential negative screening algorithm with W4SS and CRP Condition&quot;\n    or exists &quot;Sequential negative screening algorithm with W4SS and CRP Observation&quot;\ndefine &quot;Sequential negative screening algorithm with W4SS and CRP Condition&quot;:\n  Elements.&quot;Sequential negative screening algorithm with W4SS and CRP Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Sequential negative screening algorithm with W4SS and CRP Observation&quot;:\n  Elements.&quot;Sequential negative screening algorithm with W4SS and CRP Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Sequential negative screening algorithm with W4SS and CRP */\n\n/*\n@dataElement: HIV.D.DE965 - Parallel screening algorithm with W4SS and CXR\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB using the parallel screening algorithm with W4SS and CXR\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Parallel screening algorithm with W4SS and CXR&quot;:\n  exists &quot;Parallel screening algorithm with W4SS and CXR Condition&quot;\n    or exists &quot;Parallel screening algorithm with W4SS and CXR Observation&quot;\ndefine &quot;Parallel screening algorithm with W4SS and CXR Condition&quot;:\n  Elements.&quot;Parallel screening algorithm with W4SS and CXR Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Parallel screening algorithm with W4SS and CXR Observation&quot;:\n  Elements.&quot;Parallel screening algorithm with W4SS and CXR Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Parallel screening algorithm with W4SS and CXR */\n\n/*\n@dataElement: HIV.D.DE966 - Sequential positive screening algorithm with W4SS and CXR\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB using sequential positive screening with WHO-recommended four-symptom screen and chest radiography\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Sequential positive screening algorithm with W4SS and CXR&quot;:\n  exists &quot;Sequential positive screening algorithm with W4SS and CXR Condition&quot;\n    or exists &quot;Sequential positive screening algorithm with W4SS and CXR Observation&quot;\ndefine &quot;Sequential positive screening algorithm with W4SS and CXR Condition&quot;:\n  Elements.&quot;Sequential positive screening algorithm with W4SS and CXR Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Sequential positive screening algorithm with W4SS and CXR Observation&quot;:\n  Elements.&quot;Sequential positive screening algorithm with W4SS and CXR Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Sequential positive screening algorithm with W4SS and CXR */\n\n/*\n@dataElement: HIV.D.DE967 - Sequential negative screening algorithm with W4SS and CXR\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB using sequential negative screening with WHO-recommended four-symptom screen and chest radiography\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Sequential negative screening algorithm with W4SS and CXR&quot;:\n  exists &quot;Sequential negative screening algorithm with W4SS and CXR Condition&quot;\n    or exists &quot;Sequential negative screening algorithm with W4SS and CXR Observation&quot;\ndefine &quot;Sequential negative screening algorithm with W4SS and CXR Condition&quot;:\n  Elements.&quot;Sequential negative screening algorithm with W4SS and CXR Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Sequential negative screening algorithm with W4SS and CXR Observation&quot;:\n  Elements.&quot;Sequential negative screening algorithm with W4SS and CXR Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Sequential negative screening algorithm with W4SS and CXR */\n\n/*\n@dataElement: HIV.D.DE968 - Screening with mWRD\n@activity: HIV.D4 Screen for TB\n@description: Client screened for TB with a molecular WHO-recommended rapid diagnostic test (mWRD), such as an Xpert MTB/RIF test to detect Mycobacterium tuberculosis (MTB)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Screening with mWRD&quot;:\n  exists &quot;Screening with mWRD Condition&quot;\n    or exists &quot;Screening with mWRD Observation&quot;\ndefine &quot;Screening with mWRD Condition&quot;:\n  Elements.&quot;Screening with mWRD Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Screening with mWRD Observation&quot;:\n  Elements.&quot;Screening with mWRD Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Screening with mWRD */\n\n/*\n@dataElement: HIV.D.DE969 - Clinical assessment\n@activity: HIV.D4 Screen for TB\n@description: Client screened for with a clinical evaluation for tuberculosis (TB) based on national guidelines. Clinical assessment may be used as an eligibility evaluation for testing with LF-LAM or for empiric TB treatment.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Clinical assessment&quot;:\n  exists &quot;Clinical assessment Condition&quot;\n    or exists &quot;Clinical assessment Observation&quot;\ndefine &quot;Clinical assessment Condition&quot;:\n  Elements.&quot;Clinical assessment Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Clinical assessment Observation&quot;:\n  Elements.&quot;Clinical assessment Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Clinical assessment */\n\n/*\n@dataElement: HIV.D.DE970 - Other TB screening algorithm\n@activity: HIV.D4 Screen for TB\n@description: Client screened for tuberculosis (TB) with a different screening method not listed\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Other TB screening algorithm&quot;:\n  exists &quot;Other TB screening algorithm Condition&quot;\n    or exists &quot;Other TB screening algorithm Observation&quot;\ndefine &quot;Other TB screening algorithm Condition&quot;:\n  Elements.&quot;Other TB screening algorithm Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Other TB screening algorithm Observation&quot;:\n  Elements.&quot;Other TB screening algorithm Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Other TB screening algorithm */\n\n/*\n@dataElement: HIV.D.DE973 - Symptoms of TB\n@activity: HIV.D4 Screen for TB\n@description: Symptoms that may indicate TB disease in clients living with HIV, based on a clinical algorithm\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Symptoms of TB&quot;:\n  exists &quot;Symptoms of TB Observation&quot;\ndefine &quot;Symptoms of TB Observation&quot;:\n  Elements.&quot;Symptoms of TB Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Symptoms of TB */\n\n/*\n@dataElement: HIV.D.DE974 - Current cough\n@activity: HIV.D4 Screen for TB\n@description: Client has a cough regardless of duration\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Current cough&quot;:\n  exists &quot;Current cough Condition&quot;\n    or exists &quot;Current cough Observation&quot;\ndefine &quot;Current cough Condition&quot;:\n  Elements.&quot;Current cough Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Current cough Observation&quot;:\n  Elements.&quot;Current cough Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Current cough */\n\n/*\n@dataElement: HIV.D.DE975 - Prolonged cough &gt;=2w\n@activity: HIV.D4 Screen for TB\n@description: Client has a prolonged cough of 2 weeks or more\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Prolonged cough &gt;=2w&quot;:\n  exists &quot;Prolonged cough &gt;=2w Condition&quot;\n    or exists &quot;Prolonged cough &gt;=2w Observation&quot;\ndefine &quot;Prolonged cough &gt;=2w Condition&quot;:\n  Elements.&quot;Prolonged cough &gt;=2w Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Prolonged cough &gt;=2w Observation&quot;:\n  Elements.&quot;Prolonged cough &gt;=2w Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Prolonged cough &gt;=2w */\n\n/*\n@dataElement: HIV.D.DE976 - Fever of 39 °C or greater\n@activity: HIV.D4 Screen for TB\n@description: Client has a fever with a measured temperature of 102.2 °F/39 °C or greater\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Fever of 39 °C or greater&quot;:\n  exists &quot;Fever of 39 °C or greater Condition&quot;\n    or exists &quot;Fever of 39 °C or greater Observation&quot;\ndefine &quot;Fever of 39 °C or greater Condition&quot;:\n  Elements.&quot;Fever of 39 °C or greater Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Fever of 39 °C or greater Observation&quot;:\n  Elements.&quot;Fever of 39 °C or greater Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Fever of 39 °C or greater */\n\n/*\n@dataElement: HIV.D.DE977 - Weight loss reported\n@activity: HIV.D4 Screen for TB\n@description: Unexplained weight loss\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Weight loss reported&quot;:\n  exists &quot;Weight loss reported Condition&quot;\n    or exists &quot;Weight loss reported Observation&quot;\ndefine &quot;Weight loss reported Condition&quot;:\n  Elements.&quot;Weight loss reported Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Weight loss reported Observation&quot;:\n  Elements.&quot;Weight loss reported Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Weight loss reported */\n\n/*\n@dataElement: HIV.D.DE978 - Night sweats\n@activity: HIV.D4 Screen for TB\n@description: Client reports experiencing night sweats\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Night sweats&quot;:\n  exists &quot;Night sweats Condition&quot;\n    or exists &quot;Night sweats Observation&quot;\ndefine &quot;Night sweats Condition&quot;:\n  Elements.&quot;Night sweats Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Night sweats Observation&quot;:\n  Elements.&quot;Night sweats Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Night sweats */\n\n/*\n@dataElement: HIV.D.DE979 - Poor weight gain\n@activity: HIV.D4 Screen for TB\n@description: Client reports poor weight gain of child or infant or growth curve flattening or weight for age &lt;-2 Z-scores.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Poor weight gain&quot;:\n  exists &quot;Poor weight gain Condition&quot;\n    or exists &quot;Poor weight gain Observation&quot;\ndefine &quot;Poor weight gain Condition&quot;:\n  Elements.&quot;Poor weight gain Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Poor weight gain Observation&quot;:\n  Elements.&quot;Poor weight gain Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Poor weight gain */\n\n/*\n@dataElement: HIV.D.DE980 - Reduced playfulness\n@activity: HIV.D4 Screen for TB\n@description: Client reports reduced playfulness of child\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reduced playfulness&quot;:\n  exists &quot;Reduced playfulness Condition&quot;\n    or exists &quot;Reduced playfulness Observation&quot;\ndefine &quot;Reduced playfulness Condition&quot;:\n  Elements.&quot;Reduced playfulness Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Reduced playfulness Observation&quot;:\n  Elements.&quot;Reduced playfulness Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reduced playfulness */\n\n/*\n@dataElement: HIV.D.DE981 - Chest pain\n@activity: HIV.D4 Screen for TB\n@description: Client reports chest pain\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Chest pain&quot;:\n  exists &quot;Chest pain Condition&quot;\n    or exists &quot;Chest pain Observation&quot;\ndefine &quot;Chest pain Condition&quot;:\n  Elements.&quot;Chest pain Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Chest pain Observation&quot;:\n  Elements.&quot;Chest pain Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Chest pain */\n\n/*\n@dataElement: HIV.D.DE982 - Haemoptysis\n@activity: HIV.D4 Screen for TB\n@description: Client reports experiencing haemoptysis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Haemoptysis&quot;:\n  exists &quot;Haemoptysis Condition&quot;\n    or exists &quot;Haemoptysis Observation&quot;\ndefine &quot;Haemoptysis Condition&quot;:\n  Elements.&quot;Haemoptysis Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Haemoptysis Observation&quot;:\n  Elements.&quot;Haemoptysis Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Haemoptysis */\n\n/*\n@dataElement: HIV.D.DE983 - Lethargy\n@activity: HIV.D4 Screen for TB\n@description: Client reports lethargy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Lethargy D.DE983&quot;:\n  exists &quot;Lethargy D.DE983 Condition&quot;\n    or exists &quot;Lethargy D.DE983 Observation&quot;\ndefine &quot;Lethargy D.DE983 Condition&quot;:\n  Elements.&quot;Lethargy D.DE983 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Lethargy D.DE983 Observation&quot;:\n  Elements.&quot;Lethargy D.DE983 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Lethargy D.DE983 */\n\n/*\n@dataElement: HIV.D.DE984 - None\n@activity: HIV.D4 Screen for TB\n@description: No symptoms of TB identified\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;None&quot;:\n  exists &quot;None Condition&quot;\n    or exists &quot;None Observation&quot;\ndefine &quot;None Condition&quot;:\n  Elements.&quot;None Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;None Observation&quot;:\n  Elements.&quot;None Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of None */\n\n/*\n@dataElement: HIV.D.DE985 - History of contact with a person with TB\n@activity: HIV.D4 Screen for TB\n@description: Client had a history of a contact with a person with TB\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;History of contact with a person with TB&quot;:\n  exists &quot;History of contact with a person with TB Observation&quot;\ndefine &quot;History of contact with a person with TB Observation&quot;:\n  Elements.&quot;History of contact with a person with TB Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of History of contact with a person with TB */\n\n/*\n@dataElement: HIV.D.DE986 - TB screening result\n@activity: HIV.D4 Screen for TB\n@description: Record the result of the tuberculosis (TB) screening\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TB screening result&quot;:\n  exists &quot;TB screening result Observation&quot;\ndefine &quot;TB screening result Observation&quot;:\n  Elements.&quot;TB screening result Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TB screening result */\n\n/*\n@dataElement: HIV.D.DE987 - Screen positive for TB\n@activity: HIV.D4 Screen for TB\n@description: Screening result was positive for tuberculosis (TB)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Screen positive for TB&quot;:\n  exists &quot;Screen positive for TB Condition&quot;\n    or exists &quot;Screen positive for TB Observation&quot;\ndefine &quot;Screen positive for TB Condition&quot;:\n  Elements.&quot;Screen positive for TB Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Screen positive for TB Observation&quot;:\n  Elements.&quot;Screen positive for TB Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Screen positive for TB */\n\n/*\n@dataElement: HIV.D.DE988 - Screen negative for TB\n@activity: HIV.D4 Screen for TB\n@description: Screening result was negative for tuberculosis (TB)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Screen negative for TB&quot;:\n  exists &quot;Screen negative for TB Condition&quot;\n    or exists &quot;Screen negative for TB Observation&quot;\ndefine &quot;Screen negative for TB Condition&quot;:\n  Elements.&quot;Screen negative for TB Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Screen negative for TB Observation&quot;:\n  Elements.&quot;Screen negative for TB Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Screen negative for TB */\n\n/*\n@dataElement: HIV.D.DE989 - Inconclusive\n@activity: HIV.D4 Screen for TB\n@description: Screening result was inconclusive for tuberculosis (TB)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Inconclusive D.DE989&quot;:\n  exists &quot;Inconclusive D.DE989 Condition&quot;\n    or exists &quot;Inconclusive D.DE989 Observation&quot;\ndefine &quot;Inconclusive D.DE989 Condition&quot;:\n  Elements.&quot;Inconclusive D.DE989 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Inconclusive D.DE989 Observation&quot;:\n  Elements.&quot;Inconclusive D.DE989 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Inconclusive D.DE989 */\n\n/*\n@dataElement: HIV.D.DE1023 - TB prevention services accepted\n@activity: HIV.D21 Determine regimen and treatment options\n@description: Indicates if the client accepts to be evaluated for TB infection and to take the treatment in case he/she is eligible\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;TB prevention services accepted&quot;:\n  exists &quot;TB prevention services accepted Observation&quot;\ndefine &quot;TB prevention services accepted Observation&quot;:\n  Elements.&quot;TB prevention services accepted Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of TB prevention services accepted */\n\n/*\n@dataElement: HIV.D.DE1026 - C reactive protein test result\n@activity: HIV.D4 Screen for TB\n@description: Test result of the client's C reactive protein test result in mg/L\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;C reactive protein test result&quot;:\n  Elements.&quot;C reactive protein test result&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;C reactive protein test result Value&quot;:\n  &quot;C reactive protein test result&quot; O\n  return O.value\n/* End of C reactive protein test result */\n\n/*\n@dataElement: HIV.E.DE85 - ANC contact date\n@activity: HIV.E1 Capture or update mother's history\n@description: The date and time of the client's ANC contact (in the ANC DAK this is called 'Contact date')\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ANC contact date E.DE85&quot;:\n  Elements.&quot;ANC contact date E.DE85&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;ANC contact date E.DE85 Value&quot;:\n  &quot;ANC contact date E.DE85&quot; O\n  return O.value\n/* End of ANC contact date E.DE85 */\n\n/*\n@dataElement: HIV.E.DE113 - Key population member\n@activity: HIV.E1 Capture or update mother's history\n@description: Mother is a member of a key population which has an increased risk of HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Key population member E.DE113&quot;:\n  exists &quot;Key population member E.DE113 Observation&quot;\ndefine &quot;Key population member E.DE113 Observation&quot;:\n  Elements.&quot;Key population member E.DE113 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Key population member E.DE113 */\n\n/*\n@dataElement: HIV.E.DE114 - Key population member type\n@activity: HIV.E1 Capture or update mother's history\n@description: The type of key population that the infant's mother is included in\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Key population member type E.DE114&quot;:\n  exists &quot;Key population member type E.DE114 Observation&quot;\ndefine &quot;Key population member type E.DE114 Observation&quot;:\n  Elements.&quot;Key population member type E.DE114 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Key population member type E.DE114 */\n\n/*\n@dataElement: HIV.E.DE115 - Sex worker\n@activity: HIV.E1 Capture or update mother's history\n@description: Infant's mother is a sex worker\n*/\ndefine &quot;Sex worker E.DE115&quot;:\n  Elements.&quot;Sex worker E.DE115&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Sex worker E.DE115 */\n\n/*\n@dataElement: HIV.E.DE116 - People who inject drugs\n@activity: HIV.E1 Capture or update mother's history\n@description: Infant's mother is a person who injects drugs\n*/\ndefine &quot;People who inject drugs E.DE116&quot;:\n  Elements.&quot;People who inject drugs E.DE116&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of People who inject drugs E.DE116 */\n\n/*\n@dataElement: HIV.E.DE117 - Trans and gender-diverse people\n@activity: HIV.E1 Capture or update mother's history\n@description: Infant's mother identifies as trans and gender-diverse\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Trans and gender-diverse people E.DE117&quot;:\n  Elements.&quot;Trans and gender-diverse people E.DE117&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Trans and gender-diverse people E.DE117 */\n\n/*\n@dataElement: HIV.E.DE118 - People living in prisons and other closed setting\n@activity: HIV.E1 Capture or update mother's history\n@description: Infant's mother is in a prison or closed setting\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;People living in prisons and other closed setting&quot;:\n  Elements.&quot;People living in prisons and other closed setting&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of People living in prisons and other closed setting */\n\n/*\n@dataElement: HIV.E.DE155 - Signs of substantial risk of HIV infection\n@activity: HIV.E1 Capture or update mother's history\n@description: Signs the client is at a substantial risk of HIV infection\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Signs of substantial risk of HIV infection E.DE155&quot;:\n  exists &quot;Signs of substantial risk of HIV infection E.DE155 Observation&quot;\ndefine &quot;Signs of substantial risk of HIV infection E.DE155 Observation&quot;:\n  Elements.&quot;Signs of substantial risk of HIV infection E.DE155 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Signs of substantial risk of HIV infection E.DE155 */\n\n/*\n@dataElement: HIV.E.DE156 - No condom use during sex with more than one partner in the past 6 months\n@activity: HIV.E1 Capture or update mother's history\n@description: Recent vaginal or anal sexual intercourse without a condom with more than one partner\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;No condom use during sex with more than one partner in the past 6 months E.DE156&quot;:\n  exists &quot;No condom use during sex with more than one partner in the past 6 months E.DE156 Condition&quot;\n    or exists &quot;No condom use during sex with more than one partner in the past 6 months E.DE156 Observation&quot;\ndefine &quot;No condom use during sex with more than one partner in the past 6 months E.DE156 Condition&quot;:\n  Elements.&quot;No condom use during sex with more than one partner in the past 6 months E.DE156 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;No condom use during sex with more than one partner in the past 6 months E.DE156 Observation&quot;:\n  Elements.&quot;No condom use during sex with more than one partner in the past 6 months E.DE156 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of No condom use during sex with more than one partner in the past 6 months E.DE156 */\n\n/*\n@dataElement: HIV.E.DE157 - STI in the past 6 months\n@activity: HIV.E1 Capture or update mother's history\n@description: A recent history (in the last 6 months) of a sexually transmitted infection (STI) by laboratory testing or self-report of syndromic STI treatment\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;STI in the past 6 months E.DE157&quot;:\n  exists &quot;STI in the past 6 months E.DE157 Condition&quot;\n    or exists &quot;STI in the past 6 months E.DE157 Observation&quot;\ndefine &quot;STI in the past 6 months E.DE157 Condition&quot;:\n  Elements.&quot;STI in the past 6 months E.DE157 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;STI in the past 6 months E.DE157 Observation&quot;:\n  Elements.&quot;STI in the past 6 months E.DE157 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of STI in the past 6 months E.DE157 */\n\n/*\n@dataElement: HIV.E.DE158 - A sexual partner in the past 6 months had one or more HIV risk factors\n@activity: HIV.E1 Capture or update mother's history\n@description: A recent sex partner of the client had HIV risk factors\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;A sexual partner in the past 6 months had one or more HIV risk factors E.DE158&quot;:\n  exists &quot;A sexual partner in the past 6 months had one or more HIV risk factors E.DE158 Condition&quot;\n    or exists &quot;A sexual partner in the past 6 months had one or more HIV risk factors E.DE158 Observation&quot;\ndefine &quot;A sexual partner in the past 6 months had one or more HIV risk factors E.DE158 Condition&quot;:\n  Elements.&quot;A sexual partner in the past 6 months had one or more HIV risk factors E.DE158 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;A sexual partner in the past 6 months had one or more HIV risk factors E.DE158 Observation&quot;:\n  Elements.&quot;A sexual partner in the past 6 months had one or more HIV risk factors E.DE158 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of A sexual partner in the past 6 months had one or more HIV risk factors E.DE158 */\n\n/*\n@dataElement: HIV.E.DE159 - PrEP requested by client\n@activity: HIV.E1 Capture or update mother's history\n@description: Client is requesting PrEP, reflecting a decision-making process has already taken place and suggesting of substantial risk of HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;PrEP requested by client E.DE159&quot;:\n  exists &quot;PrEP requested by client E.DE159 Condition&quot;\n    or exists &quot;PrEP requested by client E.DE159 Observation&quot;\ndefine &quot;PrEP requested by client E.DE159 Condition&quot;:\n  Elements.&quot;PrEP requested by client E.DE159 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;PrEP requested by client E.DE159 Observation&quot;:\n  Elements.&quot;PrEP requested by client E.DE159 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of PrEP requested by client E.DE159 */\n\n/*\n@dataElement: HIV.E.DE160 - Serodiscordant partner\n@activity: HIV.E1 Capture or update mother's history\n@description: Mother's HIV status is different from a current partner's HIV status\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Serodiscordant partner E.DE160&quot;:\n  exists &quot;Serodiscordant partner E.DE160 Observation&quot;\ndefine &quot;Serodiscordant partner E.DE160 Observation&quot;:\n  Elements.&quot;Serodiscordant partner E.DE160 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Serodiscordant partner E.DE160 */\n\n/*\n@dataElement: HIV.E.DE168 - HIV test type\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: Type of HIV test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV test type E.DE168&quot;:\n  exists &quot;HIV test type E.DE168 Observation&quot;\ndefine &quot;HIV test type E.DE168 Observation&quot;:\n  Elements.&quot;HIV test type E.DE168 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV test type E.DE168 */\n\n/*\n@dataElement: HIV.E.DE169 - Rapid diagnostic test for HIV\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: Antibody test for HIV performed with a rapid diagnostic (RDT)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Rapid diagnostic test for HIV E.DE169&quot;:\n  exists &quot;Rapid diagnostic test for HIV E.DE169 Condition&quot;\n    or exists &quot;Rapid diagnostic test for HIV E.DE169 Observation&quot;\ndefine &quot;Rapid diagnostic test for HIV E.DE169 Condition&quot;:\n  Elements.&quot;Rapid diagnostic test for HIV E.DE169 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Rapid diagnostic test for HIV E.DE169 Observation&quot;:\n  Elements.&quot;Rapid diagnostic test for HIV E.DE169 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Rapid diagnostic test for HIV E.DE169 */\n\n/*\n@dataElement: HIV.E.DE170 - Enzyme immunoassay for HIV\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: Antibody test for HIV performed with an enzyme immunoassay (EIA)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Enzyme immunoassay for HIV E.DE170&quot;:\n  exists &quot;Enzyme immunoassay for HIV E.DE170 Condition&quot;\n    or exists &quot;Enzyme immunoassay for HIV E.DE170 Observation&quot;\ndefine &quot;Enzyme immunoassay for HIV E.DE170 Condition&quot;:\n  Elements.&quot;Enzyme immunoassay for HIV E.DE170 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Enzyme immunoassay for HIV E.DE170 Observation&quot;:\n  Elements.&quot;Enzyme immunoassay for HIV E.DE170 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Enzyme immunoassay for HIV E.DE170 */\n\n/*\n@dataElement: HIV.E.DE171 - Nucleic acid test for HIV\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: Virological test, which includes testing for early infant diagnosis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Nucleic acid test for HIV E.DE171&quot;:\n  exists &quot;Nucleic acid test for HIV E.DE171 Condition&quot;\n    or exists &quot;Nucleic acid test for HIV E.DE171 Observation&quot;\ndefine &quot;Nucleic acid test for HIV E.DE171 Condition&quot;:\n  Elements.&quot;Nucleic acid test for HIV E.DE171 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Nucleic acid test for HIV E.DE171 Observation&quot;:\n  Elements.&quot;Nucleic acid test for HIV E.DE171 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Nucleic acid test for HIV E.DE171 */\n\n/*\n@dataElement: HIV.E.DE172 - Dual HIV/syphilis rapid diagnostic test\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: Antibody test for HIV and syphilis performed with a rapid diagnostic\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Dual HIV/syphilis rapid diagnostic test E.DE172&quot;:\n  exists &quot;Dual HIV/syphilis rapid diagnostic test E.DE172 Condition&quot;\n    or exists &quot;Dual HIV/syphilis rapid diagnostic test E.DE172 Observation&quot;\ndefine &quot;Dual HIV/syphilis rapid diagnostic test E.DE172 Condition&quot;:\n  Elements.&quot;Dual HIV/syphilis rapid diagnostic test E.DE172 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Dual HIV/syphilis rapid diagnostic test E.DE172 Observation&quot;:\n  Elements.&quot;Dual HIV/syphilis rapid diagnostic test E.DE172 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Dual HIV/syphilis rapid diagnostic test E.DE172 */\n\n/*\n@dataElement: HIV.E.DE180 - EID sample number\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Early infant diagnosis (EID) sample number\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;EID sample number&quot;:\n  exists &quot;EID sample number Observation&quot;\ndefine &quot;EID sample number Observation&quot;:\n  Elements.&quot;EID sample number Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of EID sample number */\n\n/*\n@dataElement: HIV.E.DE181 - EID sample 1\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: First sample used to test an infant for HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;EID sample 1&quot;:\n  exists &quot;EID sample 1 Condition&quot;\n    or exists &quot;EID sample 1 Observation&quot;\ndefine &quot;EID sample 1 Condition&quot;:\n  Elements.&quot;EID sample 1 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;EID sample 1 Observation&quot;:\n  Elements.&quot;EID sample 1 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of EID sample 1 */\n\n/*\n@dataElement: HIV.E.DE182 - EID sample 2\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Second sample used to test an infant for HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;EID sample 2&quot;:\n  exists &quot;EID sample 2 Condition&quot;\n    or exists &quot;EID sample 2 Observation&quot;\ndefine &quot;EID sample 2 Condition&quot;:\n  Elements.&quot;EID sample 2 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;EID sample 2 Observation&quot;:\n  Elements.&quot;EID sample 2 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of EID sample 2 */\n\n/*\n@dataElement: HIV.E.DE183 - EID test number\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Early infant diagnosis (EID) HIV test number using the same sample\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;EID test number&quot;:\n  exists &quot;EID test number Observation&quot;\ndefine &quot;EID test number Observation&quot;:\n  Elements.&quot;EID test number Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of EID test number */\n\n/*\n@dataElement: HIV.E.DE184 - EID test number 1\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: First test on a sample to test an infant for HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;EID test number 1&quot;:\n  exists &quot;EID test number 1 Condition&quot;\n    or exists &quot;EID test number 1 Observation&quot;\ndefine &quot;EID test number 1 Condition&quot;:\n  Elements.&quot;EID test number 1 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;EID test number 1 Observation&quot;:\n  Elements.&quot;EID test number 1 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of EID test number 1 */\n\n/*\n@dataElement: HIV.E.DE185 - EID test number 2\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Second test on a sample to test an infant for HIV\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;EID test number 2&quot;:\n  exists &quot;EID test number 2 Condition&quot;\n    or exists &quot;EID test number 2 Observation&quot;\ndefine &quot;EID test number 2 Condition&quot;:\n  Elements.&quot;EID test number 2 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;EID test number 2 Observation&quot;:\n  Elements.&quot;EID test number 2 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of EID test number 2 */\n\n/*\n@dataElement: HIV.E.DE186 - EID test number 1 test result\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Early infant diagnosis test number 1 test result\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;EID test number 1 test result&quot;:\n  exists &quot;EID test number 1 test result Observation&quot;\ndefine &quot;EID test number 1 test result Observation&quot;:\n  Elements.&quot;EID test number 1 test result Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of EID test number 1 test result */\n\n/*\n@dataElement: HIV.E.DE187 - Positive\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Positive HIV test result from the nucleic acid test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Positive E.DE187&quot;:\n  exists &quot;Positive E.DE187 Condition&quot;\n    or exists &quot;Positive E.DE187 Observation&quot;\ndefine &quot;Positive E.DE187 Condition&quot;:\n  Elements.&quot;Positive E.DE187 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Positive E.DE187 Observation&quot;:\n  Elements.&quot;Positive E.DE187 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Positive E.DE187 */\n\n/*\n@dataElement: HIV.E.DE188 - Negative\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Negative HIV test result from the nucleic acid test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Negative E.DE188&quot;:\n  exists &quot;Negative E.DE188 Condition&quot;\n    or exists &quot;Negative E.DE188 Observation&quot;\ndefine &quot;Negative E.DE188 Condition&quot;:\n  Elements.&quot;Negative E.DE188 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Negative E.DE188 Observation&quot;:\n  Elements.&quot;Negative E.DE188 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Negative E.DE188 */\n\n/*\n@dataElement: HIV.E.DE189 - Indeterminate\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Indeterminate HIV test result from the nucleic acid test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Indeterminate E.DE189&quot;:\n  exists &quot;Indeterminate E.DE189 Condition&quot;\n    or exists &quot;Indeterminate E.DE189 Observation&quot;\ndefine &quot;Indeterminate E.DE189 Condition&quot;:\n  Elements.&quot;Indeterminate E.DE189 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Indeterminate E.DE189 Observation&quot;:\n  Elements.&quot;Indeterminate E.DE189 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Indeterminate E.DE189 */\n\n/*\n@dataElement: HIV.E.DE190 - EID test number 2 test result\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Early infant diagnosis test number 2 test result\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;EID test number 2 test result&quot;:\n  exists &quot;EID test number 2 test result Observation&quot;\ndefine &quot;EID test number 2 test result Observation&quot;:\n  Elements.&quot;EID test number 2 test result Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of EID test number 2 test result */\n\n/*\n@dataElement: HIV.E.DE191 - Positive\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Positive HIV test result from the nucleic acid test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Positive E.DE191&quot;:\n  exists &quot;Positive E.DE191 Condition&quot;\n    or exists &quot;Positive E.DE191 Observation&quot;\ndefine &quot;Positive E.DE191 Condition&quot;:\n  Elements.&quot;Positive E.DE191 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Positive E.DE191 Observation&quot;:\n  Elements.&quot;Positive E.DE191 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Positive E.DE191 */\n\n/*\n@dataElement: HIV.E.DE192 - Negative\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Negative HIV test result from the nucleic acid test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Negative E.DE192&quot;:\n  exists &quot;Negative E.DE192 Condition&quot;\n    or exists &quot;Negative E.DE192 Observation&quot;\ndefine &quot;Negative E.DE192 Condition&quot;:\n  Elements.&quot;Negative E.DE192 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Negative E.DE192 Observation&quot;:\n  Elements.&quot;Negative E.DE192 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Negative E.DE192 */\n\n/*\n@dataElement: HIV.E.DE193 - Indeterminate\n@activity: HIV.F8 Test infant/child for HIV using testing algorithm\n@description: Indeterminate HIV test result from the nucleic acid test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Indeterminate E.DE193&quot;:\n  exists &quot;Indeterminate E.DE193 Condition&quot;\n    or exists &quot;Indeterminate E.DE193 Observation&quot;\ndefine &quot;Indeterminate E.DE193 Condition&quot;:\n  Elements.&quot;Indeterminate E.DE193 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Indeterminate E.DE193 Observation&quot;:\n  Elements.&quot;Indeterminate E.DE193 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Indeterminate E.DE193 */\n\n/*\n@dataElement: HIV.E.DE194 - Assay number in testing strategy\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The number of the assay (test kit) in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay number in testing strategy E.DE194&quot;:\n  exists &quot;Assay number in testing strategy E.DE194 Observation&quot;\ndefine &quot;Assay number in testing strategy E.DE194 Observation&quot;:\n  Elements.&quot;Assay number in testing strategy E.DE194 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay number in testing strategy E.DE194 */\n\n/*\n@dataElement: HIV.E.DE195 - Assay 0\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: A community outreach test-for-triage or self-test which is not included in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay 0 E.DE195&quot;:\n  exists &quot;Assay 0 E.DE195 Condition&quot;\n    or exists &quot;Assay 0 E.DE195 Observation&quot;\ndefine &quot;Assay 0 E.DE195 Condition&quot;:\n  Elements.&quot;Assay 0 E.DE195 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assay 0 E.DE195 Observation&quot;:\n  Elements.&quot;Assay 0 E.DE195 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay 0 E.DE195 */\n\n/*\n@dataElement: HIV.E.DE196 - Assay 1\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The first test in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay 1 E.DE196&quot;:\n  exists &quot;Assay 1 E.DE196 Condition&quot;\n    or exists &quot;Assay 1 E.DE196 Observation&quot;\ndefine &quot;Assay 1 E.DE196 Condition&quot;:\n  Elements.&quot;Assay 1 E.DE196 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assay 1 E.DE196 Observation&quot;:\n  Elements.&quot;Assay 1 E.DE196 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay 1 E.DE196 */\n\n/*\n@dataElement: HIV.E.DE197 - Assay 2\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The second test in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay 2 E.DE197&quot;:\n  exists &quot;Assay 2 E.DE197 Condition&quot;\n    or exists &quot;Assay 2 E.DE197 Observation&quot;\ndefine &quot;Assay 2 E.DE197 Condition&quot;:\n  Elements.&quot;Assay 2 E.DE197 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assay 2 E.DE197 Observation&quot;:\n  Elements.&quot;Assay 2 E.DE197 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay 2 E.DE197 */\n\n/*\n@dataElement: HIV.E.DE198 - Assay 3\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The third test in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay 3 E.DE198&quot;:\n  exists &quot;Assay 3 E.DE198 Condition&quot;\n    or exists &quot;Assay 3 E.DE198 Observation&quot;\ndefine &quot;Assay 3 E.DE198 Condition&quot;:\n  Elements.&quot;Assay 3 E.DE198 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assay 3 E.DE198 Observation&quot;:\n  Elements.&quot;Assay 3 E.DE198 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay 3 E.DE198 */\n\n/*\n@dataElement: HIV.E.DE199 - Assay 1 repeated\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The first test in the HIV testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Assay 1 repeated E.DE199&quot;:\n  exists &quot;Assay 1 repeated E.DE199 Condition&quot;\n    or exists &quot;Assay 1 repeated E.DE199 Observation&quot;\ndefine &quot;Assay 1 repeated E.DE199 Condition&quot;:\n  Elements.&quot;Assay 1 repeated E.DE199 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Assay 1 repeated E.DE199 Observation&quot;:\n  Elements.&quot;Assay 1 repeated E.DE199 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Assay 1 repeated E.DE199 */\n\n/*\n@dataElement: HIV.E.DE200 - Test result of HIV assay 1\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the first HIV assay in the testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Test result of HIV assay 1 E.DE200&quot;:\n  exists &quot;Test result of HIV assay 1 E.DE200 Observation&quot;\ndefine &quot;Test result of HIV assay 1 E.DE200 Observation&quot;:\n  Elements.&quot;Test result of HIV assay 1 E.DE200 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Test result of HIV assay 1 E.DE200 */\n\n/*\n@dataElement: HIV.E.DE201 - Reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reactive E.DE201&quot;:\n  exists &quot;Reactive E.DE201 Condition&quot;\n    or exists &quot;Reactive E.DE201 Observation&quot;\ndefine &quot;Reactive E.DE201 Condition&quot;:\n  Elements.&quot;Reactive E.DE201 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Reactive E.DE201 Observation&quot;:\n  Elements.&quot;Reactive E.DE201 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reactive E.DE201 */\n\n/*\n@dataElement: HIV.E.DE202 - Non-reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was non-reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Non-reactive E.DE202&quot;:\n  exists &quot;Non-reactive E.DE202 Condition&quot;\n    or exists &quot;Non-reactive E.DE202 Observation&quot;\ndefine &quot;Non-reactive E.DE202 Condition&quot;:\n  Elements.&quot;Non-reactive E.DE202 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Non-reactive E.DE202 Observation&quot;:\n  Elements.&quot;Non-reactive E.DE202 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Non-reactive E.DE202 */\n\n/*\n@dataElement: HIV.E.DE203 - Invalid\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was invalid\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Invalid E.DE203&quot;:\n  exists &quot;Invalid E.DE203 Condition&quot;\n    or exists &quot;Invalid E.DE203 Observation&quot;\ndefine &quot;Invalid E.DE203 Condition&quot;:\n  Elements.&quot;Invalid E.DE203 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Invalid E.DE203 Observation&quot;:\n  Elements.&quot;Invalid E.DE203 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Invalid E.DE203 */\n\n/*\n@dataElement: HIV.E.DE204 - Test result of HIV assay 2\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the second HIV assay in the testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Test result of HIV assay 2 E.DE204&quot;:\n  exists &quot;Test result of HIV assay 2 E.DE204 Observation&quot;\ndefine &quot;Test result of HIV assay 2 E.DE204 Observation&quot;:\n  Elements.&quot;Test result of HIV assay 2 E.DE204 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Test result of HIV assay 2 E.DE204 */\n\n/*\n@dataElement: HIV.E.DE205 - Reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reactive E.DE205&quot;:\n  exists &quot;Reactive E.DE205 Condition&quot;\n    or exists &quot;Reactive E.DE205 Observation&quot;\ndefine &quot;Reactive E.DE205 Condition&quot;:\n  Elements.&quot;Reactive E.DE205 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Reactive E.DE205 Observation&quot;:\n  Elements.&quot;Reactive E.DE205 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reactive E.DE205 */\n\n/*\n@dataElement: HIV.E.DE206 - Non-reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was non-reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Non-reactive E.DE206&quot;:\n  exists &quot;Non-reactive E.DE206 Condition&quot;\n    or exists &quot;Non-reactive E.DE206 Observation&quot;\ndefine &quot;Non-reactive E.DE206 Condition&quot;:\n  Elements.&quot;Non-reactive E.DE206 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Non-reactive E.DE206 Observation&quot;:\n  Elements.&quot;Non-reactive E.DE206 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Non-reactive E.DE206 */\n\n/*\n@dataElement: HIV.E.DE207 - Invalid\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was invalid\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Invalid E.DE207&quot;:\n  exists &quot;Invalid E.DE207 Condition&quot;\n    or exists &quot;Invalid E.DE207 Observation&quot;\ndefine &quot;Invalid E.DE207 Condition&quot;:\n  Elements.&quot;Invalid E.DE207 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Invalid E.DE207 Observation&quot;:\n  Elements.&quot;Invalid E.DE207 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Invalid E.DE207 */\n\n/*\n@dataElement: HIV.E.DE208 - Test result of HIV assay 3\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the third HIV assay in the testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Test result of HIV assay 3 E.DE208&quot;:\n  exists &quot;Test result of HIV assay 3 E.DE208 Observation&quot;\ndefine &quot;Test result of HIV assay 3 E.DE208 Observation&quot;:\n  Elements.&quot;Test result of HIV assay 3 E.DE208 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Test result of HIV assay 3 E.DE208 */\n\n/*\n@dataElement: HIV.E.DE209 - Reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reactive E.DE209&quot;:\n  exists &quot;Reactive E.DE209 Condition&quot;\n    or exists &quot;Reactive E.DE209 Observation&quot;\ndefine &quot;Reactive E.DE209 Condition&quot;:\n  Elements.&quot;Reactive E.DE209 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Reactive E.DE209 Observation&quot;:\n  Elements.&quot;Reactive E.DE209 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reactive E.DE209 */\n\n/*\n@dataElement: HIV.E.DE210 - Non-reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was non-reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Non-reactive E.DE210&quot;:\n  exists &quot;Non-reactive E.DE210 Condition&quot;\n    or exists &quot;Non-reactive E.DE210 Observation&quot;\ndefine &quot;Non-reactive E.DE210 Condition&quot;:\n  Elements.&quot;Non-reactive E.DE210 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Non-reactive E.DE210 Observation&quot;:\n  Elements.&quot;Non-reactive E.DE210 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Non-reactive E.DE210 */\n\n/*\n@dataElement: HIV.E.DE211 - Invalid\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was invalid\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Invalid E.DE211&quot;:\n  exists &quot;Invalid E.DE211 Condition&quot;\n    or exists &quot;Invalid E.DE211 Observation&quot;\ndefine &quot;Invalid E.DE211 Condition&quot;:\n  Elements.&quot;Invalid E.DE211 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Invalid E.DE211 Observation&quot;:\n  Elements.&quot;Invalid E.DE211 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Invalid E.DE211 */\n\n/*\n@dataElement: HIV.E.DE212 - Test result of HIV assay 1 repeated\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the repeated first HIV assay in the testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Test result of HIV assay 1 repeated E.DE212&quot;:\n  exists &quot;Test result of HIV assay 1 repeated E.DE212 Observation&quot;\ndefine &quot;Test result of HIV assay 1 repeated E.DE212 Observation&quot;:\n  Elements.&quot;Test result of HIV assay 1 repeated E.DE212 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Test result of HIV assay 1 repeated E.DE212 */\n\n/*\n@dataElement: HIV.E.DE213 - Reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reactive E.DE213&quot;:\n  exists &quot;Reactive E.DE213 Condition&quot;\n    or exists &quot;Reactive E.DE213 Observation&quot;\ndefine &quot;Reactive E.DE213 Condition&quot;:\n  Elements.&quot;Reactive E.DE213 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Reactive E.DE213 Observation&quot;:\n  Elements.&quot;Reactive E.DE213 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reactive E.DE213 */\n\n/*\n@dataElement: HIV.E.DE214 - Non-reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was non-reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Non-reactive E.DE214&quot;:\n  exists &quot;Non-reactive E.DE214 Condition&quot;\n    or exists &quot;Non-reactive E.DE214 Observation&quot;\ndefine &quot;Non-reactive E.DE214 Condition&quot;:\n  Elements.&quot;Non-reactive E.DE214 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Non-reactive E.DE214 Observation&quot;:\n  Elements.&quot;Non-reactive E.DE214 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Non-reactive E.DE214 */\n\n/*\n@dataElement: HIV.E.DE215 - Invalid\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was invalid\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Invalid E.DE215&quot;:\n  exists &quot;Invalid E.DE215 Condition&quot;\n    or exists &quot;Invalid E.DE215 Observation&quot;\ndefine &quot;Invalid E.DE215 Condition&quot;:\n  Elements.&quot;Invalid E.DE215 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Invalid E.DE215 Observation&quot;:\n  Elements.&quot;Invalid E.DE215 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Invalid E.DE215 */\n\n/*\n@dataElement: HIV.E.DE216 - Test result of syphilis assay 1\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the first syphilis assay in the testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Test result of syphilis assay 1&quot;:\n  exists &quot;Test result of syphilis assay 1 Observation&quot;\ndefine &quot;Test result of syphilis assay 1 Observation&quot;:\n  Elements.&quot;Test result of syphilis assay 1 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Test result of syphilis assay 1 */\n\n/*\n@dataElement: HIV.E.DE217 - Reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the first syphilis assay in the testing strategy was reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reactive E.DE217&quot;:\n  exists &quot;Reactive E.DE217 Condition&quot;\n    or exists &quot;Reactive E.DE217 Observation&quot;\ndefine &quot;Reactive E.DE217 Condition&quot;:\n  Elements.&quot;Reactive E.DE217 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Reactive E.DE217 Observation&quot;:\n  Elements.&quot;Reactive E.DE217 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reactive E.DE217 */\n\n/*\n@dataElement: HIV.E.DE218 - Non-reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the first syphilis assay in the testing strategy was non-reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Non-reactive E.DE218&quot;:\n  exists &quot;Non-reactive E.DE218 Condition&quot;\n    or exists &quot;Non-reactive E.DE218 Observation&quot;\ndefine &quot;Non-reactive E.DE218 Condition&quot;:\n  Elements.&quot;Non-reactive E.DE218 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Non-reactive E.DE218 Observation&quot;:\n  Elements.&quot;Non-reactive E.DE218 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Non-reactive E.DE218 */\n\n/*\n@dataElement: HIV.E.DE219 - Invalid\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the HIV assay in the testing strategy was invalid\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Invalid E.DE219&quot;:\n  exists &quot;Invalid E.DE219 Condition&quot;\n    or exists &quot;Invalid E.DE219 Observation&quot;\ndefine &quot;Invalid E.DE219 Condition&quot;:\n  Elements.&quot;Invalid E.DE219 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Invalid E.DE219 Observation&quot;:\n  Elements.&quot;Invalid E.DE219 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Invalid E.DE219 */\n\n/*\n@dataElement: HIV.E.DE220 - Test result of syphilis assay 1 repeated\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the first syphilis assay repeated in the testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Test result of syphilis assay 1 repeated&quot;:\n  exists &quot;Test result of syphilis assay 1 repeated Observation&quot;\ndefine &quot;Test result of syphilis assay 1 repeated Observation&quot;:\n  Elements.&quot;Test result of syphilis assay 1 repeated Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Test result of syphilis assay 1 repeated */\n\n/*\n@dataElement: HIV.E.DE221 - Reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the first syphilis assay repeated in the testing strategy was reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Reactive E.DE221&quot;:\n  exists &quot;Reactive E.DE221 Condition&quot;\n    or exists &quot;Reactive E.DE221 Observation&quot;\ndefine &quot;Reactive E.DE221 Condition&quot;:\n  Elements.&quot;Reactive E.DE221 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Reactive E.DE221 Observation&quot;:\n  Elements.&quot;Reactive E.DE221 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Reactive E.DE221 */\n\n/*\n@dataElement: HIV.E.DE222 - Non-reactive\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the first syphilis assay repeated in the testing strategy was non-reactive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Non-reactive E.DE222&quot;:\n  exists &quot;Non-reactive E.DE222 Condition&quot;\n    or exists &quot;Non-reactive E.DE222 Observation&quot;\ndefine &quot;Non-reactive E.DE222 Condition&quot;:\n  Elements.&quot;Non-reactive E.DE222 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Non-reactive E.DE222 Observation&quot;:\n  Elements.&quot;Non-reactive E.DE222 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Non-reactive E.DE222 */\n\n/*\n@dataElement: HIV.E.DE223 - Invalid\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the first syphilis assay repeated in the testing strategy was invalid\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Invalid E.DE223&quot;:\n  exists &quot;Invalid E.DE223 Condition&quot;\n    or exists &quot;Invalid E.DE223 Observation&quot;\ndefine &quot;Invalid E.DE223 Condition&quot;:\n  Elements.&quot;Invalid E.DE223 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Invalid E.DE223 Observation&quot;:\n  Elements.&quot;Invalid E.DE223 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Invalid E.DE223 */\n\n/*\n@dataElement: HIV.G.DE1 - CD4 count\n@activity: HIV.D20 Diagnostics\n@description: CD4 cell count in cells/mm^3\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;CD4 count G.DE1&quot;:\n  Elements.&quot;CD4 count G.DE1&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;CD4 count G.DE1 Value&quot;:\n  &quot;CD4 count G.DE1&quot; O\n  return O.value\n/* End of CD4 count G.DE1 */\n\n/*\n@dataElement: HIV.G.DE8 - Date of viral load sample collection\n@activity: HIV.D20 Diagnostics\n@description: Date and time when the sample was collected to test the client's HIV viral load\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date of viral load sample collection G.DE8&quot;:\n  Elements.&quot;Date of viral load sample collection G.DE8&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Date of viral load sample collection G.DE8 Value&quot;:\n  &quot;Date of viral load sample collection G.DE8&quot; O\n  return O.value\n/* End of Date of viral load sample collection G.DE8 */\n\n/*\n@dataElement: HIV.G.DE12 - Viral load test result\n@activity: HIV.D20 Diagnostics\n@description: Result from the viral load test in number of copies/mL\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Viral load test result G.DE12&quot;:\n  Elements.&quot;Viral load test result G.DE12&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Viral load test result G.DE12 Value&quot;:\n  &quot;Viral load test result G.DE12&quot; O\n  return O.value\n/* End of Viral load test result G.DE12 */\n\n/*\n@dataElement: HIV.G.DE18 - HBsAg test result\n@activity: HIV.D20 Diagnostics\n@description: Hepatitis B virus test result (HBsAg)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HBsAg test result G.DE18&quot;:\n  exists &quot;HBsAg test result G.DE18 Observation&quot;\ndefine &quot;HBsAg test result G.DE18 Observation&quot;:\n  Elements.&quot;HBsAg test result G.DE18 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HBsAg test result G.DE18 */\n\n/*\n@dataElement: HIV.G.DE19 - Positive\n@activity: HIV.D20 Diagnostics\n@description: HBsAg test result was positive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Positive G.DE19&quot;:\n  exists &quot;Positive G.DE19 Condition&quot;\n    or exists &quot;Positive G.DE19 Observation&quot;\ndefine &quot;Positive G.DE19 Condition&quot;:\n  Elements.&quot;Positive G.DE19 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Positive G.DE19 Observation&quot;:\n  Elements.&quot;Positive G.DE19 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Positive G.DE19 */\n\n/*\n@dataElement: HIV.G.DE20 - Negative\n@activity: HIV.D20 Diagnostics\n@description: HBsAg test result was negative\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Negative G.DE20&quot;:\n  exists &quot;Negative G.DE20 Condition&quot;\n    or exists &quot;Negative G.DE20 Observation&quot;\ndefine &quot;Negative G.DE20 Condition&quot;:\n  Elements.&quot;Negative G.DE20 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Negative G.DE20 Observation&quot;:\n  Elements.&quot;Negative G.DE20 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Negative G.DE20 */\n\n/*\n@dataElement: HIV.G.DE21 - Indeterminate\n@activity: HIV.D20 Diagnostics\n@description: HBsAg test result was indeterminate\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Indeterminate G.DE21&quot;:\n  exists &quot;Indeterminate G.DE21 Condition&quot;\n    or exists &quot;Indeterminate G.DE21 Observation&quot;\ndefine &quot;Indeterminate G.DE21 Condition&quot;:\n  Elements.&quot;Indeterminate G.DE21 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Indeterminate G.DE21 Observation&quot;:\n  Elements.&quot;Indeterminate G.DE21 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Indeterminate G.DE21 */\n\n/*\n@dataElement: HIV.G.DE43 - HCV test result\n@activity: HIV.D20 Diagnostics\n@description: Hepatitis C virus test result (HCV antibody, HCV RNA or HCV core antigen)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HCV test result G.DE43&quot;:\n  exists &quot;HCV test result G.DE43 Observation&quot;\ndefine &quot;HCV test result G.DE43 Observation&quot;:\n  Elements.&quot;HCV test result G.DE43 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HCV test result G.DE43 */\n\n/*\n@dataElement: HIV.G.DE44 - Positive\n@activity: HIV.D20 Diagnostics\n@description: HCV test result was positive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Positive G.DE44&quot;:\n  exists &quot;Positive G.DE44 Condition&quot;\n    or exists &quot;Positive G.DE44 Observation&quot;\ndefine &quot;Positive G.DE44 Condition&quot;:\n  Elements.&quot;Positive G.DE44 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Positive G.DE44 Observation&quot;:\n  Elements.&quot;Positive G.DE44 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Positive G.DE44 */\n\n/*\n@dataElement: HIV.G.DE45 - Negative\n@activity: HIV.D20 Diagnostics\n@description: HCV test result was negative\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Negative G.DE45&quot;:\n  exists &quot;Negative G.DE45 Condition&quot;\n    or exists &quot;Negative G.DE45 Observation&quot;\ndefine &quot;Negative G.DE45 Condition&quot;:\n  Elements.&quot;Negative G.DE45 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Negative G.DE45 Observation&quot;:\n  Elements.&quot;Negative G.DE45 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Negative G.DE45 */\n\n/*\n@dataElement: HIV.G.DE46 - Indeterminate\n@activity: HIV.D20 Diagnostics\n@description: HCV test result was indeterminate\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Indeterminate G.DE46&quot;:\n  exists &quot;Indeterminate G.DE46 Condition&quot;\n    or exists &quot;Indeterminate G.DE46 Observation&quot;\ndefine &quot;Indeterminate G.DE46 Condition&quot;:\n  Elements.&quot;Indeterminate G.DE46 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Indeterminate G.DE46 Observation&quot;:\n  Elements.&quot;Indeterminate G.DE46 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Indeterminate G.DE46 */\n\n/*\n@dataElement: HIV.G.DE70 - Syphilis test result\n@activity: HIV.D20 Diagnostics\n@description: Result from syphilis test\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Syphilis test result G.DE70&quot;:\n  exists &quot;Syphilis test result G.DE70 Observation&quot;\ndefine &quot;Syphilis test result G.DE70 Observation&quot;:\n  Elements.&quot;Syphilis test result G.DE70 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Syphilis test result G.DE70 */\n\n/*\n@dataElement: HIV.G.DE71 - Positive\n@activity: HIV.D20 Diagnostics\n@description: Test result is positive for syphilis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Positive G.DE71&quot;:\n  exists &quot;Positive G.DE71 Condition&quot;\n    or exists &quot;Positive G.DE71 Observation&quot;\ndefine &quot;Positive G.DE71 Condition&quot;:\n  Elements.&quot;Positive G.DE71 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Positive G.DE71 Observation&quot;:\n  Elements.&quot;Positive G.DE71 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Positive G.DE71 */\n\n/*\n@dataElement: HIV.G.DE72 - Negative\n@activity: HIV.D20 Diagnostics\n@description: Test result is negative for syphilis\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Negative G.DE72&quot;:\n  exists &quot;Negative G.DE72 Condition&quot;\n    or exists &quot;Negative G.DE72 Observation&quot;\ndefine &quot;Negative G.DE72 Condition&quot;:\n  Elements.&quot;Negative G.DE72 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Negative G.DE72 Observation&quot;:\n  Elements.&quot;Negative G.DE72 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Negative G.DE72 */\n\n/*\n@dataElement: HIV.G.DE73 - Inconclusive\n@activity: HIV.D20 Diagnostics\n@description: Test result is inconclusive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Inconclusive G.DE73&quot;:\n  exists &quot;Inconclusive G.DE73 Condition&quot;\n    or exists &quot;Inconclusive G.DE73 Observation&quot;\ndefine &quot;Inconclusive G.DE73 Condition&quot;:\n  Elements.&quot;Inconclusive G.DE73 Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Inconclusive G.DE73 Observation&quot;:\n  Elements.&quot;Inconclusive G.DE73 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Inconclusive G.DE73 */\n\n/*\n@dataElement: HIV.H.DE34 - HIV status of partner or contact\n@activity: HIV.B6 Capture or update client history\n@description: HIV status of the partner or contact given by the index case\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV status of partner or contact&quot;:\n  exists &quot;HIV status of partner or contact Observation&quot;\ndefine &quot;HIV status of partner or contact Observation&quot;:\n  Elements.&quot;HIV status of partner or contact Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV status of partner or contact */\n\n/*\n@dataElement: HIV.H.DE35 - Already knew positive\n@activity: HIV.B6 Capture or update client history\n@description: The partner or contact of the index case already knew they are HIV-positive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Already knew positive&quot;:\n  Elements.&quot;Already knew positive&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Already knew positive */\n\n/*\n@dataElement: HIV.H.DE36 - Newly diagnosed\n@activity: HIV.B6 Capture or update client history\n@description: The partner or contact of the index case is newly diagnosed as HIV-positive\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Newly diagnosed&quot;:\n  Elements.&quot;Newly diagnosed&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Newly diagnosed */\n\n/*\n@dataElement: HIV.H.DE37 - Negative\n@activity: HIV.B6 Capture or update client history\n@description: The partner or contact of the index case is newly diagnosed is HIV-negative\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Negative H.DE37 Observation&quot;:\n  Elements.&quot;Negative H.DE37&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Negative H.DE37 */\n\n/*\n@dataElement: HIV.H.DE47 - On ART\n@activity: HIV.H3 Record outreach and result\n@description: Client is currently taking ART \n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;On ART H.DE47 Observation&quot;:\n  Elements.&quot;On ART H.DE47&quot; MS\n    where MS.context.references(EncounterId)\n      or MS.effective.toInterval() starts on or before Today\n/* End of On ART H.DE47 */\n\n/*\n@dataElement: HIV.PRV.DE1 - At elevated risk for HIV acquisition\n@activity: HIV.B6 Capture or update client history\n@description: Client is at elevated risk for HIV acquisition, defined according to country/programme context\n*/\ndefine &quot;At elevated risk for HIV acquisition PRV.DE1 Observation&quot;:\n  Elements.&quot;At elevated risk for HIV acquisition PRV.DE1&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of At elevated risk for HIV acquisition PRV.DE1 */\n\n/*\n@dataElement: HIV.SRV.DE2 - HIV test result\n@activity: HIV.B7 Test for HIV using testing algorithm\n@description: The result from HIV testing after applying the testing algorithm\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV test result SRV.DE2&quot;:\n  exists &quot;HIV test result SRV.DE2 Observation&quot;\ndefine &quot;HIV test result SRV.DE2 Observation&quot;:\n  Elements.&quot;HIV test result SRV.DE2 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV test result SRV.DE2 */\n\n/*\n@dataElement: HIV.SRV.DE5 - HIV clinical stage\n@activity: HIV.D8 Capture or update client history\n@description: WHO clinical stage of client based on signs and symptoms. WHO clinical staging is a way to categorize HIV disease severity based on new or recurrent clinical events. There are 4 WHO clinical stages that range from mild symptoms (WHO clinical stage 1) to severe symptoms (WHO clinical stage 4).\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV clinical stage SRV.DE5&quot;:\n  exists &quot;HIV clinical stage SRV.DE5 Observation&quot;\ndefine &quot;HIV clinical stage SRV.DE5 Observation&quot;:\n  Elements.&quot;HIV clinical stage SRV.DE5 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV clinical stage SRV.DE5 */\n\n/*\n@dataElement: HIV.SRV.DE6 - ART start date\n@activity: HIV.B8 Provide post-test counselling\n@description: The date on which the client started or restarted antiretroviral therapy (ART)\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ART start date SRV.DE6&quot;:\n  Elements.&quot;ART start date SRV.DE6&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;ART start date SRV.DE6 Value&quot;:\n  &quot;ART start date SRV.DE6&quot; O\n  return O.value\n/* End of ART start date SRV.DE6 */\n\n/*\n@dataElement: HIV.SRV.DE7 - Currently pregnant\n@activity: HIV.B6 Capture or update client history\n@description: Client is currently pregnant\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Currently pregnant SRV.DE7&quot;:\n  exists &quot;Currently pregnant SRV.DE7 Observation&quot;\ndefine &quot;Currently pregnant SRV.DE7 Observation&quot;:\n  Elements.&quot;Currently pregnant SRV.DE7 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Currently pregnant SRV.DE7 */\n\n/*\n@dataElement: HIV.SRV.DE8 - CD4 count\n@activity: HIV.D20 Diagnostics\n@description: CD4 cell count in cells/mm^3\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;CD4 count SRV.DE8&quot;:\n  Elements.&quot;CD4 count SRV.DE8&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;CD4 count SRV.DE8 Value&quot;:\n  &quot;CD4 count SRV.DE8&quot; O\n  return O.value\n/* End of CD4 count SRV.DE8 */\n\n/*\n@dataElement: HIV.SRV.DE12 - Date of viral load sample collection\n@activity: HIV.D10 Counsel returning client\n@description: Date and time when the sample was collected to test the client's HIV viral load\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Date of viral load sample collection SRV.DE12&quot;:\n  Elements.&quot;Date of viral load sample collection SRV.DE12&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Date of viral load sample collection SRV.DE12 Value&quot;:\n  &quot;Date of viral load sample collection SRV.DE12&quot; O\n  return O.value\n/* End of Date of viral load sample collection SRV.DE12 */\n\n/*\n@dataElement: HIV.SRV.DE13 - Viral load test result\n@activity: HIV.D20 Diagnostics\n@description: Result from the viral load test in number of copies/mL\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Viral load test result SRV.DE13&quot;:\n  Elements.&quot;Viral load test result SRV.DE13&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Viral load test result SRV.DE13 Value&quot;:\n  &quot;Viral load test result SRV.DE13&quot; O\n  return O.value\n/* End of Viral load test result SRV.DE13 */\n\n/*\n@dataElement: HIV.SRV.DE15 - Visit date\n@activity: HIV.A2 Gather client details\n@description: The date and time of the client's visit\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Visit date SRV.DE15&quot;:\n  Elements.&quot;Visit date SRV.DE15&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;Visit date SRV.DE15 Value&quot;:\n  &quot;Visit date SRV.DE15&quot; O\n  return O.value\n/* End of Visit date SRV.DE15 */\n\n/*\n@dataElement: HIV.SRV.DE18 - ANC contact date\n@activity: HIV.E1 Capture or update mother's history\n@description: The date and time of the client's ANC contact (in the ANC DAK this is called 'Contact date')\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;ANC contact date SRV.DE18&quot;:\n  Elements.&quot;ANC contact date SRV.DE18&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\ndefine &quot;ANC contact date SRV.DE18 Value&quot;:\n  &quot;ANC contact date SRV.DE18&quot; O\n  return O.value\n/* End of ANC contact date SRV.DE18 */\n\n/*\n@dataElement: HIV.SRV.DE21 - Test result of HIV assay 1\n@activity: HIV.E4 Test mother for HIV using testing algorithm\n@description: The result of the first HIV assay in the testing strategy\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Test result of HIV assay 1 SRV.DE21&quot;:\n  exists &quot;Test result of HIV assay 1 SRV.DE21 Observation&quot;\ndefine &quot;Test result of HIV assay 1 SRV.DE21 Observation&quot;:\n  Elements.&quot;Test result of HIV assay 1 SRV.DE21 Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Test result of HIV assay 1 SRV.DE21 */\n\n/*\n@dataElement: HIV.Config.DE6 - Malaria-endemic setting\n@activity: HIV.Configuration\n@description: Whether the setting is a malaria-endemic setting\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Malaria-endemic setting&quot;:\n  exists &quot;Malaria-endemic setting Observation&quot;\ndefine &quot;Malaria-endemic setting Observation&quot;:\n  Elements.&quot;Malaria-endemic setting Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Malaria-endemic setting */\n\n/*\n@dataElement: HIV.Config.DE12 - HIV burden of the setting\n@activity: HIV.Configuration\n@description: HIV burden of the setting (high or low) based on the national HIV prevalence or where the HIV prevalence and/or incidence in a geographical setting is higher than national prevalence and, therefore, needs priority in the HIV response\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HIV burden of the setting&quot;:\n  exists &quot;HIV burden of the setting Observation&quot;\ndefine &quot;HIV burden of the setting Observation&quot;:\n  Elements.&quot;HIV burden of the setting Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HIV burden of the setting */\n\n/*\n@dataElement: HIV.Config.DE13 - High HIV burden setting\n@activity: HIV.Configuration\n@description: Settings with &gt;5% national HIV prevalence and subpopulations and geographic settings where HIV prevalence and/or incidence is higher than nationally.\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;High HIV burden setting&quot;:\n  exists &quot;High HIV burden setting Condition&quot;\n    or exists &quot;High HIV burden setting Observation&quot;\ndefine &quot;High HIV burden setting Condition&quot;:\n  Elements.&quot;High HIV burden setting Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;High HIV burden setting Observation&quot;:\n  Elements.&quot;High HIV burden setting Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of High HIV burden setting */\n\n/*\n@dataElement: HIV.Config.DE14 - Low HIV burden setting\n@activity: HIV.Configuration\n@description: Settings with &lt;5% HIV national prevalence but where certain populations (primarily key populations and their partners) and geographic settings may have higher HIV prevalence and/or incidence than nationally and, therefore, need priority in the HIV response\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;Low HIV burden setting&quot;:\n  exists &quot;Low HIV burden setting Condition&quot;\n    or exists &quot;Low HIV burden setting Observation&quot;\ndefine &quot;Low HIV burden setting Condition&quot;:\n  Elements.&quot;Low HIV burden setting Condition&quot; C\n    where C.prevalenceInterval() starts on or before Today\ndefine &quot;Low HIV burden setting Observation&quot;:\n  Elements.&quot;Low HIV burden setting Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of Low HIV burden setting */\n\n/*\n@dataElement: HIV.Config.DE15 - HPV DNA testing operational at the health facility\n@activity: HIV.Configuration\n@description: Is HPV DNA testing operational at the health facility for cervical cancer screening?\n*/\n// TODO: Replace placeholder with relevant CQL logic\ndefine &quot;HPV DNA testing operational at the health facility&quot;:\n  exists &quot;HPV DNA testing operational at the health facility Observation&quot;\ndefine &quot;HPV DNA testing operational at the health facility Observation&quot;:\n  Elements.&quot;HPV DNA testing operational at the health facility Observation&quot; O\n    where O.encounter.references(EncounterId)\n      or O.effective.toInterval() starts on or before Today\n/* End of HPV DNA testing operational at the health facility */\n\n\n/*\n * Custom elements and logic for use DT and IND CQL Libraries\n */</code></pre><p><code>No Content</code> (<code>application/elm+xml</code>)</p></div>"
  },
  "extension" : [
    {
      "url" : "http://hl7.org/fhir/StructureDefinition/cqf-knowledgeCapability",
      "valueCode" : "computable"
    }
  ],
  "url" : "http://smart.who.int/hiv/Library/HIVEncounterElements",
  "version" : "0.3.0",
  "name" : "HIVEncounterElements",
  "title" : "HIVEncounterElements",
  "status" : "draft",
  "experimental" : true,
  "type" : {
    "coding" : [
      {
        "system" : "http://terminology.hl7.org/CodeSystem/library-type",
        "code" : "logic-library"
      }
    ]
  },
  "date" : "2024-08-21T16:05:17+00:00",
  "publisher" : "WHO",
  "contact" : [
    {
      "name" : "WHO",
      "telecom" : [
        {
          "system" : "url",
          "value" : "http://who.int"
        }
      ]
    }
  ],
  "description" : "Description not yet available for HIVEncounterElements.",
  "content" : [
    {
      "contentType" : "text/cql",
      "data" : "bGlicmFyeSBISVZFbmNvdW50ZXJFbGVtZW50cwoKdXNpbmcgRkhJUiB2ZXJzaW9uICc0LjAuMScKCmluY2x1ZGUgRkhJUkhlbHBlcnMgdmVyc2lvbiAnNC4wLjEnCgppbmNsdWRlIFdIT0NvbmNlcHRzCmluY2x1ZGUgV0hPQ29tbW9uIGNhbGxlZCBXQwppbmNsdWRlIFdIT0VsZW1lbnRzIGNhbGxlZCBXRQoKaW5jbHVkZSBISVZDb25jZXB0cyBjYWxsZWQgQ29uY2VwdHMKaW5jbHVkZSBISVZDb21tb24gY2FsbGVkIENvbW1vbgppbmNsdWRlIEhJVkVsZW1lbnRzIGNhbGxlZCBFbGVtZW50cwoKcGFyYW1ldGVyIFRvZGF5IERhdGUgZGVmYXVsdCBUb2RheSgpCnBhcmFtZXRlciBFbmNvdW50ZXJJZCBTdHJpbmcKCmNvbnRleHQgUGF0aWVudAoKLyoqCiAqIEhJViBFbGVtZW50cwogKi8KCi8vIEF1dG8tZ2VuZXJhdGVkIEVsZW1lbnRzIGZyb20gREFLIERhdGEgRGljdGlvbmFyeQovLyAgIEVudHJpZXMgYmFzZWQgb24gREFLIERhdGEgRGljdGlvbmFyeSBmb3IgRGF0YSBFbGVtZW50cyBtYXJrZWQgYXMgdXNlZAovLyAgIGluIGF0IGxlYXN0IG9uZSBEZWNpc2lvbiBTdXBwb3J0IFRhYmxlIG9yIEFnZ3JlZ2F0ZSBJbmRpY2F0b3IKCi8qCkBkYXRhRWxlbWVudDogSElWLkEuREUzIC0gVmlzaXQgZGF0ZQpAYWN0aXZpdHk6IEhJVi5BMiBHYXRoZXIgY2xpZW50IGRldGFpbHMKQGRlc2NyaXB0aW9uOiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgY2xpZW50J3MgdmlzaXQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlZpc2l0IGRhdGUgQS5ERTMiOgogIEVsZW1lbnRzLiJWaXNpdCBkYXRlIEEuREUzIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlZpc2l0IGRhdGUgQS5ERTMgVmFsdWUiOgogICJWaXNpdCBkYXRlIEEuREUzIiBPCiAgcmV0dXJuIE8udmFsdWUKLyogRW5kIG9mIFZpc2l0IGRhdGUgQS5ERTMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkEuREUxNiAtIEVzdGltYXRlZCBhZ2UKQGFjdGl2aXR5OiBISVYuQTYuMSBSZXZpZXcgc29jaW9kZW1vZ3JhcGhpYyBkYXRhIHdpdGggY2xpZW50IHwgSElWLkE1IENyZWF0ZSBuZXcgY2xpZW50IHJlY29yZApAZGVzY3JpcHRpb246IElmIERPQiBpcyB1bmtub3duLCBlbnRlciB0aGUgY2xpZW50J3MgZXN0aW1hdGVkIGFnZS4gRGlzcGxheSBjbGllbnQncyBhZ2UgaW4gbnVtYmVyIG9mIHllYXJzLgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRXN0aW1hdGVkIGFnZSI6CiAgRWxlbWVudHMuIkVzdGltYXRlZCBhZ2UiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRXN0aW1hdGVkIGFnZSBWYWx1ZSI6CiAgIkVzdGltYXRlZCBhZ2UiIE8KICByZXR1cm4gTy52YWx1ZQovKiBFbmQgb2YgRXN0aW1hdGVkIGFnZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQS5ERTE3IC0gQWdlCkBhY3Rpdml0eTogSElWLkE2LjEgUmV2aWV3IHNvY2lvZGVtb2dyYXBoaWMgZGF0YSB3aXRoIGNsaWVudCB8IEhJVi5BNSBDcmVhdGUgbmV3IGNsaWVudCByZWNvcmQKQGRlc2NyaXB0aW9uOiBDYWxjdWxhdGVkIGFnZSAobnVtYmVyIG9mIHllYXJzKSBvZiB0aGUgY2xpZW50IGJhc2VkIG9uIGRhdGUgb2YgYmlydGgKKi8KLyoqIAogKiBAZGF0YUVsZW1lbnQgUGF0aWVudCBhZ2UgaW4geWVhcnMKICovCmRlZmluZSAiQ3VycmVudCBQYXRpZW50IEFnZSBJbiBZZWFycyI6CiAgQWdlSW5ZZWFyc0F0KFRvZGF5KCkpCgovKiogCiAqIEBkYXRhRWxlbWVudCBQYXRpZW50IGFnZSBpbiB3ZWVrcwogKi8KZGVmaW5lICJDdXJyZW50IFBhdGllbnQgQWdlIEluIFdlZWtzIjoKICBBZ2VJbldlZWtzQXQoVG9kYXkoKSkKCi8qKiAKICogQGRhdGFFbGVtZW50IFBhdGllbnQgYWdlIGluIG1vbnRocwogKi8KZGVmaW5lICJDdXJyZW50IFBhdGllbnQgQWdlIEluIE1vbnRocyI6CiAgQWdlSW5Nb250aHNBdChUb2RheSgpKQovKiBFbmQgb2YgQWdlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5BLkRFMTggLSBHZW5kZXIKQGFjdGl2aXR5OiBISVYuQTYuMSBSZXZpZXcgc29jaW9kZW1vZ3JhcGhpYyBkYXRhIHdpdGggY2xpZW50IHwgSElWLkE1IENyZWF0ZSBuZXcgY2xpZW50IHJlY29yZApAZGVzY3JpcHRpb246IEdlbmRlciBvZiB0aGUgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJHZW5kZXIiOgogIGV4aXN0cyAiR2VuZGVyIE9ic2VydmF0aW9uIgpkZWZpbmUgIkdlbmRlciBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkdlbmRlciBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEdlbmRlciAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQS5ERTE5IC0gRmVtYWxlCkBhY3Rpdml0eTogSElWLkE2LjEgUmV2aWV3IHNvY2lvZGVtb2dyYXBoaWMgZGF0YSB3aXRoIGNsaWVudCB8IEhJVi5BNSBDcmVhdGUgbmV3IGNsaWVudCByZWNvcmQKQGRlc2NyaXB0aW9uOiBDbGllbnQgaWRlbnRpZmllcyBhcyBmZW1hbGUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkZlbWFsZSI6CiAgZXhpc3RzICJGZW1hbGUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJGZW1hbGUgT2JzZXJ2YXRpb24iCmRlZmluZSAiRmVtYWxlIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkZlbWFsZSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkZlbWFsZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkZlbWFsZSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEZlbWFsZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQS5ERTIwIC0gTWFsZQpAYWN0aXZpdHk6IEhJVi5BNi4xIFJldmlldyBzb2Npb2RlbW9ncmFwaGljIGRhdGEgd2l0aCBjbGllbnQgfCBISVYuQTUgQ3JlYXRlIG5ldyBjbGllbnQgcmVjb3JkCkBkZXNjcmlwdGlvbjogQ2xpZW50IGlkZW50aWZpZXMgYXMgbWFsZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTWFsZSI6CiAgZXhpc3RzICJNYWxlIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTWFsZSBPYnNlcnZhdGlvbiIKZGVmaW5lICJNYWxlIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk1hbGUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJNYWxlIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTWFsZSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE1hbGUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkEuREUyMSAtIFRyYW5zZ2VuZGVyIG1hbGUKQGFjdGl2aXR5OiBISVYuQTYuMSBSZXZpZXcgc29jaW9kZW1vZ3JhcGhpYyBkYXRhIHdpdGggY2xpZW50IHwgSElWLkE1IENyZWF0ZSBuZXcgY2xpZW50IHJlY29yZApAZGVzY3JpcHRpb246IENsaWVudCBpZGVudGlmaWVzIGFzIHRyYW5zZ2VuZGVyIG1hbGUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRyYW5zZ2VuZGVyIG1hbGUiOgogIGV4aXN0cyAiVHJhbnNnZW5kZXIgbWFsZSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlRyYW5zZ2VuZGVyIG1hbGUgT2JzZXJ2YXRpb24iCmRlZmluZSAiVHJhbnNnZW5kZXIgbWFsZSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJUcmFuc2dlbmRlciBtYWxlIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVHJhbnNnZW5kZXIgbWFsZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlRyYW5zZ2VuZGVyIG1hbGUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUcmFuc2dlbmRlciBtYWxlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5BLkRFMjIgLSBUcmFuc2dlbmRlciBmZW1hbGUKQGFjdGl2aXR5OiBISVYuQTYuMSBSZXZpZXcgc29jaW9kZW1vZ3JhcGhpYyBkYXRhIHdpdGggY2xpZW50IHwgSElWLkE1IENyZWF0ZSBuZXcgY2xpZW50IHJlY29yZApAZGVzY3JpcHRpb246IENsaWVudCBpZGVudGlmaWVzIGFzIHRyYW5zZ2VuZGVyIGZlbWFsZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVHJhbnNnZW5kZXIgZmVtYWxlIjoKICBleGlzdHMgIlRyYW5zZ2VuZGVyIGZlbWFsZSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlRyYW5zZ2VuZGVyIGZlbWFsZSBPYnNlcnZhdGlvbiIKZGVmaW5lICJUcmFuc2dlbmRlciBmZW1hbGUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVHJhbnNnZW5kZXIgZmVtYWxlIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVHJhbnNnZW5kZXIgZmVtYWxlIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVHJhbnNnZW5kZXIgZmVtYWxlIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVHJhbnNnZW5kZXIgZmVtYWxlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5BLkRFMjMgLSBPdGhlcgpAYWN0aXZpdHk6IEhJVi5BNi4xIFJldmlldyBzb2Npb2RlbW9ncmFwaGljIGRhdGEgd2l0aCBjbGllbnQgfCBISVYuQTUgQ3JlYXRlIG5ldyBjbGllbnQgcmVjb3JkCkBkZXNjcmlwdGlvbjogQWRkaXRpb25hbCBjYXRlZ29yeQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiT3RoZXIgQS5ERTIzIjoKICBleGlzdHMgIk90aGVyIEEuREUyMyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk90aGVyIEEuREUyMyBPYnNlcnZhdGlvbiIKZGVmaW5lICJPdGhlciBBLkRFMjMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iT3RoZXIgQS5ERTIzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiT3RoZXIgQS5ERTIzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iT3RoZXIgQS5ERTIzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT3RoZXIgQS5ERTIzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMSAtIFJlYXNvbiBmb3IgdmlzaXQKQGFjdGl2aXR5OiBISVYuQjEgRGV0ZXJtaW5lIHJlYXNvbiBmb3IgdmlzaXQKQGRlc2NyaXB0aW9uOiBSZWFzb24gZm9yIEhJViB0ZXN0aW5nIHNlcnZpY2VzIHZpc2l0CiovCmRlZmluZSAiUmVhc29uIGZvciB2aXNpdCBCLkRFMSI6CiAgRWxlbWVudHMuIkhUUyBWaXNpdCBFbmNvdW50ZXIiIEUKICAgIHdoZXJlIEUucGFydE9mLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpIAogICAgb3IgRS5wZXJpb2Quc3RhcnQgPSBUb2RheQogICAgcmV0dXJuIEUucmVhc29uQ29kZQovKiBFbmQgb2YgUmVhc29uIGZvciB2aXNpdCBCLkRFMSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTIgLSBGaXJzdC10aW1lIEhJViB0ZXN0CkBhY3Rpdml0eTogSElWLkIxIERldGVybWluZSByZWFzb24gZm9yIHZpc2l0CkBkZXNjcmlwdGlvbjogRmlyc3QgZW5jb3VudGVyIGZvciBzY3JlZW5pbmcgZm9yIGh1bWFuIGltbXVub2RlZmljaWVuY3kgdmlydXMKKi8KZGVmaW5lICJJcyBGaXJzdC10aW1lIEhJViB0ZXN0IEVuY291bnRlciI6CiAgZXhpc3RzICJGaXJzdC10aW1lIEhJViB0ZXN0IEVuY291bnRlciIKZGVmaW5lICJGaXJzdC10aW1lIEhJViB0ZXN0IEVuY291bnRlciI6CiAgRWxlbWVudHMuIkZpcnN0LXRpbWUgSElWIHRlc3QgRW5jb3VudGVyIiBFCiAgICB3aGVyZSBFLnBhcnRPZi5yZWZlcmVuY2VzKEVuY291bnRlcklkKSAKICAgIG9yIEUucGVyaW9kLnN0YXJ0ID0gVG9kYXkKLyogRW5kIG9mIEZpcnN0LXRpbWUgSElWIHRlc3QgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUzIC0gUmV0ZXN0aW5nIGZvciBISVYKQGFjdGl2aXR5OiBISVYuQjEgRGV0ZXJtaW5lIHJlYXNvbiBmb3IgdmlzaXQKQGRlc2NyaXB0aW9uOiBSZXRlc3RpbmcgZm9yIGh1bWFuIGltbXVub2RlZmljaWVuY3kgdmlydXMKKi8KZGVmaW5lICJJcyBSZXRlc3RpbmcgZm9yIEhJViBCLkRFMyBFbmNvdW50ZXIiOgogIGV4aXN0cyAiUmV0ZXN0aW5nIGZvciBISVYgQi5ERTMgRW5jb3VudGVyIgpkZWZpbmUgIlJldGVzdGluZyBmb3IgSElWIEIuREUzIEVuY291bnRlciI6CiAgRWxlbWVudHMuIlJldGVzdGluZyBmb3IgSElWIEIuREUzIEVuY291bnRlciIgRQogICAgd2hlcmUgRS5wYXJ0T2YucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkgCiAgICBvciBFLnBlcmlvZC5zdGFydCA9IFRvZGF5Ci8qIEVuZCBvZiBSZXRlc3RpbmcgZm9yIEhJViBCLkRFMyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTQgLSBISVYgdGVzdGluZyBzZXJ2aWNlcyB2aXNpdApAYWN0aXZpdHk6IEhJVi5CMSBEZXRlcm1pbmUgcmVhc29uIGZvciB2aXNpdApAZGVzY3JpcHRpb246IENsaWVudCBhdHRlbmRpbmcgZmFjaWxpdHkgZm9yIEhJViB0ZXN0aW5nIHNlcnZpY2VzIHZpc2l0CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJJcyBISVYgdGVzdGluZyBzZXJ2aWNlcyB2aXNpdCI6CiAgZXhpc3RzICJISVYgdGVzdGluZyBzZXJ2aWNlcyB2aXNpdCBFbmNvdW50ZXIiCmRlZmluZSAiSElWIHRlc3Rpbmcgc2VydmljZXMgdmlzaXQgRW5jb3VudGVyIjoKICBFbGVtZW50cy4iSElWIHRlc3Rpbmcgc2VydmljZXMgdmlzaXQgRW5jb3VudGVyIiBFCiAgICB3aGVyZSBFLnBhcnRPZi5yZWZlcmVuY2VzKEVuY291bnRlcklkKSAKICAgIG9yIEUucGVyaW9kLnN0YXJ0ID0gVG9kYXkKLyogRW5kIG9mIEhJViB0ZXN0aW5nIHNlcnZpY2VzIHZpc2l0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTQgLSBEYXRlL3RpbWUgb2Ygc3VzcGVjdGVkIGV4cG9zdXJlIHRvIEhJVgpAYWN0aXZpdHk6IEhJVi5CMSBEZXRlcm1pbmUgcmVhc29uIGZvciB2aXNpdApAZGVzY3JpcHRpb246IERhdGUgYW5kIHRpbWUgd2hlbiB0aGUgY2xpZW50IGhhZCBzdXNwZWN0ZWQgZXhwb3N1cmUgdG8gSElWCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJEYXRlL3RpbWUgb2Ygc3VzcGVjdGVkIGV4cG9zdXJlIHRvIEhJViBCLkRFMTQiOgogIEVsZW1lbnRzLiJEYXRlL3RpbWUgb2Ygc3VzcGVjdGVkIGV4cG9zdXJlIHRvIEhJViBCLkRFMTQiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRGF0ZS90aW1lIG9mIHN1c3BlY3RlZCBleHBvc3VyZSB0byBISVYgQi5ERTE0IFZhbHVlIjoKICAiRGF0ZS90aW1lIG9mIHN1c3BlY3RlZCBleHBvc3VyZSB0byBISVYgQi5ERTE0IiBPCiAgcmV0dXJuIE8udmFsdWUKLyogRW5kIG9mIERhdGUvdGltZSBvZiBzdXNwZWN0ZWQgZXhwb3N1cmUgdG8gSElWIEIuREUxNCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTI5IC0gQ3VycmVudGx5IHByZWduYW50CkBhY3Rpdml0eTogSElWLkI2IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIGN1cnJlbnRseSBwcmVnbmFudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ3VycmVudGx5IHByZWduYW50IEIuREUyOSI6CiAgZXhpc3RzICJDdXJyZW50bHkgcHJlZ25hbnQgQi5ERTI5IE9ic2VydmF0aW9uIgpkZWZpbmUgIkN1cnJlbnRseSBwcmVnbmFudCBCLkRFMjkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDdXJyZW50bHkgcHJlZ25hbnQgQi5ERTI5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ3VycmVudGx5IHByZWduYW50IEIuREUyOSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTMzIC0gUGFydG5lciBISVYgc3RhdHVzIHJlcG9ydGVkCkBhY3Rpdml0eTogSElWLkI2IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVGhlIEhJViBzdGF0dXMgb2YgdGhlIGNsaWVudCdzIHBhcnRuZXIuCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQYXJ0bmVyIEhJViBzdGF0dXMgcmVwb3J0ZWQiOgogIGV4aXN0cyAiUGFydG5lciBISVYgc3RhdHVzIHJlcG9ydGVkIE9ic2VydmF0aW9uIgpkZWZpbmUgIlBhcnRuZXIgSElWIHN0YXR1cyByZXBvcnRlZCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBhcnRuZXIgSElWIHN0YXR1cyByZXBvcnRlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFBhcnRuZXIgSElWIHN0YXR1cyByZXBvcnRlZCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTM0IC0gSElWLXBvc2l0aXZlCkBhY3Rpdml0eTogSElWLkI2IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50J3MgcGFydG5lciBpcyBISVYtcG9zaXRpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhJVi1wb3NpdGl2ZSBCLkRFMzQiOgogIGV4aXN0cyAiSElWLXBvc2l0aXZlIEIuREUzNCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkhJVi1wb3NpdGl2ZSBCLkRFMzQgT2JzZXJ2YXRpb24iCmRlZmluZSAiSElWLXBvc2l0aXZlIEIuREUzNCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJISVYtcG9zaXRpdmUgQi5ERTM0IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSElWLXBvc2l0aXZlIEIuREUzNCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJVi1wb3NpdGl2ZSBCLkRFMzQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBISVYtcG9zaXRpdmUgQi5ERTM0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMzUgLSBISVYtbmVnYXRpdmUKQGFjdGl2aXR5OiBISVYuQjYgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBwYXJ0bmVyIGlzIEhJVi1uZWdhdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSElWLW5lZ2F0aXZlIEIuREUzNSI6CiAgZXhpc3RzICJISVYtbmVnYXRpdmUgQi5ERTM1IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSElWLW5lZ2F0aXZlIEIuREUzNSBPYnNlcnZhdGlvbiIKZGVmaW5lICJISVYtbmVnYXRpdmUgQi5ERTM1IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhJVi1uZWdhdGl2ZSBCLkRFMzUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJISVYtbmVnYXRpdmUgQi5ERTM1IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSElWLW5lZ2F0aXZlIEIuREUzNSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhJVi1uZWdhdGl2ZSBCLkRFMzUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUzNiAtIFVua25vd24KQGFjdGl2aXR5OiBISVYuQjYgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBEb24ndCBrbm93IEhJViBzdGF0dXMgLSBjbGllbnQgZG9lcyBub3Qga25vdyBwYXJ0bmVyJ3MgSElWIHN0YXR1cwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVW5rbm93biBCLkRFMzYiOgogIGV4aXN0cyAiVW5rbm93biBCLkRFMzYgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJVbmtub3duIEIuREUzNiBPYnNlcnZhdGlvbiIKZGVmaW5lICJVbmtub3duIEIuREUzNiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJVbmtub3duIEIuREUzNiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlVua25vd24gQi5ERTM2IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVW5rbm93biBCLkRFMzYgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBVbmtub3duIEIuREUzNiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTQ5IC0gS2V5IHBvcHVsYXRpb24gbWVtYmVyCkBhY3Rpdml0eTogSElWLkI2IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIGEgbWVtYmVyIG9mIGEga2V5IHBvcHVsYXRpb24gdGhhdCBoYXMgYW4gaW5jcmVhc2VkIHJpc2sgb2YgSElWCiovCmRlZmluZSAiSXMgS2V5IHBvcHVsYXRpb24gbWVtYmVyIEIuREU0OSI6CiAgZXhpc3RzKCJLZXkgcG9wdWxhdGlvbiBtZW1iZXIgdHlwZSBPYnNlcnZhdGlvbiIpCi8qIEVuZCBvZiBLZXkgcG9wdWxhdGlvbiBtZW1iZXIgQi5ERTQ5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFNTAgLSBLZXkgcG9wdWxhdGlvbiBtZW1iZXIgdHlwZQpAYWN0aXZpdHk6IEhJVi5CNiBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoZSB0eXBlIG9mIGtleSBwb3B1bGF0aW9uIHRoYXQgdGhlIGNsaWVudCBpcyBpbmNsdWRlZCBpbgoqLwpkZWZpbmUgIktleSBwb3B1bGF0aW9uIG1lbWJlciB0eXBlIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iS2V5IHBvcHVsYXRpb24gbWVtYmVyIHR5cGUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBLZXkgcG9wdWxhdGlvbiBtZW1iZXIgdHlwZSBCLkRFNTAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREU2NSAtIERhdGUgaW5mb3JtZWQgb2YgSElWLXBvc2l0aXZlIGRpYWdub3NpcwpAYWN0aXZpdHk6IEhJVi5CNiBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBjbGllbnQgd2FzIGRpYWdub3NlZCB3aXRoIEhJVgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRGF0ZSBpbmZvcm1lZCBvZiBISVYtcG9zaXRpdmUgZGlhZ25vc2lzIjoKICBFbGVtZW50cy4iRGF0ZSBpbmZvcm1lZCBvZiBISVYtcG9zaXRpdmUgZGlhZ25vc2lzIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkRhdGUgaW5mb3JtZWQgb2YgSElWLXBvc2l0aXZlIGRpYWdub3NpcyBWYWx1ZSI6CiAgIkRhdGUgaW5mb3JtZWQgb2YgSElWLXBvc2l0aXZlIGRpYWdub3NpcyIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBEYXRlIGluZm9ybWVkIG9mIEhJVi1wb3NpdGl2ZSBkaWFnbm9zaXMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREU3MSAtIEhJViBkaWFnbm9zaXMgZGF0ZQpAYWN0aXZpdHk6IEhJVi5COCBQcm92aWRlIHBvc3QtdGVzdCBjb3Vuc2VsbGluZwpAZGVzY3JpcHRpb246IERhdGUgZGlhZ25vc2lzIHdhcyByZXR1cm5lZCB0byBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhJViBkaWFnbm9zaXMgZGF0ZSI6CiAgRWxlbWVudHMuIkhJViBkaWFnbm9zaXMgZGF0ZSIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJISVYgZGlhZ25vc2lzIGRhdGUgVmFsdWUiOgogICJISVYgZGlhZ25vc2lzIGRhdGUiIE8KICByZXR1cm4gTy52YWx1ZQovKiBFbmQgb2YgSElWIGRpYWdub3NpcyBkYXRlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFNzIgLSBBUlQgc3RhcnQgZGF0ZQpAYWN0aXZpdHk6IEhJVi5COCBQcm92aWRlIHBvc3QtdGVzdCBjb3Vuc2VsbGluZwpAZGVzY3JpcHRpb246IFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBjbGllbnQgc3RhcnRlZCBvciByZXN0YXJ0ZWQgYW50aXJldHJvdmlyYWwgdGhlcmFweSAoQVJUKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQVJUIHN0YXJ0IGRhdGUgQi5ERTcyIjoKICBFbGVtZW50cy4iQVJUIHN0YXJ0IGRhdGUgQi5ERTcyIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFSVCBzdGFydCBkYXRlIEIuREU3MiBWYWx1ZSI6CiAgIkFSVCBzdGFydCBkYXRlIEIuREU3MiIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBBUlQgc3RhcnQgZGF0ZSBCLkRFNzIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREU4MCAtIEhJViB0ZXN0IGNvbmR1Y3RlZApAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBBbiBISVYgdGVzdCB3YXMgcGVyZm9ybWVkIG9uIHRoZSBjbGllbnQgZHVyaW5nIHRoZSB2aXNpdAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSElWIHRlc3QgY29uZHVjdGVkIjoKICBleGlzdHMgIkhJViB0ZXN0IGNvbmR1Y3RlZCBPYnNlcnZhdGlvbiIKZGVmaW5lICJISVYgdGVzdCBjb25kdWN0ZWQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJISVYgdGVzdCBjb25kdWN0ZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBISVYgdGVzdCBjb25kdWN0ZWQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREU4MSAtIEhJViB0ZXN0IHR5cGUKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVHlwZSBvZiBISVYgdGVzdAoqLwpkZWZpbmUgIkhJViB0ZXN0IHR5cGUgQi5ERTgxIjoKICBFbGVtZW50cy4iSElWIHRlc3QgdHlwZSBCLkRFODEiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSElWIHRlc3QgdHlwZSBCLkRFODEgVmFsdWUiOgogICJISVYgdGVzdCB0eXBlIEIuREU4MSIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBISVYgdGVzdCB0eXBlIEIuREU4MSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTgyIC0gUmFwaWQgZGlhZ25vc3RpYyB0ZXN0IGZvciBISVYKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogQW50aWJvZHkgdGVzdCBmb3IgSElWIHBlcmZvcm1lZCB3aXRoIGEgcmFwaWQgZGlhZ25vc3RpYwoqLwpkZWZpbmUgIlJhcGlkIGRpYWdub3N0aWMgdGVzdCBmb3IgSElWIEIuREU4MiI6CiAgRWxlbWVudHMuIlJhcGlkIGRpYWdub3N0aWMgdGVzdCBmb3IgSElWIEIuREU4MiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJhcGlkIGRpYWdub3N0aWMgdGVzdCBmb3IgSElWIEIuREU4MiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTgzIC0gRW56eW1lIGltbXVub2Fzc2F5IGZvciBISVYKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogQW50aWJvZHkgdGVzdCBmb3IgSElWIHBlcmZvcm1lZCB3aXRoIGFuIGVuenltZSBpbW11bm9hc3NheQoqLwpkZWZpbmUgIkVuenltZSBpbW11bm9hc3NheSBmb3IgSElWIEIuREU4MyI6CiAgRWxlbWVudHMuIkVuenltZSBpbW11bm9hc3NheSBmb3IgSElWIEIuREU4MyIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEVuenltZSBpbW11bm9hc3NheSBmb3IgSElWIEIuREU4MyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTg0IC0gTnVjbGVpYyBhY2lkIHRlc3QgZm9yIEhJVgpAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBWaXJvbG9naWNhbCB0ZXN0LCB3aGljaCBpbmNsdWRlcyB0ZXN0aW5nIGZvciBlYXJseSBpbmZhbnQgZGlhZ25vc2lzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJOdWNsZWljIGFjaWQgdGVzdCBmb3IgSElWIEIuREU4NCI6CiAgRWxlbWVudHMuIk51Y2xlaWMgYWNpZCB0ZXN0IGZvciBISVYgQi5ERTg0IiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTnVjbGVpYyBhY2lkIHRlc3QgZm9yIEhJViBCLkRFODQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREU4NSAtIER1YWwgSElWL3N5cGhpbGlzIHJhcGlkIGRpYWdub3N0aWMgdGVzdApAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBBbnRpYm9keSB0ZXN0IGZvciBISVYgYW5kIHN5cGhpbGlzIHBlcmZvcm1lZCB3aXRoIGEgcmFwaWQgZGlhZ25vc3RpYwoqLwpkZWZpbmUgIkR1YWwgSElWL3N5cGhpbGlzIHJhcGlkIGRpYWdub3N0aWMgdGVzdCBCLkRFODUiOgogIEVsZW1lbnRzLiJEdWFsIEhJVi9zeXBoaWxpcyByYXBpZCBkaWFnbm9zdGljIHRlc3QgQi5ERTg1IiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRHVhbCBISVYvc3lwaGlsaXMgcmFwaWQgZGlhZ25vc3RpYyB0ZXN0IEIuREU4NSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTg2IC0gSElWIHNlbGYtdGVzdApAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBBbnRpYm9keSB0ZXN0IGZvciBISVYgcGVyZm9ybWVkIGJ5IHNlbGYtdGVzdGVyIHVzaW5nIGEgcmFwaWQgZGlhZ25vc3RpYwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSElWIHNlbGYtdGVzdCI6CiAgRWxlbWVudHMuIkhJViBzZWxmLXRlc3QiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBISVYgc2VsZi10ZXN0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFODggLSBBc3NheSBudW1iZXIgaW4gdGVzdGluZyBzdHJhdGVneQpAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgbnVtYmVyIG9mIHRoZSBhc3NheSAodGVzdCBraXQpIGluIHRoZSBISVYgdGVzdGluZyBzdHJhdGVneQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQXNzYXkgbnVtYmVyIGluIHRlc3Rpbmcgc3RyYXRlZ3kgQi5ERTg4IjoKICBleGlzdHMgIkFzc2F5IG51bWJlciBpbiB0ZXN0aW5nIHN0cmF0ZWd5IEIuREU4OCBPYnNlcnZhdGlvbiIKZGVmaW5lICJBc3NheSBudW1iZXIgaW4gdGVzdGluZyBzdHJhdGVneSBCLkRFODggT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBc3NheSBudW1iZXIgaW4gdGVzdGluZyBzdHJhdGVneSBCLkRFODggT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBc3NheSBudW1iZXIgaW4gdGVzdGluZyBzdHJhdGVneSBCLkRFODggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREU4OSAtIEFzc2F5IDAKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogQSBjb21tdW5pdHkgb3V0cmVhY2ggdGVzdC1mb3ItdHJpYWdlIG9yIHNlbGYtdGVzdCB3aGljaCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEhJViB0ZXN0aW5nIHN0cmF0ZWd5CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBc3NheSAwIEIuREU4OSI6CiAgZXhpc3RzICJBc3NheSAwIEIuREU4OSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFzc2F5IDAgQi5ERTg5IE9ic2VydmF0aW9uIgpkZWZpbmUgIkFzc2F5IDAgQi5ERTg5IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFzc2F5IDAgQi5ERTg5IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQXNzYXkgMCBCLkRFODkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBc3NheSAwIEIuREU4OSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFzc2F5IDAgQi5ERTg5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFOTAgLSBBc3NheSAxCkBhY3Rpdml0eTogSElWLkI3IFRlc3QgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSBmaXJzdCB0ZXN0IGluIHRoZSBISVYgdGVzdGluZyBzdHJhdGVneQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQXNzYXkgMSBCLkRFOTAiOgogIGV4aXN0cyAiQXNzYXkgMSBCLkRFOTAgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBc3NheSAxIEIuREU5MCBPYnNlcnZhdGlvbiIKZGVmaW5lICJBc3NheSAxIEIuREU5MCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBc3NheSAxIEIuREU5MCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFzc2F5IDEgQi5ERTkwIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQXNzYXkgMSBCLkRFOTAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBc3NheSAxIEIuREU5MCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTkxIC0gQXNzYXkgMgpAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgc2Vjb25kIHRlc3QgaW4gdGhlIEhJViB0ZXN0aW5nIHN0cmF0ZWd5CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBc3NheSAyIEIuREU5MSI6CiAgZXhpc3RzICJBc3NheSAyIEIuREU5MSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFzc2F5IDIgQi5ERTkxIE9ic2VydmF0aW9uIgpkZWZpbmUgIkFzc2F5IDIgQi5ERTkxIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFzc2F5IDIgQi5ERTkxIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQXNzYXkgMiBCLkRFOTEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBc3NheSAyIEIuREU5MSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFzc2F5IDIgQi5ERTkxICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFOTIgLSBBc3NheSAzCkBhY3Rpdml0eTogSElWLkI3IFRlc3QgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSB0aGlyZCB0ZXN0IGluIHRoZSBISVYgdGVzdGluZyBzdHJhdGVneQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQXNzYXkgMyBCLkRFOTIiOgogIGV4aXN0cyAiQXNzYXkgMyBCLkRFOTIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBc3NheSAzIEIuREU5MiBPYnNlcnZhdGlvbiIKZGVmaW5lICJBc3NheSAzIEIuREU5MiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBc3NheSAzIEIuREU5MiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFzc2F5IDMgQi5ERTkyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQXNzYXkgMyBCLkRFOTIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBc3NheSAzIEIuREU5MiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTkzIC0gQXNzYXkgMSByZXBlYXRlZApAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgZmlyc3QgdGVzdCBpbiB0aGUgSElWIHRlc3Rpbmcgc3RyYXRlZ3kKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFzc2F5IDEgcmVwZWF0ZWQgQi5ERTkzIjoKICBleGlzdHMgIkFzc2F5IDEgcmVwZWF0ZWQgQi5ERTkzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQXNzYXkgMSByZXBlYXRlZCBCLkRFOTMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQXNzYXkgMSByZXBlYXRlZCBCLkRFOTMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQXNzYXkgMSByZXBlYXRlZCBCLkRFOTMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBc3NheSAxIHJlcGVhdGVkIEIuREU5MyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFzc2F5IDEgcmVwZWF0ZWQgQi5ERTkzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQXNzYXkgMSByZXBlYXRlZCBCLkRFOTMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREU5NCAtIFRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxCkBhY3Rpdml0eTogSElWLkI3IFRlc3QgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIGZpcnN0IEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDEgQi5ERTk0IjoKICBleGlzdHMgIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxIEIuREU5NCBPYnNlcnZhdGlvbiIKZGVmaW5lICJUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMSBCLkRFOTQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMSBCLkRFOTQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMSBCLkRFOTQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREU5NSAtIFJlYWN0aXZlCkBhY3Rpdml0eTogSElWLkI3IFRlc3QgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneSB3YXMgcmVhY3RpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlJlYWN0aXZlIEIuREU5NSI6CiAgZXhpc3RzICJSZWFjdGl2ZSBCLkRFOTUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJSZWFjdGl2ZSBCLkRFOTUgT2JzZXJ2YXRpb24iCmRlZmluZSAiUmVhY3RpdmUgQi5ERTk1IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJlYWN0aXZlIEIuREU5NSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlJlYWN0aXZlIEIuREU5NSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlJlYWN0aXZlIEIuREU5NSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJlYWN0aXZlIEIuREU5NSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTk2IC0gTm9uLXJlYWN0aXZlCkBhY3Rpdml0eTogSElWLkI3IFRlc3QgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneSB3YXMgbm9uLXJlYWN0aXZlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJOb24tcmVhY3RpdmUgQi5ERTk2IjoKICBleGlzdHMgIk5vbi1yZWFjdGl2ZSBCLkRFOTYgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJOb24tcmVhY3RpdmUgQi5ERTk2IE9ic2VydmF0aW9uIgpkZWZpbmUgIk5vbi1yZWFjdGl2ZSBCLkRFOTYgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTm9uLXJlYWN0aXZlIEIuREU5NiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk5vbi1yZWFjdGl2ZSBCLkRFOTYgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJOb24tcmVhY3RpdmUgQi5ERTk2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTm9uLXJlYWN0aXZlIEIuREU5NiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTk3IC0gSW52YWxpZApAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgcmVzdWx0IG9mIHRoZSBISVYgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kgd2FzIGludmFsaWQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkludmFsaWQgQi5ERTk3IjoKICBleGlzdHMgIkludmFsaWQgQi5ERTk3IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSW52YWxpZCBCLkRFOTcgT2JzZXJ2YXRpb24iCmRlZmluZSAiSW52YWxpZCBCLkRFOTcgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW52YWxpZCBCLkRFOTcgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJJbnZhbGlkIEIuREU5NyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkludmFsaWQgQi5ERTk3IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW52YWxpZCBCLkRFOTcgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREU5OCAtIFRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAyCkBhY3Rpdml0eTogSElWLkI3IFRlc3QgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIHNlY29uZCBISVYgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAyIEIuREU5OCI6CiAgZXhpc3RzICJUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMiBCLkRFOTggT2JzZXJ2YXRpb24iCmRlZmluZSAiVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDIgQi5ERTk4IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDIgQi5ERTk4IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDIgQi5ERTk4ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFOTkgLSBSZWFjdGl2ZQpAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgcmVzdWx0IG9mIHRoZSBISVYgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kgd2FzIHJlYWN0aXZlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSZWFjdGl2ZSBCLkRFOTkiOgogIGV4aXN0cyAiUmVhY3RpdmUgQi5ERTk5IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmVhY3RpdmUgQi5ERTk5IE9ic2VydmF0aW9uIgpkZWZpbmUgIlJlYWN0aXZlIEIuREU5OSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJSZWFjdGl2ZSBCLkRFOTkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSZWFjdGl2ZSBCLkRFOTkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSZWFjdGl2ZSBCLkRFOTkgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBSZWFjdGl2ZSBCLkRFOTkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxMDAgLSBOb24tcmVhY3RpdmUKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IHdhcyBub24tcmVhY3RpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk5vbi1yZWFjdGl2ZSBCLkRFMTAwIjoKICBleGlzdHMgIk5vbi1yZWFjdGl2ZSBCLkRFMTAwIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTm9uLXJlYWN0aXZlIEIuREUxMDAgT2JzZXJ2YXRpb24iCmRlZmluZSAiTm9uLXJlYWN0aXZlIEIuREUxMDAgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTm9uLXJlYWN0aXZlIEIuREUxMDAgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJOb24tcmVhY3RpdmUgQi5ERTEwMCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk5vbi1yZWFjdGl2ZSBCLkRFMTAwIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTm9uLXJlYWN0aXZlIEIuREUxMDAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxMDEgLSBJbnZhbGlkCkBhY3Rpdml0eTogSElWLkI3IFRlc3QgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneSB3YXMgaW52YWxpZAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW52YWxpZCBCLkRFMTAxIjoKICBleGlzdHMgIkludmFsaWQgQi5ERTEwMSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkludmFsaWQgQi5ERTEwMSBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbnZhbGlkIEIuREUxMDEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW52YWxpZCBCLkRFMTAxIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSW52YWxpZCBCLkRFMTAxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW52YWxpZCBCLkRFMTAxIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW52YWxpZCBCLkRFMTAxICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTAyIC0gVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDMKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgdGhpcmQgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMyBCLkRFMTAyIjoKICBleGlzdHMgIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAzIEIuREUxMDIgT2JzZXJ2YXRpb24iCmRlZmluZSAiVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDMgQi5ERTEwMiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAzIEIuREUxMDIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMyBCLkRFMTAyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTAzIC0gUmVhY3RpdmUKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IHdhcyByZWFjdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmVhY3RpdmUgQi5ERTEwMyI6CiAgZXhpc3RzICJSZWFjdGl2ZSBCLkRFMTAzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmVhY3RpdmUgQi5ERTEwMyBPYnNlcnZhdGlvbiIKZGVmaW5lICJSZWFjdGl2ZSBCLkRFMTAzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJlYWN0aXZlIEIuREUxMDMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSZWFjdGl2ZSBCLkRFMTAzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmVhY3RpdmUgQi5ERTEwMyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJlYWN0aXZlIEIuREUxMDMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxMDQgLSBOb24tcmVhY3RpdmUKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IHdhcyBub24tcmVhY3RpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk5vbi1yZWFjdGl2ZSBCLkRFMTA0IjoKICBleGlzdHMgIk5vbi1yZWFjdGl2ZSBCLkRFMTA0IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTm9uLXJlYWN0aXZlIEIuREUxMDQgT2JzZXJ2YXRpb24iCmRlZmluZSAiTm9uLXJlYWN0aXZlIEIuREUxMDQgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTm9uLXJlYWN0aXZlIEIuREUxMDQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJOb24tcmVhY3RpdmUgQi5ERTEwNCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk5vbi1yZWFjdGl2ZSBCLkRFMTA0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTm9uLXJlYWN0aXZlIEIuREUxMDQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxMDUgLSBJbnZhbGlkCkBhY3Rpdml0eTogSElWLkI3IFRlc3QgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneSB3YXMgaW52YWxpZAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW52YWxpZCBCLkRFMTA1IjoKICBleGlzdHMgIkludmFsaWQgQi5ERTEwNSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkludmFsaWQgQi5ERTEwNSBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbnZhbGlkIEIuREUxMDUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW52YWxpZCBCLkRFMTA1IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSW52YWxpZCBCLkRFMTA1IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW52YWxpZCBCLkRFMTA1IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW52YWxpZCBCLkRFMTA1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTA2IC0gVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDEgcmVwZWF0ZWQKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgcmVwZWF0ZWQgZmlyc3QgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMSByZXBlYXRlZCBCLkRFMTA2IjoKICBleGlzdHMgIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxIHJlcGVhdGVkIEIuREUxMDYgT2JzZXJ2YXRpb24iCmRlZmluZSAiVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDEgcmVwZWF0ZWQgQi5ERTEwNiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxIHJlcGVhdGVkIEIuREUxMDYgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMSByZXBlYXRlZCBCLkRFMTA2ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTA3IC0gUmVhY3RpdmUKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IHdhcyByZWFjdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmVhY3RpdmUgQi5ERTEwNyI6CiAgZXhpc3RzICJSZWFjdGl2ZSBCLkRFMTA3IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmVhY3RpdmUgQi5ERTEwNyBPYnNlcnZhdGlvbiIKZGVmaW5lICJSZWFjdGl2ZSBCLkRFMTA3IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJlYWN0aXZlIEIuREUxMDcgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSZWFjdGl2ZSBCLkRFMTA3IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmVhY3RpdmUgQi5ERTEwNyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJlYWN0aXZlIEIuREUxMDcgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxMDggLSBOb24tcmVhY3RpdmUKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IHdhcyBub24tcmVhY3RpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk5vbi1yZWFjdGl2ZSBCLkRFMTA4IjoKICBleGlzdHMgIk5vbi1yZWFjdGl2ZSBCLkRFMTA4IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTm9uLXJlYWN0aXZlIEIuREUxMDggT2JzZXJ2YXRpb24iCmRlZmluZSAiTm9uLXJlYWN0aXZlIEIuREUxMDggQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTm9uLXJlYWN0aXZlIEIuREUxMDggQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJOb24tcmVhY3RpdmUgQi5ERTEwOCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk5vbi1yZWFjdGl2ZSBCLkRFMTA4IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTm9uLXJlYWN0aXZlIEIuREUxMDggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxMDkgLSBJbnZhbGlkCkBhY3Rpdml0eTogSElWLkI3IFRlc3QgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneSB3YXMgaW52YWxpZAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW52YWxpZCBCLkRFMTA5IjoKICBleGlzdHMgIkludmFsaWQgQi5ERTEwOSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkludmFsaWQgQi5ERTEwOSBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbnZhbGlkIEIuREUxMDkgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW52YWxpZCBCLkRFMTA5IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSW52YWxpZCBCLkRFMTA5IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW52YWxpZCBCLkRFMTA5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW52YWxpZCBCLkRFMTA5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTExIC0gSElWIHRlc3QgcmVzdWx0CkBhY3Rpdml0eTogSElWLkI3IFRlc3QgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgZnJvbSBISVYgdGVzdGluZyBhZnRlciBhcHBseWluZyB0aGUgdGVzdGluZyBhbGdvcml0aG0KKi8KZGVmaW5lICJISVYgdGVzdCByZXN1bHQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJISVYgdGVzdCByZXN1bHQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSElWIHRlc3QgcmVzdWx0IFZhbHVlIjoKICBFbGVtZW50cy4iSElWIHRlc3QgcmVzdWx0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBISVYgdGVzdCByZXN1bHQgQi5ERTExMSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTExMiAtIEhJVi1wb3NpdGl2ZQpAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUZXN0IHJlc3VsdCBpcyBISVYtcG9zaXRpdmUKKi8KZGVmaW5lICJISVYtcG9zaXRpdmUgdGVzdCByZXN1bHQiOgogIEVsZW1lbnRzLiJISVYtcG9zaXRpdmUgdGVzdCByZXN1bHQiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBISVYtcG9zaXRpdmUgQi5ERTExMiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTExMyAtIEhJVi1uZWdhdGl2ZQpAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUZXN0IHJlc3VsdCBpcyBISVYtbmVnYXRpdmUKKi8KZGVmaW5lICJISVYtbmVnYXRpdmUgdGVzdCByZXN1bHQiOgogIEVsZW1lbnRzLiJISVYtbmVnYXRpdmUgdGVzdCByZXN1bHQiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBISVYtbmVnYXRpdmUgQi5ERTExMyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTExNCAtIEhJVi1pbmNvbmNsdXNpdmUKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGVzdCByZXN1bHQgaXMgSElWLWluY29uY2x1c2l2ZQoqLwpkZWZpbmUgIkhJVi1pbmNvbmNsdXNpdmUgdGVzdCByZXN1bHQiOgogIEVsZW1lbnRzLiJISVYtaW5jb25jbHVzaXZlIHRlc3QgcmVzdWx0IiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSElWLWluY29uY2x1c2l2ZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTExNSAtIEhJViBzdGF0dXMKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogSElWIHN0YXR1cyByZXBvcnRlZCBhZnRlciBhcHBseWluZyB0aGUgbmF0aW9uYWwgSElWIHRlc3RpbmcgYWxnb3JpdGhtLiBObyBzaW5nbGUgSElWIHRlc3QgY2FuIHByb3ZpZGUgYW4gSElWLXBvc2l0aXZlIGRpYWdub3Npcy4KKi8KZGVmaW5lICJISVYgU3RhdHVzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSElWIFN0YXR1cyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKCiAgLy8gY2FzZSAKICAvLyAgICAgd2hlbiBleGlzdHMoIkhJVi1wb3NpdGl2ZSBDb25kaXRpb24iKSBvciBleGlzdHMoIkhJVi1wb3NpdGl2ZSBDb25kaXRpb24iKSB0aGVuIENvbmNlcHRzLiJISVYtcG9zaXRpdmUgLSBISVYuQi5ERTExNiIKICAvLyAgICAgd2hlbiBub3QgZXhpc3RzKCJISVYtcG9zaXRpdmUgQ29uZGl0aW9uIikgYW5kIGV4aXN0cyhDb21tb24uIkhJViBOZWdhdGl2ZSBPYnNlcnZhdGlvbiIpIHRoZW4gIENvbmNlcHRzLiJISVYtbmVnYXRpdmUgLSBISVYuQi5ERTExNyIKICAvLyAgICAgZWxzZSBDb25jZXB0cy4iVW5rbm93biAtIEhJVi5CLkRFMTE4IgogIC8vIGVuZAovKiBFbmQgb2YgSElWIHN0YXR1cyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTExNiAtIEhJVi1wb3NpdGl2ZQpAYWN0aXZpdHk6IEhJVi5CNyBUZXN0IGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBDbGllbnQgaXMgSElWLXBvc2l0aXZlCiovCmRlZmluZSAiSElWIFN0YXR1cyBQb3N0aXRpdmUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJISVYgU3RhdHVzIFBvc2l0aXZlIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkhJViBTdGF0dXMgUG9zaXRpdmUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSElWIFN0YXR1cyBQb3NpdGl2ZSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSElWLXBvc2l0aXZlIEIuREUxMTYgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNDEgLSBQYXJ0bmVyIHZpcmFsbHkgc3VwcHJlc3NlZCBvbiBBUlQKQGFjdGl2aXR5OiBISVYuQjYgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBUlQgYW5kIHZpcmFsbHkgc3VwcHJlc3Npb24gc3RhdHVzIG9mIGEgcGFydG5lciBvZiB0aGUgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQYXJ0bmVyIHZpcmFsbHkgc3VwcHJlc3NlZCBvbiBBUlQiOgogIGV4aXN0cyAiUGFydG5lciB2aXJhbGx5IHN1cHByZXNzZWQgb24gQVJUIE9ic2VydmF0aW9uIgpkZWZpbmUgIlBhcnRuZXIgdmlyYWxseSBzdXBwcmVzc2VkIG9uIEFSVCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBhcnRuZXIgdmlyYWxseSBzdXBwcmVzc2VkIG9uIEFSVCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFBhcnRuZXIgdmlyYWxseSBzdXBwcmVzc2VkIG9uIEFSVCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE0MiAtIENvdW5zZWxsaW5nIHByb3ZpZGVkCkBhY3Rpdml0eTogSElWLkI4IFByb3ZpZGUgcG9zdC10ZXN0IGNvdW5zZWxsaW5nCkBkZXNjcmlwdGlvbjogV2hldGhlciBjb3Vuc2VsbGluZyB3YXMgcHJvdmlkZWQgdG8gYSBjbGllbnQgZHVyaW5nIHRoZSB2aXNpdAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ291bnNlbGxpbmcgcHJvdmlkZWQiOgogIGV4aXN0cyAiQ291bnNlbGxpbmcgcHJvdmlkZWQgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ291bnNlbGxpbmcgcHJvdmlkZWQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDb3Vuc2VsbGluZyBwcm92aWRlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENvdW5zZWxsaW5nIHByb3ZpZGVkICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTQzIC0gSElWLXBvc2l0aXZlIGNvdW5zZWxsaW5nIGNvbmR1Y3RlZApAYWN0aXZpdHk6IEhJVi5COCBQcm92aWRlIHBvc3QtdGVzdCBjb3Vuc2VsbGluZwpAZGVzY3JpcHRpb246IFdoZXRoZXIgY291bnNlbGxpbmcgd2FzIHByb3ZpZGVkIHRvIGEgY2xpZW50IHdobyBoYXMgYmVlbiBkaWFnbm9zZWQgd2l0aCBISVYKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhJVi1wb3NpdGl2ZSBjb3Vuc2VsbGluZyBjb25kdWN0ZWQiOgogIGV4aXN0cyAiSElWLXBvc2l0aXZlIGNvdW5zZWxsaW5nIGNvbmR1Y3RlZCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkhJVi1wb3NpdGl2ZSBjb3Vuc2VsbGluZyBjb25kdWN0ZWQgT2JzZXJ2YXRpb24iCmRlZmluZSAiSElWLXBvc2l0aXZlIGNvdW5zZWxsaW5nIGNvbmR1Y3RlZCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJISVYtcG9zaXRpdmUgY291bnNlbGxpbmcgY29uZHVjdGVkIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSElWLXBvc2l0aXZlIGNvdW5zZWxsaW5nIGNvbmR1Y3RlZCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJVi1wb3NpdGl2ZSBjb3Vuc2VsbGluZyBjb25kdWN0ZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBISVYtcG9zaXRpdmUgY291bnNlbGxpbmcgY29uZHVjdGVkICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTQ0IC0gSGVwYXRpdGlzIEIgcG9zaXRpdmUgY291bnNlbGxpbmcgY29uZHVjdGVkCkBhY3Rpdml0eTogSElWLkI4IFByb3ZpZGUgcG9zdC10ZXN0IGNvdW5zZWxsaW5nCkBkZXNjcmlwdGlvbjogV2hldGhlciBjb3Vuc2VsbGluZyB3YXMgcHJvdmlkZWQgdG8gYSBjbGllbnQgd2hvIGhhcyBiZWVuIGRpYWdub3NlZCB3aXRoIGhlcGF0aXRpcyBCCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJIZXBhdGl0aXMgQiBwb3NpdGl2ZSBjb3Vuc2VsbGluZyBjb25kdWN0ZWQiOgogIGV4aXN0cyAiSGVwYXRpdGlzIEIgcG9zaXRpdmUgY291bnNlbGxpbmcgY29uZHVjdGVkIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSGVwYXRpdGlzIEIgcG9zaXRpdmUgY291bnNlbGxpbmcgY29uZHVjdGVkIE9ic2VydmF0aW9uIgpkZWZpbmUgIkhlcGF0aXRpcyBCIHBvc2l0aXZlIGNvdW5zZWxsaW5nIGNvbmR1Y3RlZCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJIZXBhdGl0aXMgQiBwb3NpdGl2ZSBjb3Vuc2VsbGluZyBjb25kdWN0ZWQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJIZXBhdGl0aXMgQiBwb3NpdGl2ZSBjb3Vuc2VsbGluZyBjb25kdWN0ZWQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJIZXBhdGl0aXMgQiBwb3NpdGl2ZSBjb3Vuc2VsbGluZyBjb25kdWN0ZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBIZXBhdGl0aXMgQiBwb3NpdGl2ZSBjb3Vuc2VsbGluZyBjb25kdWN0ZWQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNDUgLSBIZXBhdGl0aXMgQyBwb3NpdGl2ZSBjb3Vuc2VsbGluZyBjb25kdWN0ZWQKQGFjdGl2aXR5OiBISVYuQjggUHJvdmlkZSBwb3N0LXRlc3QgY291bnNlbGxpbmcKQGRlc2NyaXB0aW9uOiBXaGV0aGVyIGNvdW5zZWxsaW5nIHdhcyBwcm92aWRlZCB0byBhIGNsaWVudCB3aG8gaGFzIGJlZW4gZGlhZ25vc2VkIHdpdGggaGVwYXRpdGlzIEMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhlcGF0aXRpcyBDIHBvc2l0aXZlIGNvdW5zZWxsaW5nIGNvbmR1Y3RlZCI6CiAgZXhpc3RzICJIZXBhdGl0aXMgQyBwb3NpdGl2ZSBjb3Vuc2VsbGluZyBjb25kdWN0ZWQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJIZXBhdGl0aXMgQyBwb3NpdGl2ZSBjb3Vuc2VsbGluZyBjb25kdWN0ZWQgT2JzZXJ2YXRpb24iCmRlZmluZSAiSGVwYXRpdGlzIEMgcG9zaXRpdmUgY291bnNlbGxpbmcgY29uZHVjdGVkIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhlcGF0aXRpcyBDIHBvc2l0aXZlIGNvdW5zZWxsaW5nIGNvbmR1Y3RlZCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkhlcGF0aXRpcyBDIHBvc2l0aXZlIGNvdW5zZWxsaW5nIGNvbmR1Y3RlZCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhlcGF0aXRpcyBDIHBvc2l0aXZlIGNvdW5zZWxsaW5nIGNvbmR1Y3RlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhlcGF0aXRpcyBDIHBvc2l0aXZlIGNvdW5zZWxsaW5nIGNvbmR1Y3RlZCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE0NiAtIFN5cGhpbGlzIGNvdW5zZWxsaW5nLCB0cmVhdG1lbnQgYW5kIGZ1cnRoZXIgdGVzdGluZwpAYWN0aXZpdHk6IEhJVi5COCBQcm92aWRlIHBvc3QtdGVzdCBjb3Vuc2VsbGluZwpAZGVzY3JpcHRpb246IFdoZXRoZXIgY291bnNlbGxpbmcgYW5kIHRyZWF0bWVudCB3YXMgcHJvdmlkZWQgdG8gYSBjbGllbnQgd2hvIGhhcyBiZWVuIGRpYWdub3NlZCB3aXRoIHN5cGhpbGlzLiBBZGRpdGlvbmFsIHRlc3RpbmcgKFJQUiB0ZXN0KSByZWNvbW1lbmRlZC4KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlN5cGhpbGlzIGNvdW5zZWxsaW5nLCB0cmVhdG1lbnQgYW5kIGZ1cnRoZXIgdGVzdGluZyI6CiAgZXhpc3RzICJTeXBoaWxpcyBjb3Vuc2VsbGluZywgdHJlYXRtZW50IGFuZCBmdXJ0aGVyIHRlc3RpbmcgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJTeXBoaWxpcyBjb3Vuc2VsbGluZywgdHJlYXRtZW50IGFuZCBmdXJ0aGVyIHRlc3RpbmcgT2JzZXJ2YXRpb24iCmRlZmluZSAiU3lwaGlsaXMgY291bnNlbGxpbmcsIHRyZWF0bWVudCBhbmQgZnVydGhlciB0ZXN0aW5nIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlN5cGhpbGlzIGNvdW5zZWxsaW5nLCB0cmVhdG1lbnQgYW5kIGZ1cnRoZXIgdGVzdGluZyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlN5cGhpbGlzIGNvdW5zZWxsaW5nLCB0cmVhdG1lbnQgYW5kIGZ1cnRoZXIgdGVzdGluZyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlN5cGhpbGlzIGNvdW5zZWxsaW5nLCB0cmVhdG1lbnQgYW5kIGZ1cnRoZXIgdGVzdGluZyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFN5cGhpbGlzIGNvdW5zZWxsaW5nLCB0cmVhdG1lbnQgYW5kIGZ1cnRoZXIgdGVzdGluZyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE0NyAtIExpbmtlZCB0byBlbnJvbG1lbnQgaW4gY2FyZSBhbmQgQVJUIGluaXRpYXRpb24KQGFjdGl2aXR5OiBISVYuQjggUHJvdmlkZSBwb3N0LXRlc3QgY291bnNlbGxpbmcKQGRlc2NyaXB0aW9uOiBMaW5rYWdlIG1hZGUgZnJvbSBISVYgdGVzdGluZyB0byBlbnJvbG1lbnQgaW4gY2FyZSBmb2xsb3dpbmcgYW4gSElWIGRpYWdub3NpcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTGlua2VkIHRvIGVucm9sbWVudCBpbiBjYXJlIGFuZCBBUlQgaW5pdGlhdGlvbiI6CiAgZXhpc3RzICJMaW5rZWQgdG8gZW5yb2xtZW50IGluIGNhcmUgYW5kIEFSVCBpbml0aWF0aW9uIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTGlua2VkIHRvIGVucm9sbWVudCBpbiBjYXJlIGFuZCBBUlQgaW5pdGlhdGlvbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJMaW5rZWQgdG8gZW5yb2xtZW50IGluIGNhcmUgYW5kIEFSVCBpbml0aWF0aW9uIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkxpbmtlZCB0byBlbnJvbG1lbnQgaW4gY2FyZSBhbmQgQVJUIGluaXRpYXRpb24gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJMaW5rZWQgdG8gZW5yb2xtZW50IGluIGNhcmUgYW5kIEFSVCBpbml0aWF0aW9uIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTGlua2VkIHRvIGVucm9sbWVudCBpbiBjYXJlIGFuZCBBUlQgaW5pdGlhdGlvbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIExpbmtlZCB0byBlbnJvbG1lbnQgaW4gY2FyZSBhbmQgQVJUIGluaXRpYXRpb24gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNDggLSBWTU1DIGNvdW5zZWxsaW5nIHByb3ZpZGVkCkBhY3Rpdml0eTogSElWLkI4IFByb3ZpZGUgcG9zdC10ZXN0IGNvdW5zZWxsaW5nCkBkZXNjcmlwdGlvbjogV2hldGhlciBjb3Vuc2VsbGluZyBmb3Igdm9sdW50YXJ5IG1lZGljYWwgbWFsZSBjaXJjdW1jaXNpb24gKFZNTUMpIHdhcyBwcm92aWRlZCBmb2xsb3dpbmcgYW4gSElWLW5lZ2F0aXZlIHRlc3QKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlZNTUMgY291bnNlbGxpbmcgcHJvdmlkZWQiOgogIGV4aXN0cyAiVk1NQyBjb3Vuc2VsbGluZyBwcm92aWRlZCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlZNTUMgY291bnNlbGxpbmcgcHJvdmlkZWQgT2JzZXJ2YXRpb24iCmRlZmluZSAiVk1NQyBjb3Vuc2VsbGluZyBwcm92aWRlZCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJWTU1DIGNvdW5zZWxsaW5nIHByb3ZpZGVkIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVk1NQyBjb3Vuc2VsbGluZyBwcm92aWRlZCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlZNTUMgY291bnNlbGxpbmcgcHJvdmlkZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBWTU1DIGNvdW5zZWxsaW5nIHByb3ZpZGVkICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTQ5IC0gUHJldmVudGlvbiBzZXJ2aWNlcyBvZmZlcmVkIGFuZCByZWZlcnJhbHMKQGFjdGl2aXR5OiBISVYuQjkgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgdG8gcHJldmVudGlvbiBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUHJldmVudGlvbiBzZXJ2aWNlcyBvZmZlcmVkIGFuZCByZWZlcnJhbHMgQi5ERTE0OSI6CiAgZXhpc3RzICJQcmV2ZW50aW9uIHNlcnZpY2VzIG9mZmVyZWQgYW5kIHJlZmVycmFscyBCLkRFMTQ5IE9ic2VydmF0aW9uIgpkZWZpbmUgIlByZXZlbnRpb24gc2VydmljZXMgb2ZmZXJlZCBhbmQgcmVmZXJyYWxzIEIuREUxNDkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQcmV2ZW50aW9uIHNlcnZpY2VzIG9mZmVyZWQgYW5kIHJlZmVycmFscyBCLkRFMTQ5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUHJldmVudGlvbiBzZXJ2aWNlcyBvZmZlcmVkIGFuZCByZWZlcnJhbHMgQi5ERTE0OSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE1MCAtIE9mZmVyIG1hbGUgYW5kIGZlbWFsZSBjb25kb21zIGFuZCBjb25kb20tY29tcGF0aWJsZSBsdWJyaWNhbnRzCkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG1hbGUgYW5kIGZlbWFsZSBjb25kb21zIGFuZCBjb25kb20tY29tcGF0aWJsZSBsdWJyaWNhbnRzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJPZmZlciBtYWxlIGFuZCBmZW1hbGUgY29uZG9tcyBhbmQgY29uZG9tLWNvbXBhdGlibGUgbHVicmljYW50cyBCLkRFMTUwIjoKICBleGlzdHMgIk9mZmVyIG1hbGUgYW5kIGZlbWFsZSBjb25kb21zIGFuZCBjb25kb20tY29tcGF0aWJsZSBsdWJyaWNhbnRzIEIuREUxNTAgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJPZmZlciBtYWxlIGFuZCBmZW1hbGUgY29uZG9tcyBhbmQgY29uZG9tLWNvbXBhdGlibGUgbHVicmljYW50cyBCLkRFMTUwIE9ic2VydmF0aW9uIgpkZWZpbmUgIk9mZmVyIG1hbGUgYW5kIGZlbWFsZSBjb25kb21zIGFuZCBjb25kb20tY29tcGF0aWJsZSBsdWJyaWNhbnRzIEIuREUxNTAgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iT2ZmZXIgbWFsZSBhbmQgZmVtYWxlIGNvbmRvbXMgYW5kIGNvbmRvbS1jb21wYXRpYmxlIGx1YnJpY2FudHMgQi5ERTE1MCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk9mZmVyIG1hbGUgYW5kIGZlbWFsZSBjb25kb21zIGFuZCBjb25kb20tY29tcGF0aWJsZSBsdWJyaWNhbnRzIEIuREUxNTAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJPZmZlciBtYWxlIGFuZCBmZW1hbGUgY29uZG9tcyBhbmQgY29uZG9tLWNvbXBhdGlibGUgbHVicmljYW50cyBCLkRFMTUwIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT2ZmZXIgbWFsZSBhbmQgZmVtYWxlIGNvbmRvbXMgYW5kIGNvbmRvbS1jb21wYXRpYmxlIGx1YnJpY2FudHMgQi5ERTE1MCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE1MSAtIE9mZmVyIHByZS1leHBvc3VyZSBwcm9waHlsYXhpcyBQckVQIGZvciBwZW9wbGUgYXQgZWxldmF0ZWQgcmlzayBmb3IgSElWIGFjcXVpc2l0aW9uCkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIHByZS1leHBvc3VyZSBwcm9waHlsYXhpcyAoUHJFUCkgdG8gcGVvcGxlIHdpdGggc3Vic3RhbnRpYWwgb25nb2luZyByaXNrIG9mIEhJViBpbmZlY3Rpb24KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk9mZmVyIHByZS1leHBvc3VyZSBwcm9waHlsYXhpcyBQckVQIGZvciBwZW9wbGUgYXQgZWxldmF0ZWQgcmlzayBmb3IgSElWIGFjcXVpc2l0aW9uIjoKICBleGlzdHMgIk9mZmVyIHByZS1leHBvc3VyZSBwcm9waHlsYXhpcyBQckVQIGZvciBwZW9wbGUgYXQgZWxldmF0ZWQgcmlzayBmb3IgSElWIGFjcXVpc2l0aW9uIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiT2ZmZXIgcHJlLWV4cG9zdXJlIHByb3BoeWxheGlzIFByRVAgZm9yIHBlb3BsZSBhdCBlbGV2YXRlZCByaXNrIGZvciBISVYgYWNxdWlzaXRpb24gT2JzZXJ2YXRpb24iCmRlZmluZSAiT2ZmZXIgcHJlLWV4cG9zdXJlIHByb3BoeWxheGlzIFByRVAgZm9yIHBlb3BsZSBhdCBlbGV2YXRlZCByaXNrIGZvciBISVYgYWNxdWlzaXRpb24gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iT2ZmZXIgcHJlLWV4cG9zdXJlIHByb3BoeWxheGlzIFByRVAgZm9yIHBlb3BsZSBhdCBlbGV2YXRlZCByaXNrIGZvciBISVYgYWNxdWlzaXRpb24gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJPZmZlciBwcmUtZXhwb3N1cmUgcHJvcGh5bGF4aXMgUHJFUCBmb3IgcGVvcGxlIGF0IGVsZXZhdGVkIHJpc2sgZm9yIEhJViBhY3F1aXNpdGlvbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk9mZmVyIHByZS1leHBvc3VyZSBwcm9waHlsYXhpcyBQckVQIGZvciBwZW9wbGUgYXQgZWxldmF0ZWQgcmlzayBmb3IgSElWIGFjcXVpc2l0aW9uIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT2ZmZXIgcHJlLWV4cG9zdXJlIHByb3BoeWxheGlzIFByRVAgZm9yIHBlb3BsZSBhdCBlbGV2YXRlZCByaXNrIGZvciBISVYgYWNxdWlzaXRpb24gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNTIgLSBPZmZlciBwb3N0LWV4cG9zdXJlIHByb3BoeWxheGlzIFBFUCBmb2xsb3dpbmcgc3VzcGVjdGVkIGV4cG9zdXJlCkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGNsaWVudCBmb3IgUEVQIGZvbGxvd2luZyBzdXNwZWN0ZWQgZXhwb3N1cmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk9mZmVyIHBvc3QtZXhwb3N1cmUgcHJvcGh5bGF4aXMgUEVQIGZvbGxvd2luZyBzdXNwZWN0ZWQgZXhwb3N1cmUiOgogIGV4aXN0cyAiT2ZmZXIgcG9zdC1leHBvc3VyZSBwcm9waHlsYXhpcyBQRVAgZm9sbG93aW5nIHN1c3BlY3RlZCBleHBvc3VyZSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk9mZmVyIHBvc3QtZXhwb3N1cmUgcHJvcGh5bGF4aXMgUEVQIGZvbGxvd2luZyBzdXNwZWN0ZWQgZXhwb3N1cmUgT2JzZXJ2YXRpb24iCmRlZmluZSAiT2ZmZXIgcG9zdC1leHBvc3VyZSBwcm9waHlsYXhpcyBQRVAgZm9sbG93aW5nIHN1c3BlY3RlZCBleHBvc3VyZSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJPZmZlciBwb3N0LWV4cG9zdXJlIHByb3BoeWxheGlzIFBFUCBmb2xsb3dpbmcgc3VzcGVjdGVkIGV4cG9zdXJlIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiT2ZmZXIgcG9zdC1leHBvc3VyZSBwcm9waHlsYXhpcyBQRVAgZm9sbG93aW5nIHN1c3BlY3RlZCBleHBvc3VyZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk9mZmVyIHBvc3QtZXhwb3N1cmUgcHJvcGh5bGF4aXMgUEVQIGZvbGxvd2luZyBzdXNwZWN0ZWQgZXhwb3N1cmUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBPZmZlciBwb3N0LWV4cG9zdXJlIHByb3BoeWxheGlzIFBFUCBmb2xsb3dpbmcgc3VzcGVjdGVkIGV4cG9zdXJlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTUzIC0gVm9sdW50YXJ5IG1lZGljYWwgbWFsZSBjaXJjdW1jaXNpb24gVk1NQwpAYWN0aXZpdHk6IEhJVi5COSBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBPZmZlciByZWZlcnJhbCBmb3IgVk1NQyBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVm9sdW50YXJ5IG1lZGljYWwgbWFsZSBjaXJjdW1jaXNpb24gVk1NQyI6CiAgZXhpc3RzICJWb2x1bnRhcnkgbWVkaWNhbCBtYWxlIGNpcmN1bWNpc2lvbiBWTU1DIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVm9sdW50YXJ5IG1lZGljYWwgbWFsZSBjaXJjdW1jaXNpb24gVk1NQyBPYnNlcnZhdGlvbiIKZGVmaW5lICJWb2x1bnRhcnkgbWVkaWNhbCBtYWxlIGNpcmN1bWNpc2lvbiBWTU1DIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlZvbHVudGFyeSBtZWRpY2FsIG1hbGUgY2lyY3VtY2lzaW9uIFZNTUMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJWb2x1bnRhcnkgbWVkaWNhbCBtYWxlIGNpcmN1bWNpc2lvbiBWTU1DIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVm9sdW50YXJ5IG1lZGljYWwgbWFsZSBjaXJjdW1jaXNpb24gVk1NQyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFZvbHVudGFyeSBtZWRpY2FsIG1hbGUgY2lyY3VtY2lzaW9uIFZNTUMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNTQgLSBIYXJtIHJlZHVjdGlvbiBmb3IgcGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MKQGFjdGl2aXR5OiBISVYuQjkgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgdG8gaGFybSByZWR1Y3Rpb24gc2VydmljZXMgZm9yIHBlb3BsZSB3aG8gaW5qZWN0IGRydWdzIChuZWVkbGUgYW5kIHN5cmluZ2UgcHJvZ3JhbW1lcywgb3Bpb2lkIHN1YnN0aXR1dGlvbiB0aGVyYXB5LCBvdGhlciBkcnVnLWRlcGVuZGVuY2UgdHJlYXRtZW50IGFuZCBvcGlvaWQgb3ZlcmRvc2UgcHJldmVudGlvbiBhbmQgbWFuYWdlbWVudCkKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhhcm0gcmVkdWN0aW9uIGZvciBwZW9wbGUgd2hvIGluamVjdCBkcnVncyBCLkRFMTU0IjoKICBleGlzdHMgIkhhcm0gcmVkdWN0aW9uIGZvciBwZW9wbGUgd2hvIGluamVjdCBkcnVncyBCLkRFMTU0IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSGFybSByZWR1Y3Rpb24gZm9yIHBlb3BsZSB3aG8gaW5qZWN0IGRydWdzIEIuREUxNTQgT2JzZXJ2YXRpb24iCmRlZmluZSAiSGFybSByZWR1Y3Rpb24gZm9yIHBlb3BsZSB3aG8gaW5qZWN0IGRydWdzIEIuREUxNTQgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSGFybSByZWR1Y3Rpb24gZm9yIHBlb3BsZSB3aG8gaW5qZWN0IGRydWdzIEIuREUxNTQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJIYXJtIHJlZHVjdGlvbiBmb3IgcGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MgQi5ERTE1NCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhhcm0gcmVkdWN0aW9uIGZvciBwZW9wbGUgd2hvIGluamVjdCBkcnVncyBCLkRFMTU0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSGFybSByZWR1Y3Rpb24gZm9yIHBlb3BsZSB3aG8gaW5qZWN0IGRydWdzIEIuREUxNTQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNTUgLSBCZWhhdmlvdXJhbCBpbnRlcnZlbnRpb25zIHRvIHN1cHBvcnQgcmlzayByZWR1Y3Rpb24sIHBhcnRpY3VsYXJseSBmb3IgcGVvcGxlIHdpdGggSElWIGFuZCBtZW1iZXJzIG9mIGtleSBwb3B1bGF0aW9ucwpAYWN0aXZpdHk6IEhJVi5COSBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBPZmZlciBvciByZWZlciB0byBiZWhhdmlvdXJhbCBpbnRlcnZlbnRpb25zIHRvIHN1cHBvcnQgcmlzayByZWR1Y3Rpb24sIHBhcnRpY3VsYXJseSBmb3IgcGVvcGxlIHdpdGggSElWIGFuZCBtZW1iZXJzIG9mIGtleSBwb3B1bGF0aW9ucwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQmVoYXZpb3VyYWwgaW50ZXJ2ZW50aW9ucyB0byBzdXBwb3J0IHJpc2sgcmVkdWN0aW9uLCBwYXJ0aWN1bGFybHkgZm9yIHBlb3BsZSB3aXRoIEhJViBhbmQgbWVtYmVycyBvZiBrZXkgcG9wdWxhdGlvbnMiOgogIGV4aXN0cyAiQmVoYXZpb3VyYWwgaW50ZXJ2ZW50aW9ucyB0byBzdXBwb3J0IHJpc2sgcmVkdWN0aW9uLCBwYXJ0aWN1bGFybHkgZm9yIHBlb3BsZSB3aXRoIEhJViBhbmQgbWVtYmVycyBvZiBrZXkgcG9wdWxhdGlvbnMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJCZWhhdmlvdXJhbCBpbnRlcnZlbnRpb25zIHRvIHN1cHBvcnQgcmlzayByZWR1Y3Rpb24sIHBhcnRpY3VsYXJseSBmb3IgcGVvcGxlIHdpdGggSElWIGFuZCBtZW1iZXJzIG9mIGtleSBwb3B1bGF0aW9ucyBPYnNlcnZhdGlvbiIKZGVmaW5lICJCZWhhdmlvdXJhbCBpbnRlcnZlbnRpb25zIHRvIHN1cHBvcnQgcmlzayByZWR1Y3Rpb24sIHBhcnRpY3VsYXJseSBmb3IgcGVvcGxlIHdpdGggSElWIGFuZCBtZW1iZXJzIG9mIGtleSBwb3B1bGF0aW9ucyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJCZWhhdmlvdXJhbCBpbnRlcnZlbnRpb25zIHRvIHN1cHBvcnQgcmlzayByZWR1Y3Rpb24sIHBhcnRpY3VsYXJseSBmb3IgcGVvcGxlIHdpdGggSElWIGFuZCBtZW1iZXJzIG9mIGtleSBwb3B1bGF0aW9ucyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkJlaGF2aW91cmFsIGludGVydmVudGlvbnMgdG8gc3VwcG9ydCByaXNrIHJlZHVjdGlvbiwgcGFydGljdWxhcmx5IGZvciBwZW9wbGUgd2l0aCBISVYgYW5kIG1lbWJlcnMgb2Yga2V5IHBvcHVsYXRpb25zIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQmVoYXZpb3VyYWwgaW50ZXJ2ZW50aW9ucyB0byBzdXBwb3J0IHJpc2sgcmVkdWN0aW9uLCBwYXJ0aWN1bGFybHkgZm9yIHBlb3BsZSB3aXRoIEhJViBhbmQgbWVtYmVycyBvZiBrZXkgcG9wdWxhdGlvbnMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBCZWhhdmlvdXJhbCBpbnRlcnZlbnRpb25zIHRvIHN1cHBvcnQgcmlzayByZWR1Y3Rpb24sIHBhcnRpY3VsYXJseSBmb3IgcGVvcGxlIHdpdGggSElWIGFuZCBtZW1iZXJzIG9mIGtleSBwb3B1bGF0aW9ucyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE1NiAtIEhJViB0ZXN0aW5nIGZvciBwYXJ0bmVycyBhbmQgYmlvbG9naWNhbCBjaGlsZHJlbgpAYWN0aXZpdHk6IEhJVi5COSBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBPZmZlciB2b2x1bnRhcnkgdGVzdGluZyBmb3IgYWxsIHBhcnRuZXJzIGFuZCBiaW9sb2dpY2FsIGNoaWxkcmVuIG9mIHBvc2l0aXZlIGNhc2VzIChpbmNsdWRlcyBwYXJ0bmVyIHNlcnZpY2VzIGFuZCBpbmRleCBjYXNlIHRlc3RpbmcpLCBhcyB3ZWxsbCBhcyBwYXJ0bmVycyBhbmQgc29jaWFsIGNvbnRhY3RzIG9mIHBlb3BsZSBmcm9tIGtleSBwb3B1bGF0aW9ucywgd2hlcmUgYXBwcm9wcmlhdGUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhJViB0ZXN0aW5nIGZvciBwYXJ0bmVycyBhbmQgYmlvbG9naWNhbCBjaGlsZHJlbiBCLkRFMTU2IjoKICBleGlzdHMgIkhJViB0ZXN0aW5nIGZvciBwYXJ0bmVycyBhbmQgYmlvbG9naWNhbCBjaGlsZHJlbiBCLkRFMTU2IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSElWIHRlc3RpbmcgZm9yIHBhcnRuZXJzIGFuZCBiaW9sb2dpY2FsIGNoaWxkcmVuIEIuREUxNTYgT2JzZXJ2YXRpb24iCmRlZmluZSAiSElWIHRlc3RpbmcgZm9yIHBhcnRuZXJzIGFuZCBiaW9sb2dpY2FsIGNoaWxkcmVuIEIuREUxNTYgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSElWIHRlc3RpbmcgZm9yIHBhcnRuZXJzIGFuZCBiaW9sb2dpY2FsIGNoaWxkcmVuIEIuREUxNTYgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJISVYgdGVzdGluZyBmb3IgcGFydG5lcnMgYW5kIGJpb2xvZ2ljYWwgY2hpbGRyZW4gQi5ERTE1NiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJViB0ZXN0aW5nIGZvciBwYXJ0bmVycyBhbmQgYmlvbG9naWNhbCBjaGlsZHJlbiBCLkRFMTU2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSElWIHRlc3RpbmcgZm9yIHBhcnRuZXJzIGFuZCBiaW9sb2dpY2FsIGNoaWxkcmVuIEIuREUxNTYgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNTcgLSBISVYgdGVzdGluZyBmb3IgcGFydG5lcnMgYW5kIHNvY2lhbCBjb250YWN0cyBvZiBwZW9wbGUgZnJvbSBrZXkgcG9wdWxhdGlvbnMsIHdoZXJlIGFwcHJvcHJpYXRlCkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIHZvbHVudGFyeSB0ZXN0aW5nIGZvciBwYXJ0bmVycyBhbmQgc29jaWFsIGNvbnRhY3RzIG9mIHBlb3BsZSBmcm9tIGtleSBwb3B1bGF0aW9ucywgd2hlcmUgYXBwcm9wcmlhdGUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhJViB0ZXN0aW5nIGZvciBwYXJ0bmVycyBhbmQgc29jaWFsIGNvbnRhY3RzIG9mIHBlb3BsZSBmcm9tIGtleSBwb3B1bGF0aW9ucywgd2hlcmUgYXBwcm9wcmlhdGUiOgogIGV4aXN0cyAiSElWIHRlc3RpbmcgZm9yIHBhcnRuZXJzIGFuZCBzb2NpYWwgY29udGFjdHMgb2YgcGVvcGxlIGZyb20ga2V5IHBvcHVsYXRpb25zLCB3aGVyZSBhcHByb3ByaWF0ZSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkhJViB0ZXN0aW5nIGZvciBwYXJ0bmVycyBhbmQgc29jaWFsIGNvbnRhY3RzIG9mIHBlb3BsZSBmcm9tIGtleSBwb3B1bGF0aW9ucywgd2hlcmUgYXBwcm9wcmlhdGUgT2JzZXJ2YXRpb24iCmRlZmluZSAiSElWIHRlc3RpbmcgZm9yIHBhcnRuZXJzIGFuZCBzb2NpYWwgY29udGFjdHMgb2YgcGVvcGxlIGZyb20ga2V5IHBvcHVsYXRpb25zLCB3aGVyZSBhcHByb3ByaWF0ZSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJISVYgdGVzdGluZyBmb3IgcGFydG5lcnMgYW5kIHNvY2lhbCBjb250YWN0cyBvZiBwZW9wbGUgZnJvbSBrZXkgcG9wdWxhdGlvbnMsIHdoZXJlIGFwcHJvcHJpYXRlIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSElWIHRlc3RpbmcgZm9yIHBhcnRuZXJzIGFuZCBzb2NpYWwgY29udGFjdHMgb2YgcGVvcGxlIGZyb20ga2V5IHBvcHVsYXRpb25zLCB3aGVyZSBhcHByb3ByaWF0ZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJViB0ZXN0aW5nIGZvciBwYXJ0bmVycyBhbmQgc29jaWFsIGNvbnRhY3RzIG9mIHBlb3BsZSBmcm9tIGtleSBwb3B1bGF0aW9ucywgd2hlcmUgYXBwcm9wcmlhdGUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBISVYgdGVzdGluZyBmb3IgcGFydG5lcnMgYW5kIHNvY2lhbCBjb250YWN0cyBvZiBwZW9wbGUgZnJvbSBrZXkgcG9wdWxhdGlvbnMsIHdoZXJlIGFwcHJvcHJpYXRlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTU4IC0gU2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIGludGVncmF0ZWQgc2VydmljZXMKQGFjdGl2aXR5OiBISVYuQjkgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgdG8gc2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTZXh1YWwgYW5kIHJlcHJvZHVjdGl2ZSBoZWFsdGggaW50ZWdyYXRlZCBzZXJ2aWNlcyBCLkRFMTU4IjoKICBleGlzdHMgIlNleHVhbCBhbmQgcmVwcm9kdWN0aXZlIGhlYWx0aCBpbnRlZ3JhdGVkIHNlcnZpY2VzIEIuREUxNTggT2JzZXJ2YXRpb24iCmRlZmluZSAiU2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIGludGVncmF0ZWQgc2VydmljZXMgQi5ERTE1OCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNleHVhbCBhbmQgcmVwcm9kdWN0aXZlIGhlYWx0aCBpbnRlZ3JhdGVkIHNlcnZpY2VzIEIuREUxNTggT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTZXh1YWwgYW5kIHJlcHJvZHVjdGl2ZSBoZWFsdGggaW50ZWdyYXRlZCBzZXJ2aWNlcyBCLkRFMTU4ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTU5IC0gQ29udHJhY2VwdGlvbiBhbmQgZmFtaWx5IHBsYW5uaW5nCkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIGNvbnRyYWNlcHRpb24gYW5kIGZhbWlseSBwbGFubmluZyBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ29udHJhY2VwdGlvbiBhbmQgZmFtaWx5IHBsYW5uaW5nIEIuREUxNTkiOgogIGV4aXN0cyAiQ29udHJhY2VwdGlvbiBhbmQgZmFtaWx5IHBsYW5uaW5nIEIuREUxNTkgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDb250cmFjZXB0aW9uIGFuZCBmYW1pbHkgcGxhbm5pbmcgQi5ERTE1OSBPYnNlcnZhdGlvbiIKZGVmaW5lICJDb250cmFjZXB0aW9uIGFuZCBmYW1pbHkgcGxhbm5pbmcgQi5ERTE1OSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJDb250cmFjZXB0aW9uIGFuZCBmYW1pbHkgcGxhbm5pbmcgQi5ERTE1OSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNvbnRyYWNlcHRpb24gYW5kIGZhbWlseSBwbGFubmluZyBCLkRFMTU5IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ29udHJhY2VwdGlvbiBhbmQgZmFtaWx5IHBsYW5uaW5nIEIuREUxNTkgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDb250cmFjZXB0aW9uIGFuZCBmYW1pbHkgcGxhbm5pbmcgQi5ERTE1OSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE2MCAtIENoZWNrIHByZWduYW5jeSBzdGF0dXMKQGFjdGl2aXR5OiBISVYuQjkgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogQ2hlY2sgd29tZW4ncyBwcmVnbmFuY3kgc3RhdHVzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEIuREUxNjAiOgogIGV4aXN0cyAiQ2hlY2sgcHJlZ25hbmN5IHN0YXR1cyBCLkRFMTYwIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ2hlY2sgcHJlZ25hbmN5IHN0YXR1cyBCLkRFMTYwIE9ic2VydmF0aW9uIgpkZWZpbmUgIkNoZWNrIHByZWduYW5jeSBzdGF0dXMgQi5ERTE2MCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEIuREUxNjAgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEIuREUxNjAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEIuREUxNjAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEIuREUxNjAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNjEgLSBQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24gY291bnNlbGxpbmcKQGFjdGl2aXR5OiBISVYuQjkgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgc2VydmljZXMgZm9yIHByZXZlbnRpb24gb2YgbW90aGVyLXRvLWNoaWxkIHRyYW5zbWlzc2lvbiAoY291bnNlbGxpbmcpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24gY291bnNlbGxpbmciOgogIGV4aXN0cyAiUHJldmVudGlvbiBvZiBtb3RoZXItdG8tY2hpbGQgdHJhbnNtaXNzaW9uIGNvdW5zZWxsaW5nIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUHJldmVudGlvbiBvZiBtb3RoZXItdG8tY2hpbGQgdHJhbnNtaXNzaW9uIGNvdW5zZWxsaW5nIE9ic2VydmF0aW9uIgpkZWZpbmUgIlByZXZlbnRpb24gb2YgbW90aGVyLXRvLWNoaWxkIHRyYW5zbWlzc2lvbiBjb3Vuc2VsbGluZyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24gY291bnNlbGxpbmcgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24gY291bnNlbGxpbmcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24gY291bnNlbGxpbmcgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24gY291bnNlbGxpbmcgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNjIgLSBDZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIGFuZCB0cmVhdG1lbnQgY291bnNlbGxpbmcKQGFjdGl2aXR5OiBISVYuQjkgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgY2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBhbmQgdHJlYXRtZW50IGNvdW5zZWxsaW5nIGFuZCBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBhbmQgdHJlYXRtZW50IGNvdW5zZWxsaW5nIjoKICBleGlzdHMgIkNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgYW5kIHRyZWF0bWVudCBjb3Vuc2VsbGluZyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgYW5kIHRyZWF0bWVudCBjb3Vuc2VsbGluZyBPYnNlcnZhdGlvbiIKZGVmaW5lICJDZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIGFuZCB0cmVhdG1lbnQgY291bnNlbGxpbmcgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBhbmQgdHJlYXRtZW50IGNvdW5zZWxsaW5nIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBhbmQgdHJlYXRtZW50IGNvdW5zZWxsaW5nIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBhbmQgdHJlYXRtZW50IGNvdW5zZWxsaW5nIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBhbmQgdHJlYXRtZW50IGNvdW5zZWxsaW5nICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTYzIC0gQW5hbCBjYW5jZXIgc2NyZWVuaW5nIGZvciBtZW4gd2hvIGhhdmUgc2V4IHdpdGggbWVuCkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIHNlcnZpY2VzIGZvciBhbmFsIGNhbmNlciBzY3JlZW5pbmcgKGZvciBtZW4gd2hvIGhhdmUgc2V4IHdpdGggbWVuKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQW5hbCBjYW5jZXIgc2NyZWVuaW5nIGZvciBtZW4gd2hvIGhhdmUgc2V4IHdpdGggbWVuIEIuREUxNjMiOgogIGV4aXN0cyAiQW5hbCBjYW5jZXIgc2NyZWVuaW5nIGZvciBtZW4gd2hvIGhhdmUgc2V4IHdpdGggbWVuIEIuREUxNjMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBbmFsIGNhbmNlciBzY3JlZW5pbmcgZm9yIG1lbiB3aG8gaGF2ZSBzZXggd2l0aCBtZW4gQi5ERTE2MyBPYnNlcnZhdGlvbiIKZGVmaW5lICJBbmFsIGNhbmNlciBzY3JlZW5pbmcgZm9yIG1lbiB3aG8gaGF2ZSBzZXggd2l0aCBtZW4gQi5ERTE2MyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBbmFsIGNhbmNlciBzY3JlZW5pbmcgZm9yIG1lbiB3aG8gaGF2ZSBzZXggd2l0aCBtZW4gQi5ERTE2MyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFuYWwgY2FuY2VyIHNjcmVlbmluZyBmb3IgbWVuIHdobyBoYXZlIHNleCB3aXRoIG1lbiBCLkRFMTYzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQW5hbCBjYW5jZXIgc2NyZWVuaW5nIGZvciBtZW4gd2hvIGhhdmUgc2V4IHdpdGggbWVuIEIuREUxNjMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBbmFsIGNhbmNlciBzY3JlZW5pbmcgZm9yIG1lbiB3aG8gaGF2ZSBzZXggd2l0aCBtZW4gQi5ERTE2MyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE2NCAtIFNUSSB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQgc2VydmljZXMKQGFjdGl2aXR5OiBISVYuQjkgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgc2V4dWFsbHkgdHJhbnNtaXR0ZWQgaW5mZWN0aW9uIChTVEkpIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU1RJIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBzZXJ2aWNlcyI6CiAgZXhpc3RzICJTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IHNlcnZpY2VzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU1RJIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBzZXJ2aWNlcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IHNlcnZpY2VzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNUSSB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQgc2VydmljZXMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IHNlcnZpY2VzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU1RJIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBzZXJ2aWNlcyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNUSSB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQgc2VydmljZXMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNjUgLSBPZmZlciBvdGhlciBjbGluaWNhbCBzZXJ2aWNlcwpAYWN0aXZpdHk6IEhJVi5COSBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBPdGhlciBjbGluaWNhbCBzZXJ2aWNlcyBvZmZlcmVkIG9yIHJlZmVycmFscyBnaXZlbiB0byB0aGUgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJPZmZlciBvdGhlciBjbGluaWNhbCBzZXJ2aWNlcyBCLkRFMTY1IjoKICBleGlzdHMgIk9mZmVyIG90aGVyIGNsaW5pY2FsIHNlcnZpY2VzIEIuREUxNjUgT2JzZXJ2YXRpb24iCmRlZmluZSAiT2ZmZXIgb3RoZXIgY2xpbmljYWwgc2VydmljZXMgQi5ERTE2NSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk9mZmVyIG90aGVyIGNsaW5pY2FsIHNlcnZpY2VzIEIuREUxNjUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBPZmZlciBvdGhlciBjbGluaWNhbCBzZXJ2aWNlcyBCLkRFMTY1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTY2IC0gQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucwpAYWN0aXZpdHk6IEhJVi5COSBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBBc3Nlc3NtZW50IGFuZCBwcm92aXNpb24gb2YgdmFjY2luYXRpb25zLCBzdWNoIGFzIGZvciBwZW9wbGUgZnJvbSBrZXkgcG9wdWxhdGlvbnMsIHByZWduYW50IHdvbWVuIGFuZCBpbmZhbnRzOyBhbmQsIHdoZXJlIGFwcHJvcHJpYXRlLCB0ZXRhbnVzIHZhY2NpbmF0aW9uIGZvciBhZG9sZXNjZW50IGJveXMgYW5kIG1lbiByZWNlaXZpbmcgVk1NQwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBCLkRFMTY2IjoKICBleGlzdHMgIkFzc2Vzc21lbnQgYW5kIHByb3Zpc2lvbiBvZiB2YWNjaW5hdGlvbnMgQi5ERTE2NiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFzc2Vzc21lbnQgYW5kIHByb3Zpc2lvbiBvZiB2YWNjaW5hdGlvbnMgQi5ERTE2NiBPYnNlcnZhdGlvbiIKZGVmaW5lICJBc3Nlc3NtZW50IGFuZCBwcm92aXNpb24gb2YgdmFjY2luYXRpb25zIEIuREUxNjYgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBCLkRFMTY2IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBCLkRFMTY2IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBCLkRFMTY2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBCLkRFMTY2ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTY3IC0gSGVwYXRpdGlzIEIgSEJWIGFuZCBoZXBhdGl0aXMgQyB2aXJ1cyBIQ1YgdGVzdGluZyBhbmQgdHJlYXRtZW50IHByb3ZpZGVkCkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBIQlYgYW5kL29yIEhDViB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhlcGF0aXRpcyBCIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBwcm92aWRlZCI6CiAgZXhpc3RzICJIZXBhdGl0aXMgQiBIQlYgYW5kIGhlcGF0aXRpcyBDIHZpcnVzIEhDViB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQgcHJvdmlkZWQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJIZXBhdGl0aXMgQiBIQlYgYW5kIGhlcGF0aXRpcyBDIHZpcnVzIEhDViB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQgcHJvdmlkZWQgT2JzZXJ2YXRpb24iCmRlZmluZSAiSGVwYXRpdGlzIEIgSEJWIGFuZCBoZXBhdGl0aXMgQyB2aXJ1cyBIQ1YgdGVzdGluZyBhbmQgdHJlYXRtZW50IHByb3ZpZGVkIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhlcGF0aXRpcyBCIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBwcm92aWRlZCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkhlcGF0aXRpcyBCIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBwcm92aWRlZCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhlcGF0aXRpcyBCIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBwcm92aWRlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhlcGF0aXRpcyBCIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBwcm92aWRlZCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE2OCAtIENvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBQbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEgcHJvdmlkZWQKQGFjdGl2aXR5OiBISVYuQjkgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgZm9yIGNvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBwbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBQbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEgcHJvdmlkZWQiOgogIGV4aXN0cyAiQ28tdHJpbW94YXpvbGUgY2hlbW9wcm9waHlsYXhpcyB0byBwcmV2ZW50IFBuZXVtb2N5c3RpcyBjYXJpbmlpIHBuZXVtb25pYSBwcm92aWRlZCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkNvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBQbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEgcHJvdmlkZWQgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ28tdHJpbW94YXpvbGUgY2hlbW9wcm9waHlsYXhpcyB0byBwcmV2ZW50IFBuZXVtb2N5c3RpcyBjYXJpbmlpIHBuZXVtb25pYSBwcm92aWRlZCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJDby10cmltb3hhem9sZSBjaGVtb3Byb3BoeWxheGlzIHRvIHByZXZlbnQgUG5ldW1vY3lzdGlzIGNhcmluaWkgcG5ldW1vbmlhIHByb3ZpZGVkIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ28tdHJpbW94YXpvbGUgY2hlbW9wcm9waHlsYXhpcyB0byBwcmV2ZW50IFBuZXVtb2N5c3RpcyBjYXJpbmlpIHBuZXVtb25pYSBwcm92aWRlZCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBQbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEgcHJvdmlkZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDby10cmltb3hhem9sZSBjaGVtb3Byb3BoeWxheGlzIHRvIHByZXZlbnQgUG5ldW1vY3lzdGlzIGNhcmluaWkgcG5ldW1vbmlhIHByb3ZpZGVkICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTY5IC0gSW50ZW5zaWZpZWQgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudCBwcm92aWRlZApAYWN0aXZpdHk6IEhJVi5COSBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBPZmZlciBvciByZWZlciBmb3IgaW50ZW5zaWZpZWQgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW50ZW5zaWZpZWQgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudCBwcm92aWRlZCI6CiAgZXhpc3RzICJJbnRlbnNpZmllZCBUQiBjYXNlIGZpbmRpbmcgYW5kIGxpbmthZ2UgdG8gVEIgdHJlYXRtZW50IHByb3ZpZGVkIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSW50ZW5zaWZpZWQgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudCBwcm92aWRlZCBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbnRlbnNpZmllZCBUQiBjYXNlIGZpbmRpbmcgYW5kIGxpbmthZ2UgdG8gVEIgdHJlYXRtZW50IHByb3ZpZGVkIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkludGVuc2lmaWVkIFRCIGNhc2UgZmluZGluZyBhbmQgbGlua2FnZSB0byBUQiB0cmVhdG1lbnQgcHJvdmlkZWQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJJbnRlbnNpZmllZCBUQiBjYXNlIGZpbmRpbmcgYW5kIGxpbmthZ2UgdG8gVEIgdHJlYXRtZW50IHByb3ZpZGVkIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW50ZW5zaWZpZWQgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudCBwcm92aWRlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEludGVuc2lmaWVkIFRCIGNhc2UgZmluZGluZyBhbmQgbGlua2FnZSB0byBUQiB0cmVhdG1lbnQgcHJvdmlkZWQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNzAgLSBQcm92aXNpb24gb2YgaXNvbmlhemlkIHByZXZlbnRpdmUgdGhlcmFweSBpZiBwZXJzb24gZG9lcyBub3QgaGF2ZSBUQgpAYWN0aXZpdHk6IEhJVi5COSBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBPZmZlciBvciByZWZlciBmb3IgcHJvdmlzaW9uIG9mIGlzb25pYXppZCBwcmV2ZW50aXZlIHRoZXJhcHkgaWYgcGVyc29uIGRvZXMgbm90IGhhdmUgVEIKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlByb3Zpc2lvbiBvZiBpc29uaWF6aWQgcHJldmVudGl2ZSB0aGVyYXB5IGlmIHBlcnNvbiBkb2VzIG5vdCBoYXZlIFRCIEIuREUxNzAiOgogIGV4aXN0cyAiUHJvdmlzaW9uIG9mIGlzb25pYXppZCBwcmV2ZW50aXZlIHRoZXJhcHkgaWYgcGVyc29uIGRvZXMgbm90IGhhdmUgVEIgQi5ERTE3MCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlByb3Zpc2lvbiBvZiBpc29uaWF6aWQgcHJldmVudGl2ZSB0aGVyYXB5IGlmIHBlcnNvbiBkb2VzIG5vdCBoYXZlIFRCIEIuREUxNzAgT2JzZXJ2YXRpb24iCmRlZmluZSAiUHJvdmlzaW9uIG9mIGlzb25pYXppZCBwcmV2ZW50aXZlIHRoZXJhcHkgaWYgcGVyc29uIGRvZXMgbm90IGhhdmUgVEIgQi5ERTE3MCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQcm92aXNpb24gb2YgaXNvbmlhemlkIHByZXZlbnRpdmUgdGhlcmFweSBpZiBwZXJzb24gZG9lcyBub3QgaGF2ZSBUQiBCLkRFMTcwIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUHJvdmlzaW9uIG9mIGlzb25pYXppZCBwcmV2ZW50aXZlIHRoZXJhcHkgaWYgcGVyc29uIGRvZXMgbm90IGhhdmUgVEIgQi5ERTE3MCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlByb3Zpc2lvbiBvZiBpc29uaWF6aWQgcHJldmVudGl2ZSB0aGVyYXB5IGlmIHBlcnNvbiBkb2VzIG5vdCBoYXZlIFRCIEIuREUxNzAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQcm92aXNpb24gb2YgaXNvbmlhemlkIHByZXZlbnRpdmUgdGhlcmFweSBpZiBwZXJzb24gZG9lcyBub3QgaGF2ZSBUQiBCLkRFMTcwICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTcxIC0gTWFsYXJpYSBwcmV2ZW50aW9uIHN1Y2ggYXMgYmVkIG5ldHMgYW5kIHByb3BoeWxheGlzLCBkZXBlbmRpbmcgb24gZXBpZGVtaW9sb2d5CkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBtYWxhcmlhIHByZXZlbnRpb24gKHN1Y2ggYXMgYmVkIG5ldHMgYW5kIHByb3BoeWxheGlzKSwgZGVwZW5kaW5nIG9uIGVwaWRlbWlvbG9neQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTWFsYXJpYSBwcmV2ZW50aW9uIHN1Y2ggYXMgYmVkIG5ldHMgYW5kIHByb3BoeWxheGlzLCBkZXBlbmRpbmcgb24gZXBpZGVtaW9sb2d5IEIuREUxNzEiOgogIGV4aXN0cyAiTWFsYXJpYSBwcmV2ZW50aW9uIHN1Y2ggYXMgYmVkIG5ldHMgYW5kIHByb3BoeWxheGlzLCBkZXBlbmRpbmcgb24gZXBpZGVtaW9sb2d5IEIuREUxNzEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kgQi5ERTE3MSBPYnNlcnZhdGlvbiIKZGVmaW5lICJNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kgQi5ERTE3MSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kgQi5ERTE3MSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk1hbGFyaWEgcHJldmVudGlvbiBzdWNoIGFzIGJlZCBuZXRzIGFuZCBwcm9waHlsYXhpcywgZGVwZW5kaW5nIG9uIGVwaWRlbWlvbG9neSBCLkRFMTcxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTWFsYXJpYSBwcmV2ZW50aW9uIHN1Y2ggYXMgYmVkIG5ldHMgYW5kIHByb3BoeWxheGlzLCBkZXBlbmRpbmcgb24gZXBpZGVtaW9sb2d5IEIuREUxNzEgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kgQi5ERTE3MSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE3MiAtIE90aGVyIHN1cHBvcnQgc2VydmljZXMKQGFjdGl2aXR5OiBISVYuQjkgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgZm9yIG90aGVyIHN1cHBvcnQgc2VydmljZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk90aGVyIHN1cHBvcnQgc2VydmljZXMgQi5ERTE3MiI6CiAgZXhpc3RzICJPdGhlciBzdXBwb3J0IHNlcnZpY2VzIEIuREUxNzIgT2JzZXJ2YXRpb24iCmRlZmluZSAiT3RoZXIgc3VwcG9ydCBzZXJ2aWNlcyBCLkRFMTcyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iT3RoZXIgc3VwcG9ydCBzZXJ2aWNlcyBCLkRFMTcyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT3RoZXIgc3VwcG9ydCBzZXJ2aWNlcyBCLkRFMTcyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTczIC0gTWVudGFsIGhlYWx0aCBzZXJ2aWNlcwpAYWN0aXZpdHk6IEhJVi5COSBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBPZmZlciBvciByZWZlciBmb3IgbWVudGFsIGhlYWx0aCBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBCLkRFMTczIjoKICBleGlzdHMgIk1lbnRhbCBoZWFsdGggc2VydmljZXMgQi5ERTE3MyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk1lbnRhbCBoZWFsdGggc2VydmljZXMgQi5ERTE3MyBPYnNlcnZhdGlvbiIKZGVmaW5lICJNZW50YWwgaGVhbHRoIHNlcnZpY2VzIEIuREUxNzMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBCLkRFMTczIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBCLkRFMTczIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBCLkRFMTczIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBCLkRFMTczICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTc0IC0gUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nCkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBwc3ljaG9zb2NpYWwgY291bnNlbGxpbmcsIHN1cHBvcnQgYW5kIHRyZWF0bWVudCBhZGhlcmVuY2UgY291bnNlbGxpbmcKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBzeWNob3NvY2lhbCBjb3Vuc2VsbGluZywgc3VwcG9ydCBhbmQgdHJlYXRtZW50IGFkaGVyZW5jZSBjb3Vuc2VsbGluZyBCLkRFMTc0IjoKICBleGlzdHMgIlBzeWNob3NvY2lhbCBjb3Vuc2VsbGluZywgc3VwcG9ydCBhbmQgdHJlYXRtZW50IGFkaGVyZW5jZSBjb3Vuc2VsbGluZyBCLkRFMTc0IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIEIuREUxNzQgT2JzZXJ2YXRpb24iCmRlZmluZSAiUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIEIuREUxNzQgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIEIuREUxNzQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQc3ljaG9zb2NpYWwgY291bnNlbGxpbmcsIHN1cHBvcnQgYW5kIHRyZWF0bWVudCBhZGhlcmVuY2UgY291bnNlbGxpbmcgQi5ERTE3NCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBzeWNob3NvY2lhbCBjb3Vuc2VsbGluZywgc3VwcG9ydCBhbmQgdHJlYXRtZW50IGFkaGVyZW5jZSBjb3Vuc2VsbGluZyBCLkRFMTc0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIEIuREUxNzQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNzUgLSBTdXBwb3J0IGZvciBkaXNjbG9zdXJlIGFuZCBwYXJ0bmVyIHNlcnZpY2VzCkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBzdXBwb3J0IGZvciBkaXNjbG9zdXJlIGFuZCBwYXJ0bmVyIHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTdXBwb3J0IGZvciBkaXNjbG9zdXJlIGFuZCBwYXJ0bmVyIHNlcnZpY2VzIEIuREUxNzUiOgogIGV4aXN0cyAiU3VwcG9ydCBmb3IgZGlzY2xvc3VyZSBhbmQgcGFydG5lciBzZXJ2aWNlcyBCLkRFMTc1IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU3VwcG9ydCBmb3IgZGlzY2xvc3VyZSBhbmQgcGFydG5lciBzZXJ2aWNlcyBCLkRFMTc1IE9ic2VydmF0aW9uIgpkZWZpbmUgIlN1cHBvcnQgZm9yIGRpc2Nsb3N1cmUgYW5kIHBhcnRuZXIgc2VydmljZXMgQi5ERTE3NSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJTdXBwb3J0IGZvciBkaXNjbG9zdXJlIGFuZCBwYXJ0bmVyIHNlcnZpY2VzIEIuREUxNzUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTdXBwb3J0IGZvciBkaXNjbG9zdXJlIGFuZCBwYXJ0bmVyIHNlcnZpY2VzIEIuREUxNzUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTdXBwb3J0IGZvciBkaXNjbG9zdXJlIGFuZCBwYXJ0bmVyIHNlcnZpY2VzIEIuREUxNzUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTdXBwb3J0IGZvciBkaXNjbG9zdXJlIGFuZCBwYXJ0bmVyIHNlcnZpY2VzIEIuREUxNzUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNzYgLSBMZWdhbCBhbmQgc29jaWFsIHNlcnZpY2VzCkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBsZWdhbCBhbmQgc29jaWFsIHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJMZWdhbCBhbmQgc29jaWFsIHNlcnZpY2VzIEIuREUxNzYiOgogIGV4aXN0cyAiTGVnYWwgYW5kIHNvY2lhbCBzZXJ2aWNlcyBCLkRFMTc2IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTGVnYWwgYW5kIHNvY2lhbCBzZXJ2aWNlcyBCLkRFMTc2IE9ic2VydmF0aW9uIgpkZWZpbmUgIkxlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMgQi5ERTE3NiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJMZWdhbCBhbmQgc29jaWFsIHNlcnZpY2VzIEIuREUxNzYgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJMZWdhbCBhbmQgc29jaWFsIHNlcnZpY2VzIEIuREUxNzYgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJMZWdhbCBhbmQgc29jaWFsIHNlcnZpY2VzIEIuREUxNzYgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBMZWdhbCBhbmQgc29jaWFsIHNlcnZpY2VzIEIuREUxNzYgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUxNzcgLSBTZXJ2aWNlcyBmb3IgcmVzcG9uZGluZyB0byB2aW9sZW5jZSBhZ2FpbnN0IHdvbWVuCkBhY3Rpdml0eTogSElWLkI5IERldGVybWluZSByZWNvbW1lbmRlZCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBzZXJ2aWNlcyBmb3IgcmVzcG9uZGluZyB0byB2aW9sZW5jZSBhZ2FpbnN0IHdvbWVuLCBpbmNsdWRpbmcgZmlyc3QtbGluZSBzdXBwb3J0IGFuZCBwc3ljaG9zb2NpYWwgc3VwcG9ydCwgcG9zdC1yYXBlIGNhcmUgYW5kIG90aGVyIHN1cHBvcnQgc2VydmljZXMgaW5jbHVkaW5nIHNoZWx0ZXJzLCBsZWdhbCBzZXJ2aWNlcyBhbmQgd29tZW4gYW5kIGNoaWxkIHByb3RlY3Rpb24gc2VydmljZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gQi5ERTE3NyI6CiAgZXhpc3RzICJTZXJ2aWNlcyBmb3IgcmVzcG9uZGluZyB0byB2aW9sZW5jZSBhZ2FpbnN0IHdvbWVuIEIuREUxNzcgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJTZXJ2aWNlcyBmb3IgcmVzcG9uZGluZyB0byB2aW9sZW5jZSBhZ2FpbnN0IHdvbWVuIEIuREUxNzcgT2JzZXJ2YXRpb24iCmRlZmluZSAiU2VydmljZXMgZm9yIHJlc3BvbmRpbmcgdG8gdmlvbGVuY2UgYWdhaW5zdCB3b21lbiBCLkRFMTc3IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gQi5ERTE3NyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gQi5ERTE3NyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gQi5ERTE3NyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gQi5ERTE3NyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE5MSAtIFR5cGUgb2YgZm9sbG93LXVwIGFwcG9pbnRtZW50CkBhY3Rpdml0eTogSElWLkIyMCBTY2hlZHVsZSByZXRlc3QKQGRlc2NyaXB0aW9uOiBUeXBlIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudCBmb3IgdGVzdGluZyBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVHlwZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgQi5ERTE5MSI6CiAgZXhpc3RzICJUeXBlIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudCBCLkRFMTkxIE9ic2VydmF0aW9uIgpkZWZpbmUgIlR5cGUgb2YgZm9sbG93LXVwIGFwcG9pbnRtZW50IEIuREUxOTEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUeXBlIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudCBCLkRFMTkxIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVHlwZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgQi5ERTE5MSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE5MiAtIFJldGVzdGluZyBmb3IgSElWCkBhY3Rpdml0eTogSElWLkIyMCBTY2hlZHVsZSByZXRlc3QKQGRlc2NyaXB0aW9uOiBSZXRlc3RpbmcgZm9sbG93LXVwIGFwcG9pbnRtZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSZXRlc3RpbmcgZm9yIEhJViBCLkRFMTkyIjoKICBleGlzdHMgIlJldGVzdGluZyBmb3IgSElWIEIuREUxOTIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJSZXRlc3RpbmcgZm9yIEhJViBCLkRFMTkyIE9ic2VydmF0aW9uIgpkZWZpbmUgIlJldGVzdGluZyBmb3IgSElWIEIuREUxOTIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUmV0ZXN0aW5nIGZvciBISVYgQi5ERTE5MiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlJldGVzdGluZyBmb3IgSElWIEIuREUxOTIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSZXRlc3RpbmcgZm9yIEhJViBCLkRFMTkyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUmV0ZXN0aW5nIGZvciBISVYgQi5ERTE5MiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTE5MyAtIE90aGVyCkBhY3Rpdml0eTogSElWLkIyMCBTY2hlZHVsZSByZXRlc3QKQGRlc2NyaXB0aW9uOiBPdGhlciByZWFzb24gZm9yIHRoZSBmb2xsb3ctdXAgYXBwb2ludG1lbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk90aGVyIEIuREUxOTMiOgogIGV4aXN0cyAiT3RoZXIgQi5ERTE5MyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk90aGVyIEIuREUxOTMgT2JzZXJ2YXRpb24iCmRlZmluZSAiT3RoZXIgQi5ERTE5MyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJPdGhlciBCLkRFMTkzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiT3RoZXIgQi5ERTE5MyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk90aGVyIEIuREUxOTMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBPdGhlciBCLkRFMTkzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMTk1IC0gRGF0ZS90aW1lIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudApAYWN0aXZpdHk6IEhJVi5CMjAgU2NoZWR1bGUgcmV0ZXN0CkBkZXNjcmlwdGlvbjogRGF0ZSB0aGUgcGF0aWVudCBpcyB0byByZXR1cm4gZm9yIG1vbml0b3JpbmcsIHJlLXN1cHBseSBvciBhbnkgb3RoZXIgcmVhc29uCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJEYXRlL3RpbWUgb2YgZm9sbG93LXVwIGFwcG9pbnRtZW50IEIuREUxOTUiOgogIEVsZW1lbnRzLiJEYXRlL3RpbWUgb2YgZm9sbG93LXVwIGFwcG9pbnRtZW50IEIuREUxOTUiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRGF0ZS90aW1lIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudCBCLkRFMTk1IFZhbHVlIjoKICAiRGF0ZS90aW1lIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudCBCLkRFMTk1IiBPCiAgcmV0dXJuIE8udmFsdWUKLyogRW5kIG9mIERhdGUvdGltZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgQi5ERTE5NSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTIyNCAtIEhJViByZXRlc3QgcHJpb3IgdG8gc3RhcnRpbmcgQVJUIGNvbmR1Y3RlZApAYWN0aXZpdHk6IEhJVi5CMjAgU2NoZWR1bGUgcmV0ZXN0CkBkZXNjcmlwdGlvbjogSElWIHJldGVzdCBwcmlvciB0byBzdGFydGluZyBBUlQgY29uZHVjdGVkCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJISVYgcmV0ZXN0IHByaW9yIHRvIHN0YXJ0aW5nIEFSVCBjb25kdWN0ZWQiOgogIGV4aXN0cyAiSElWIHJldGVzdCBwcmlvciB0byBzdGFydGluZyBBUlQgY29uZHVjdGVkIE9ic2VydmF0aW9uIgpkZWZpbmUgIkhJViByZXRlc3QgcHJpb3IgdG8gc3RhcnRpbmcgQVJUIGNvbmR1Y3RlZCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJViByZXRlc3QgcHJpb3IgdG8gc3RhcnRpbmcgQVJUIGNvbmR1Y3RlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhJViByZXRlc3QgcHJpb3IgdG8gc3RhcnRpbmcgQVJUIGNvbmR1Y3RlZCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTIyNSAtIEF0IGVsZXZhdGVkIHJpc2sgZm9yIEhJViBhY3F1aXNpdGlvbgpAYWN0aXZpdHk6IEhJVi5CNiBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IENsaWVudCBpcyBhdCBlbGV2YXRlZCByaXNrIGZvciBISVYgYWNxdWlzaXRpb24KKi8KZGVmaW5lICJBdCBlbGV2YXRlZCByaXNrIGZvciBISVYgYWNxdWlzaXRpb24gQi5ERTIyNSI6CiAgRWxlbWVudHMuIkF0IGVsZXZhdGVkIHJpc2sgZm9yIEhJViBhY3F1aXNpdGlvbiBCLkRFMjI1IiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKICAgICAgb3IgQy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKLyogRW5kIG9mIEF0IGVsZXZhdGVkIHJpc2sgZm9yIEhJViBhY3F1aXNpdGlvbiBCLkRFMjI1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5CLkRFMjUwIC0gU3lwaGlsaXMgdGVzdCByZXN1bHQKQGFjdGl2aXR5OiBISVYuQjIzIE9mZmVyIHNleHVhbCBhbmQgcmVwcm9kdWN0aXZlIGhlYWx0aCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IFJlc3VsdCBmcm9tIHN5cGhpbGlzIHRlc3QKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlN5cGhpbGlzIHRlc3QgcmVzdWx0IEIuREUyNTAiOgogIGV4aXN0cyAiU3lwaGlsaXMgdGVzdCByZXN1bHQgQi5ERTI1MCBPYnNlcnZhdGlvbiIKZGVmaW5lICJTeXBoaWxpcyB0ZXN0IHJlc3VsdCBCLkRFMjUwIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU3lwaGlsaXMgdGVzdCByZXN1bHQgQi5ERTI1MCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFN5cGhpbGlzIHRlc3QgcmVzdWx0IEIuREUyNTAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUyNTEgLSBQb3NpdGl2ZQpAYWN0aXZpdHk6IEhJVi5CMjMgT2ZmZXIgc2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogVGVzdCByZXN1bHQgaXMgcG9zaXRpdmUgZm9yIHN5cGhpbGlzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQb3NpdGl2ZSBCLkRFMjUxIjoKICBleGlzdHMgIlBvc2l0aXZlIEIuREUyNTEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQb3NpdGl2ZSBCLkRFMjUxIE9ic2VydmF0aW9uIgpkZWZpbmUgIlBvc2l0aXZlIEIuREUyNTEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUG9zaXRpdmUgQi5ERTI1MSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQogICAgb3IgQy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKZGVmaW5lICJQb3NpdGl2ZSBCLkRFMjUxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUG9zaXRpdmUgQi5ERTI1MSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFBvc2l0aXZlIEIuREUyNTEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkIuREUyNTIgLSBOZWdhdGl2ZQpAYWN0aXZpdHk6IEhJVi5CMjMgT2ZmZXIgc2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogVGVzdCByZXN1bHQgaXMgbmVnYXRpdmUgZm9yIHN5cGhpbGlzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJOZWdhdGl2ZSBCLkRFMjUyIjoKICBleGlzdHMgIk5lZ2F0aXZlIEIuREUyNTIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJOZWdhdGl2ZSBCLkRFMjUyIE9ic2VydmF0aW9uIgpkZWZpbmUgIk5lZ2F0aXZlIEIuREUyNTIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTmVnYXRpdmUgQi5ERTI1MiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk5lZ2F0aXZlIEIuREUyNTIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJOZWdhdGl2ZSBCLkRFMjUyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTmVnYXRpdmUgQi5ERTI1MiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQi5ERTI1MyAtIEluY29uY2x1c2l2ZQpAYWN0aXZpdHk6IEhJVi5CMjMgT2ZmZXIgc2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogVGVzdCByZXN1bHQgaXMgaW5jb25jbHVzaXZlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJJbmNvbmNsdXNpdmUgQi5ERTI1MyI6CiAgZXhpc3RzICJJbmNvbmNsdXNpdmUgQi5ERTI1MyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkluY29uY2x1c2l2ZSBCLkRFMjUzIE9ic2VydmF0aW9uIgpkZWZpbmUgIkluY29uY2x1c2l2ZSBCLkRFMjUzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkluY29uY2x1c2l2ZSBCLkRFMjUzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSW5jb25jbHVzaXZlIEIuREUyNTMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJJbmNvbmNsdXNpdmUgQi5ERTI1MyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEluY29uY2x1c2l2ZSBCLkRFMjUzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFOSAtIERhdGUvdGltZSBvZiBzdXNwZWN0ZWQgZXhwb3N1cmUgdG8gSElWCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogV2hlbiB0aGUgc3VzcGVjdCBleHBvc3VyZSB0byBISVYgdG9vayBwbGFjZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRGF0ZS90aW1lIG9mIHN1c3BlY3RlZCBleHBvc3VyZSB0byBISVYgQy5ERTkiOgogIEVsZW1lbnRzLiJEYXRlL3RpbWUgb2Ygc3VzcGVjdGVkIGV4cG9zdXJlIHRvIEhJViBDLkRFOSIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEYXRlL3RpbWUgb2Ygc3VzcGVjdGVkIGV4cG9zdXJlIHRvIEhJViBDLkRFOSBWYWx1ZSI6CiAgIkRhdGUvdGltZSBvZiBzdXNwZWN0ZWQgZXhwb3N1cmUgdG8gSElWIEMuREU5IiBPCiAgcmV0dXJuIE8udmFsdWUKLyogRW5kIG9mIERhdGUvdGltZSBvZiBzdXNwZWN0ZWQgZXhwb3N1cmUgdG8gSElWIEMuREU5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTAgLSBDdXJyZW50bHkgb24gUHJFUApAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoZSBjbGllbnQgaXMgY3VycmVudGx5IHRha2luZyBQckVQLiBPcmFsIHByZS1leHBvc3VyZSBwcm9waHlsYXhpcyAoUHJFUCkgb2YgSElWIGlzIHRoZSB1c2Ugb2YgQVJWIGRydWdzIGJ5IHBlb3BsZSB3aG8gYXJlIG5vdCBpbmZlY3RlZCB3aXRoIEhJViB0byBibG9jayB0aGUgYWNxdWlzaXRpb24gb2YgSElWLgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ3VycmVudGx5IG9uIFByRVAiOgogIGV4aXN0cyAiQ3VycmVudGx5IG9uIFByRVAgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ3VycmVudGx5IG9uIFByRVAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDdXJyZW50bHkgb24gUHJFUCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEN1cnJlbnRseSBvbiBQckVQICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTcgLSBDdXJyZW50IFByRVAgcmVnaW1lbgpAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IEhJViBwcmUtZXhwb3N1cmUgcHJvcGh5bGF4aXMgKFByRVApIHJlZ2ltZW4KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkN1cnJlbnQgUHJFUCByZWdpbWVuIjoKICBleGlzdHMgIkN1cnJlbnQgUHJFUCByZWdpbWVuIE9ic2VydmF0aW9uIgpkZWZpbmUgIkN1cnJlbnQgUHJFUCByZWdpbWVuIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ3VycmVudCBQckVQIHJlZ2ltZW4gT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDdXJyZW50IFByRVAgcmVnaW1lbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTE4IC0gVERGICsgRlRDCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVHJlYXRlZCB3aXRoIHRlbm9mb3ZpciBkaXNvcHJveGlsIGZ1bWFyYXRlIChUREYpIGFuZCBlbXRyaWNpdGFiaW5lIChGVEMpIHByZS1leHBvc3VyZSBwcm9waHlsYXhpcyAoUHJFUCkgcmVnaW1lbiAob3JhbCBQckVQKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVERGICsgRlRDIEMuREUxOCI6CiAgZXhpc3RzICJUREYgKyBGVEMgQy5ERTE4IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVERGICsgRlRDIEMuREUxOCBPYnNlcnZhdGlvbiIKZGVmaW5lICJUREYgKyBGVEMgQy5ERTE4IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlRERiArIEZUQyBDLkRFMTggQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJUREYgKyBGVEMgQy5ERTE4IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVERGICsgRlRDIEMuREUxOCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFRERiArIEZUQyBDLkRFMTggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxOSAtIFRERgpAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRyZWF0ZWQgd2l0aCBzaW5nbGUtYWdlbnQgdGVub2ZvdmlyIGRpc29wcm94aWwgZnVtYXJhdGUgKFRERikgcHJlLWV4cG9zdXJlIHByb3BoeWxheGlzIChQckVQKSByZWdpbWVuIChvcmFsIFByRVApCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUREYgQy5ERTE5IjoKICBleGlzdHMgIlRERiBDLkRFMTkgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJUREYgQy5ERTE5IE9ic2VydmF0aW9uIgpkZWZpbmUgIlRERiBDLkRFMTkgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVERGIEMuREUxOSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlRERiBDLkRFMTkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUREYgQy5ERTE5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVERGIEMuREUxOSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTIwIC0gVERGICsgM1RDCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVHJlYXRlZCB3aXRoIHRlbm9mb3ZpciBkaXNvcHJveGlsIGZ1bWFyYXRlIChUREYpIGFuZCBsYW1pdnVkaW5lICgzVEMpIHByZS1leHBvc3VyZSBwcm9waHlsYXhpcyAoUHJFUCkgcmVnaW1lbiAob3JhbCBQckVQKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVERGICsgM1RDIEMuREUyMCI6CiAgZXhpc3RzICJUREYgKyAzVEMgQy5ERTIwIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVERGICsgM1RDIEMuREUyMCBPYnNlcnZhdGlvbiIKZGVmaW5lICJUREYgKyAzVEMgQy5ERTIwIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlRERiArIDNUQyBDLkRFMjAgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJUREYgKyAzVEMgQy5ERTIwIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVERGICsgM1RDIEMuREUyMCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFRERiArIDNUQyBDLkRFMjAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUyMSAtIE90aGVyIFRERi1iYXNlZCByZWdpbWVuCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVHJlYXRlZCB3aXRoIG90aGVyIHRlbm9mb3ZpciBkaXNvcHJveGlsIGZ1bWFyYXRlIChUREYpLWJhc2VkIHJlZ2ltZW4gKG9yYWwgUHJFUCkKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk90aGVyIFRERi1iYXNlZCByZWdpbWVuIjoKICBleGlzdHMgIk90aGVyIFRERi1iYXNlZCByZWdpbWVuIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiT3RoZXIgVERGLWJhc2VkIHJlZ2ltZW4gT2JzZXJ2YXRpb24iCmRlZmluZSAiT3RoZXIgVERGLWJhc2VkIHJlZ2ltZW4gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iT3RoZXIgVERGLWJhc2VkIHJlZ2ltZW4gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJPdGhlciBUREYtYmFzZWQgcmVnaW1lbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk90aGVyIFRERi1iYXNlZCByZWdpbWVuIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT3RoZXIgVERGLWJhc2VkIHJlZ2ltZW4gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUyMiAtIERhcGl2aXJpbmUgdmFnaW5hbCByaW5nIERWUgpAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IERhcGl2aXJpbmUgdmFnaW5hbCByaW5nIChEVlIpIGZvciBISVYgcHJldmVudGlvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRGFwaXZpcmluZSB2YWdpbmFsIHJpbmcgRFZSIEMuREUyMiI6CiAgZXhpc3RzICJEYXBpdmlyaW5lIHZhZ2luYWwgcmluZyBEVlIgQy5ERTIyIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRGFwaXZpcmluZSB2YWdpbmFsIHJpbmcgRFZSIEMuREUyMiBPYnNlcnZhdGlvbiIKZGVmaW5lICJEYXBpdmlyaW5lIHZhZ2luYWwgcmluZyBEVlIgQy5ERTIyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkRhcGl2aXJpbmUgdmFnaW5hbCByaW5nIERWUiBDLkRFMjIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEYXBpdmlyaW5lIHZhZ2luYWwgcmluZyBEVlIgQy5ERTIyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRGFwaXZpcmluZSB2YWdpbmFsIHJpbmcgRFZSIEMuREUyMiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIERhcGl2aXJpbmUgdmFnaW5hbCByaW5nIERWUiBDLkRFMjIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUyMyAtIENBQi1MQQpAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IExvbmctYWN0aW5nIGluamVjdGFibGUgY2Fib3RlZ3JhdmlyCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDQUItTEEgQy5ERTIzIjoKICBleGlzdHMgIkNBQi1MQSBDLkRFMjMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDQUItTEEgQy5ERTIzIE9ic2VydmF0aW9uIgpkZWZpbmUgIkNBQi1MQSBDLkRFMjMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ0FCLUxBIEMuREUyMyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNBQi1MQSBDLkRFMjMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDQUItTEEgQy5ERTIzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ0FCLUxBIEMuREUyMyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTMxIC0gUEVQIGhpc3RvcnkKQGFjdGl2aXR5OiBISVYuQzMgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUaGUgY2xpZW50J3MgaGlzdG9yeSBpbiB0YWtpbmcgcG9zdC1leHBvc3VyZSBwcm9waHlsYXhpcyAoUEVQKSBmb3IgSElWIHByZXZlbnRpb24KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBFUCBoaXN0b3J5IjoKICBleGlzdHMgIlBFUCBoaXN0b3J5IE9ic2VydmF0aW9uIgpkZWZpbmUgIlBFUCBoaXN0b3J5IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUEVQIGhpc3RvcnkgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQRVAgaGlzdG9yeSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTMyIC0gRmlyc3QtdGltZSB1c2VyCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVGhlIGNsaWVudCBoYXMgbmV2ZXIgdXNlZCBwb3N0LWV4cG9zdXJlIHByb3BoeWxheGlzIChQRVApIGJlZm9yZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRmlyc3QtdGltZSB1c2VyIEMuREUzMiI6CiAgZXhpc3RzICJGaXJzdC10aW1lIHVzZXIgQy5ERTMyIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRmlyc3QtdGltZSB1c2VyIEMuREUzMiBPYnNlcnZhdGlvbiIKZGVmaW5lICJGaXJzdC10aW1lIHVzZXIgQy5ERTMyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkZpcnN0LXRpbWUgdXNlciBDLkRFMzIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJGaXJzdC10aW1lIHVzZXIgQy5ERTMyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRmlyc3QtdGltZSB1c2VyIEMuREUzMiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEZpcnN0LXRpbWUgdXNlciBDLkRFMzIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUzMyAtIFJlcGVhdCB1c2VyCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVGhlIGNsaWVudCBoYXMgdXNlZCBwb3N0LWV4cG9zdXJlIHByb3BoeWxheGlzIChQRVApIGJlZm9yZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmVwZWF0IHVzZXIiOgogIGV4aXN0cyAiUmVwZWF0IHVzZXIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJSZXBlYXQgdXNlciBPYnNlcnZhdGlvbiIKZGVmaW5lICJSZXBlYXQgdXNlciBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJSZXBlYXQgdXNlciBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlJlcGVhdCB1c2VyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmVwZWF0IHVzZXIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBSZXBlYXQgdXNlciAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTM2IC0gU2lnbnMgb2Ygc3Vic3RhbnRpYWwgcmlzayBvZiBISVYgaW5mZWN0aW9uCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogU2lnbnMgdGhlIGNsaWVudCBpcyBhdCBhIHN1YnN0YW50aWFsIHJpc2sgb2YgSElWIGluZmVjdGlvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2lnbnMgb2Ygc3Vic3RhbnRpYWwgcmlzayBvZiBISVYgaW5mZWN0aW9uIEMuREUzNiI6CiAgZXhpc3RzICJTaWducyBvZiBzdWJzdGFudGlhbCByaXNrIG9mIEhJViBpbmZlY3Rpb24gQy5ERTM2IE9ic2VydmF0aW9uIgpkZWZpbmUgIlNpZ25zIG9mIHN1YnN0YW50aWFsIHJpc2sgb2YgSElWIGluZmVjdGlvbiBDLkRFMzYgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTaWducyBvZiBzdWJzdGFudGlhbCByaXNrIG9mIEhJViBpbmZlY3Rpb24gQy5ERTM2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU2lnbnMgb2Ygc3Vic3RhbnRpYWwgcmlzayBvZiBISVYgaW5mZWN0aW9uIEMuREUzNiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTM3IC0gTm8gY29uZG9tIHVzZSBkdXJpbmcgc2V4IHdpdGggbW9yZSB0aGFuIG9uZSBwYXJ0bmVyIGluIHRoZSBwYXN0IDYgbW9udGhzCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogUmVjZW50IHZhZ2luYWwgb3IgYW5hbCBzZXh1YWwgaW50ZXJjb3Vyc2Ugd2l0aG91dCBhIGNvbmRvbSB3aXRoIG1vcmUgdGhhbiBvbmUgcGFydG5lcgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTm8gY29uZG9tIHVzZSBkdXJpbmcgc2V4IHdpdGggbW9yZSB0aGFuIG9uZSBwYXJ0bmVyIGluIHRoZSBwYXN0IDYgbW9udGhzIEMuREUzNyI6CiAgZXhpc3RzICJObyBjb25kb20gdXNlIGR1cmluZyBzZXggd2l0aCBtb3JlIHRoYW4gb25lIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgQy5ERTM3IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTm8gY29uZG9tIHVzZSBkdXJpbmcgc2V4IHdpdGggbW9yZSB0aGFuIG9uZSBwYXJ0bmVyIGluIHRoZSBwYXN0IDYgbW9udGhzIEMuREUzNyBPYnNlcnZhdGlvbiIKZGVmaW5lICJObyBjb25kb20gdXNlIGR1cmluZyBzZXggd2l0aCBtb3JlIHRoYW4gb25lIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgQy5ERTM3IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk5vIGNvbmRvbSB1c2UgZHVyaW5nIHNleCB3aXRoIG1vcmUgdGhhbiBvbmUgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBDLkRFMzcgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJObyBjb25kb20gdXNlIGR1cmluZyBzZXggd2l0aCBtb3JlIHRoYW4gb25lIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgQy5ERTM3IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTm8gY29uZG9tIHVzZSBkdXJpbmcgc2V4IHdpdGggbW9yZSB0aGFuIG9uZSBwYXJ0bmVyIGluIHRoZSBwYXN0IDYgbW9udGhzIEMuREUzNyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5vIGNvbmRvbSB1c2UgZHVyaW5nIHNleCB3aXRoIG1vcmUgdGhhbiBvbmUgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBDLkRFMzcgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUzOCAtIFNUSSBpbiB0aGUgcGFzdCA2IG1vbnRocwpAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IEEgcmVjZW50IGhpc3RvcnkgKGluIHRoZSBsYXN0IDYgbW9udGhzKSBvZiBhIHNleHVhbGx5IHRyYW5zbWl0dGVkIGluZmVjdGlvbiAoU1RJICkgYnkgbGFib3JhdG9yeSB0ZXN0aW5nLCBzZWxmLXJlcG9ydCBvciBzeW5kcm9taWMgU1RJIHRyZWF0bWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU1RJIGluIHRoZSBwYXN0IDYgbW9udGhzIEMuREUzOCI6CiAgZXhpc3RzICJTVEkgaW4gdGhlIHBhc3QgNiBtb250aHMgQy5ERTM4IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU1RJIGluIHRoZSBwYXN0IDYgbW9udGhzIEMuREUzOCBPYnNlcnZhdGlvbiIKZGVmaW5lICJTVEkgaW4gdGhlIHBhc3QgNiBtb250aHMgQy5ERTM4IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNUSSBpbiB0aGUgcGFzdCA2IG1vbnRocyBDLkRFMzggQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTVEkgaW4gdGhlIHBhc3QgNiBtb250aHMgQy5ERTM4IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU1RJIGluIHRoZSBwYXN0IDYgbW9udGhzIEMuREUzOCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNUSSBpbiB0aGUgcGFzdCA2IG1vbnRocyBDLkRFMzggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUzOSAtIEEgc2V4dWFsIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgaGFkIG9uZSBvciBtb3JlIEhJViByaXNrIGZhY3RvcnMKQGFjdGl2aXR5OiBISVYuQzMgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBIHJlY2VudCBzZXggcGFydG5lciBvZiB0aGUgY2xpZW50IGhhZCBISVYgcmlzayBmYWN0b3JzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBIHNleHVhbCBwYXJ0bmVyIGluIHRoZSBwYXN0IDYgbW9udGhzIGhhZCBvbmUgb3IgbW9yZSBISVYgcmlzayBmYWN0b3JzIEMuREUzOSI6CiAgZXhpc3RzICJBIHNleHVhbCBwYXJ0bmVyIGluIHRoZSBwYXN0IDYgbW9udGhzIGhhZCBvbmUgb3IgbW9yZSBISVYgcmlzayBmYWN0b3JzIEMuREUzOSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkEgc2V4dWFsIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgaGFkIG9uZSBvciBtb3JlIEhJViByaXNrIGZhY3RvcnMgQy5ERTM5IE9ic2VydmF0aW9uIgpkZWZpbmUgIkEgc2V4dWFsIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgaGFkIG9uZSBvciBtb3JlIEhJViByaXNrIGZhY3RvcnMgQy5ERTM5IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkEgc2V4dWFsIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgaGFkIG9uZSBvciBtb3JlIEhJViByaXNrIGZhY3RvcnMgQy5ERTM5IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQSBzZXh1YWwgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBoYWQgb25lIG9yIG1vcmUgSElWIHJpc2sgZmFjdG9ycyBDLkRFMzkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBIHNleHVhbCBwYXJ0bmVyIGluIHRoZSBwYXN0IDYgbW9udGhzIGhhZCBvbmUgb3IgbW9yZSBISVYgcmlzayBmYWN0b3JzIEMuREUzOSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEEgc2V4dWFsIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgaGFkIG9uZSBvciBtb3JlIEhJViByaXNrIGZhY3RvcnMgQy5ERTM5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFNDAgLSBQckVQIHJlcXVlc3RlZCBieSBjbGllbnQKQGFjdGl2aXR5OiBISVYuQzMgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBDbGllbnQgaXMgcmVxdWVzdGluZyBQckVQLCByZWZsZWN0aW5nIGEgZGVjaXNpb24tbWFraW5nIHByb2Nlc3MgaGFzIGFscmVhZHkgdGFrZW4gcGxhY2UgYW5kIHN1Z2dlc3Rpbmcgb2Ygc3Vic3RhbnRpYWwgcmlzayBvZiBISVYKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlByRVAgcmVxdWVzdGVkIGJ5IGNsaWVudCBDLkRFNDAiOgogIGV4aXN0cyAiUHJFUCByZXF1ZXN0ZWQgYnkgY2xpZW50IEMuREU0MCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlByRVAgcmVxdWVzdGVkIGJ5IGNsaWVudCBDLkRFNDAgT2JzZXJ2YXRpb24iCmRlZmluZSAiUHJFUCByZXF1ZXN0ZWQgYnkgY2xpZW50IEMuREU0MCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQckVQIHJlcXVlc3RlZCBieSBjbGllbnQgQy5ERTQwIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUHJFUCByZXF1ZXN0ZWQgYnkgY2xpZW50IEMuREU0MCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlByRVAgcmVxdWVzdGVkIGJ5IGNsaWVudCBDLkRFNDAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQckVQIHJlcXVlc3RlZCBieSBjbGllbnQgQy5ERTQwICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFNDYgLSBBY3V0ZSBISVYgaW5mZWN0aW9uIHN5bXB0b21zCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogU3ltcHRvbXMgdGhhdCBjb3VsZCBzdWdnZXN0IGFuIGFjdXRlIEhJViBpbmZlY3Rpb24KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFjdXRlIEhJViBpbmZlY3Rpb24gc3ltcHRvbXMgQy5ERTQ2IjoKICBleGlzdHMgIkFjdXRlIEhJViBpbmZlY3Rpb24gc3ltcHRvbXMgQy5ERTQ2IE9ic2VydmF0aW9uIgpkZWZpbmUgIkFjdXRlIEhJViBpbmZlY3Rpb24gc3ltcHRvbXMgQy5ERTQ2IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQWN1dGUgSElWIGluZmVjdGlvbiBzeW1wdG9tcyBDLkRFNDYgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBY3V0ZSBISVYgaW5mZWN0aW9uIHN5bXB0b21zIEMuREU0NiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTQ3IC0gRmV2ZXIKQGFjdGl2aXR5OiBISVYuQzMgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGEgZmV2ZXIKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkZldmVyIjoKICBleGlzdHMgIkZldmVyIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRmV2ZXIgT2JzZXJ2YXRpb24iCmRlZmluZSAiRmV2ZXIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRmV2ZXIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJGZXZlciBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkZldmVyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRmV2ZXIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREU0OCAtIFNvcmUgdGhyb2F0CkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBhIHNvcmUgdGhyb2F0CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTb3JlIHRocm9hdCI6CiAgZXhpc3RzICJTb3JlIHRocm9hdCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlNvcmUgdGhyb2F0IE9ic2VydmF0aW9uIgpkZWZpbmUgIlNvcmUgdGhyb2F0IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNvcmUgdGhyb2F0IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU29yZSB0aHJvYXQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTb3JlIHRocm9hdCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNvcmUgdGhyb2F0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFNDkgLSBBY2hlcwpAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgYWNoZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFjaGVzIjoKICBleGlzdHMgIkFjaGVzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQWNoZXMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQWNoZXMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQWNoZXMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBY2hlcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFjaGVzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQWNoZXMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREU1MCAtIFBhaW5zCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBwYWlucwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUGFpbnMiOgogIGV4aXN0cyAiUGFpbnMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQYWlucyBPYnNlcnZhdGlvbiIKZGVmaW5lICJQYWlucyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQYWlucyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlBhaW5zIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUGFpbnMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQYWlucyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTUxIC0gU3dvbGxlbiBnbGFuZHMKQGFjdGl2aXR5OiBISVYuQzMgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIHN3b2xsZW4gZ2xhbmRzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTd29sbGVuIGdsYW5kcyI6CiAgZXhpc3RzICJTd29sbGVuIGdsYW5kcyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlN3b2xsZW4gZ2xhbmRzIE9ic2VydmF0aW9uIgpkZWZpbmUgIlN3b2xsZW4gZ2xhbmRzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlN3b2xsZW4gZ2xhbmRzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU3dvbGxlbiBnbGFuZHMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTd29sbGVuIGdsYW5kcyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFN3b2xsZW4gZ2xhbmRzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFNTIgLSBNb3V0aCBzb3JlcwpAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgYSBtb3V0aCBzb3JlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTW91dGggc29yZXMiOgogIGV4aXN0cyAiTW91dGggc29yZXMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJNb3V0aCBzb3JlcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJNb3V0aCBzb3JlcyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJNb3V0aCBzb3JlcyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk1vdXRoIHNvcmVzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTW91dGggc29yZXMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBNb3V0aCBzb3JlcyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTUzIC0gSGVhZGFjaGVzCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBhIGhlYWRhY2hlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSGVhZGFjaGVzIjoKICBleGlzdHMgIkhlYWRhY2hlcyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkhlYWRhY2hlcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJIZWFkYWNoZXMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSGVhZGFjaGVzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSGVhZGFjaGVzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSGVhZGFjaGVzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSGVhZGFjaGVzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFNTQgLSBSYXNoCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBhIHJhc2gKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlJhc2giOgogIGV4aXN0cyAiUmFzaCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlJhc2ggT2JzZXJ2YXRpb24iCmRlZmluZSAiUmFzaCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJSYXNoIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUmFzaCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlJhc2ggT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBSYXNoICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFNTUgLSBTZXggcGFydG5lcnMgSElWIHRyZWF0bWVudCBzdGF0dXMKQGFjdGl2aXR5OiBISVYuQzMgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUcmVhdG1lbnQgYWRoZXJlbmNlIG9mIGNsaWVudCdzIHNleCBwYXJ0bmVyIGZvciBwYXJ0bmVycyB0aGF0IGFyZSBISVYtcG9zaXRpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlNleCBwYXJ0bmVycyBISVYgdHJlYXRtZW50IHN0YXR1cyI6CiAgZXhpc3RzICJTZXggcGFydG5lcnMgSElWIHRyZWF0bWVudCBzdGF0dXMgT2JzZXJ2YXRpb24iCmRlZmluZSAiU2V4IHBhcnRuZXJzIEhJViB0cmVhdG1lbnQgc3RhdHVzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU2V4IHBhcnRuZXJzIEhJViB0cmVhdG1lbnQgc3RhdHVzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU2V4IHBhcnRuZXJzIEhJViB0cmVhdG1lbnQgc3RhdHVzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFNTYgLSBOb3Qgb24gQVJUCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogU2V4IHBhcnRuZXIgaXMgSElWLXBvc2l0aXZlIGFuZCBub3Qgb24gQVJUCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJOb3Qgb24gQVJUIjoKICBleGlzdHMgIk5vdCBvbiBBUlQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJOb3Qgb24gQVJUIE9ic2VydmF0aW9uIgpkZWZpbmUgIk5vdCBvbiBBUlQgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTm90IG9uIEFSVCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk5vdCBvbiBBUlQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJOb3Qgb24gQVJUIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTm90IG9uIEFSVCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTU3IC0gT24gQVJUIGxlc3MgdGhhbiA2IG1vbnRocwpAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFNleCBwYXJ0bmVyIGlzIEhJVi1wb3NpdGl2ZSBhbmQgaXMgb24gQVJUIGxlc3MgdGhhbiA2IG1vbnRocy4gQVJUIG1heSB0YWtlIHVwIHRvIDYgbW9udGhzIHRvIHN1cHByZXNzIHZpcmFsIGxvYWQuIEluIHN0dWRpZXMgb2Ygc2Vyb2Rpc2NvcmRhbnQgY291cGxlcywgcHJlLWV4cG9zdXJlIHByb3BoeWxheGlzIChQckVQKSBoYXMgcHJvdmlkZWQgYSB1c2VmdWwgYnJpZGdlIHRvIGZ1bGwgdmlyYWwgc3VwcHJlc3Npb24gYnkgdGhlIHBhcnRuZXIgZHVyaW5nIHRoYXQgdGltZS4KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk9uIEFSVCBsZXNzIHRoYW4gNiBtb250aHMiOgogIGV4aXN0cyAiT24gQVJUIGxlc3MgdGhhbiA2IG1vbnRocyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk9uIEFSVCBsZXNzIHRoYW4gNiBtb250aHMgT2JzZXJ2YXRpb24iCmRlZmluZSAiT24gQVJUIGxlc3MgdGhhbiA2IG1vbnRocyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJPbiBBUlQgbGVzcyB0aGFuIDYgbW9udGhzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiT24gQVJUIGxlc3MgdGhhbiA2IG1vbnRocyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk9uIEFSVCBsZXNzIHRoYW4gNiBtb250aHMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBPbiBBUlQgbGVzcyB0aGFuIDYgbW9udGhzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFNTggLSBQYXJ0bmVyIGhhcyBzdXNwZWN0ZWQgbG93IGFkaGVyZW5jZSB0byBBUlQKQGFjdGl2aXR5OiBISVYuQzMgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBTZXggcGFydG5lciBpcyBISVYtcG9zaXRpdmUgYW5kIGlzIHN1c3BlY3RlZCB0byBoYXZlIGxvdyBhZGhlcmVuY2UgdG8gQVJULiBUaGVyZSBoYXZlIGJlZW4gZ2FwcyBpbiB0aGUgcGFydG5lcidzIHRyZWF0bWVudCBhZGhlcmVuY2Ugb3IgdGhlIGNvdXBsZSBpcyBub3QgY29tbXVuaWNhdGluZyBvcGVubHkgYWJvdXQgdHJlYXRtZW50IGFkaGVyZW5jZSBhbmQgdmlyYWwgbG9hZCB0ZXN0IHJlc3VsdHMuCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQYXJ0bmVyIGhhcyBzdXNwZWN0ZWQgbG93IGFkaGVyZW5jZSB0byBBUlQiOgogIGV4aXN0cyAiUGFydG5lciBoYXMgc3VzcGVjdGVkIGxvdyBhZGhlcmVuY2UgdG8gQVJUIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUGFydG5lciBoYXMgc3VzcGVjdGVkIGxvdyBhZGhlcmVuY2UgdG8gQVJUIE9ic2VydmF0aW9uIgpkZWZpbmUgIlBhcnRuZXIgaGFzIHN1c3BlY3RlZCBsb3cgYWRoZXJlbmNlIHRvIEFSVCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQYXJ0bmVyIGhhcyBzdXNwZWN0ZWQgbG93IGFkaGVyZW5jZSB0byBBUlQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQYXJ0bmVyIGhhcyBzdXNwZWN0ZWQgbG93IGFkaGVyZW5jZSB0byBBUlQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQYXJ0bmVyIGhhcyBzdXNwZWN0ZWQgbG93IGFkaGVyZW5jZSB0byBBUlQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQYXJ0bmVyIGhhcyBzdXNwZWN0ZWQgbG93IGFkaGVyZW5jZSB0byBBUlQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREU1OSAtIFBhcnRuZXIgaXMgbm90IHZpcmFsbHkgc3VwcHJlc3NlZApAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFNleCBwYXJ0bmVyIGlzIEhJVi1wb3NpdGl2ZSBhbmQgbm90IHZpcmFsbHkgc3VwcHJlc3NlZAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUGFydG5lciBpcyBub3QgdmlyYWxseSBzdXBwcmVzc2VkIjoKICBleGlzdHMgIlBhcnRuZXIgaXMgbm90IHZpcmFsbHkgc3VwcHJlc3NlZCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlBhcnRuZXIgaXMgbm90IHZpcmFsbHkgc3VwcHJlc3NlZCBPYnNlcnZhdGlvbiIKZGVmaW5lICJQYXJ0bmVyIGlzIG5vdCB2aXJhbGx5IHN1cHByZXNzZWQgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUGFydG5lciBpcyBub3QgdmlyYWxseSBzdXBwcmVzc2VkIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUGFydG5lciBpcyBub3QgdmlyYWxseSBzdXBwcmVzc2VkIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUGFydG5lciBpcyBub3QgdmlyYWxseSBzdXBwcmVzc2VkIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUGFydG5lciBpcyBub3QgdmlyYWxseSBzdXBwcmVzc2VkICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFNjAgLSBQYXJ0bmVyIGlzIHZpcmFsbHkgc3VwcHJlc3NlZCBhbmQgaGFzIGJlZW4gb24gQVJUIGZvciA2IG1vbnRocyBvciBtb3JlCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogU2V4IHBhcnRuZXIgaXMgSElWLXBvc2l0aXZlIGFuZCB2aXJhbGx5IHN1cHByZXNzZWQgd2l0aCA2IG1vbnRocyBvciBtb3JlIG9uIEFSVAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUGFydG5lciBpcyB2aXJhbGx5IHN1cHByZXNzZWQgYW5kIGhhcyBiZWVuIG9uIEFSVCBmb3IgNiBtb250aHMgb3IgbW9yZSI6CiAgZXhpc3RzICJQYXJ0bmVyIGlzIHZpcmFsbHkgc3VwcHJlc3NlZCBhbmQgaGFzIGJlZW4gb24gQVJUIGZvciA2IG1vbnRocyBvciBtb3JlIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUGFydG5lciBpcyB2aXJhbGx5IHN1cHByZXNzZWQgYW5kIGhhcyBiZWVuIG9uIEFSVCBmb3IgNiBtb250aHMgb3IgbW9yZSBPYnNlcnZhdGlvbiIKZGVmaW5lICJQYXJ0bmVyIGlzIHZpcmFsbHkgc3VwcHJlc3NlZCBhbmQgaGFzIGJlZW4gb24gQVJUIGZvciA2IG1vbnRocyBvciBtb3JlIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlBhcnRuZXIgaXMgdmlyYWxseSBzdXBwcmVzc2VkIGFuZCBoYXMgYmVlbiBvbiBBUlQgZm9yIDYgbW9udGhzIG9yIG1vcmUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQYXJ0bmVyIGlzIHZpcmFsbHkgc3VwcHJlc3NlZCBhbmQgaGFzIGJlZW4gb24gQVJUIGZvciA2IG1vbnRocyBvciBtb3JlIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUGFydG5lciBpcyB2aXJhbGx5IHN1cHByZXNzZWQgYW5kIGhhcyBiZWVuIG9uIEFSVCBmb3IgNiBtb250aHMgb3IgbW9yZSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFBhcnRuZXIgaXMgdmlyYWxseSBzdXBwcmVzc2VkIGFuZCBoYXMgYmVlbiBvbiBBUlQgZm9yIDYgbW9udGhzIG9yIG1vcmUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREU2MSAtIFN1aXRhYmxlIGZvciBQckVQCkBhY3Rpdml0eTogSElWLkM4IFN1aXRhYmxlIGZvciBQckVQIG9yIFBFUD8KQGRlc2NyaXB0aW9uOiBUaGUgY2xpZW50IGlzIHN1aXRhYmxlIGZvciBQckVQCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTdWl0YWJsZSBmb3IgUHJFUCI6CiAgZXhpc3RzICJTdWl0YWJsZSBmb3IgUHJFUCBPYnNlcnZhdGlvbiIKZGVmaW5lICJTdWl0YWJsZSBmb3IgUHJFUCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlN1aXRhYmxlIGZvciBQckVQIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU3VpdGFibGUgZm9yIFByRVAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREU5MSAtIFByZWZlcnJlZCBQRVAgYmFja2JvbmUgcmVnaW1lbgpAYWN0aXZpdHk6IEhJVi5DMjMgUHJlc2NyaWJlIG9yIGFkbWluaXN0ZXIgUHJFUCBvciBQRVAKQGRlc2NyaXB0aW9uOiBQcmVmZXJyZWQgYmFja2JvbmUgcmVnaW1lbiBmb3IgUEVQCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQcmVmZXJyZWQgUEVQIGJhY2tib25lIHJlZ2ltZW4iOgogIGV4aXN0cyAiUHJlZmVycmVkIFBFUCBiYWNrYm9uZSByZWdpbWVuIE9ic2VydmF0aW9uIgpkZWZpbmUgIlByZWZlcnJlZCBQRVAgYmFja2JvbmUgcmVnaW1lbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlByZWZlcnJlZCBQRVAgYmFja2JvbmUgcmVnaW1lbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFByZWZlcnJlZCBQRVAgYmFja2JvbmUgcmVnaW1lbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTkyIC0gVERGICsgM1RDCkBhY3Rpdml0eTogSElWLkMyMyBQcmVzY3JpYmUgb3IgYWRtaW5pc3RlciBQckVQIG9yIFBFUApAZGVzY3JpcHRpb246IFByZWZlcnJlZCBiYWNrYm9uZSBjb250YWluaW5nIHRlbm9mb3ZpciBkaXNvcHJveGlsIGZ1bWFyYXRlIGFuZCBsYW1pdnVkaW5lCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUREYgKyAzVEMgQy5ERTkyIjoKICBleGlzdHMgIlRERiArIDNUQyBDLkRFOTIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJUREYgKyAzVEMgQy5ERTkyIE9ic2VydmF0aW9uIgpkZWZpbmUgIlRERiArIDNUQyBDLkRFOTIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVERGICsgM1RDIEMuREU5MiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlRERiArIDNUQyBDLkRFOTIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUREYgKyAzVEMgQy5ERTkyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVERGICsgM1RDIEMuREU5MiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTkzIC0gVERGICsgRlRDCkBhY3Rpdml0eTogSElWLkMyMyBQcmVzY3JpYmUgb3IgYWRtaW5pc3RlciBQckVQIG9yIFBFUApAZGVzY3JpcHRpb246IFByZWZlcnJlZCBiYWNrYm9uZSBjb250YWluaW5nIHRlbm9mb3ZpciBkaXNvcHJveGlsIGZ1bWFyYXRlIGFuZCBlbXRyaWNpdGFiaW5lCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUREYgKyBGVEMgQy5ERTkzIjoKICBleGlzdHMgIlRERiArIEZUQyBDLkRFOTMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJUREYgKyBGVEMgQy5ERTkzIE9ic2VydmF0aW9uIgpkZWZpbmUgIlRERiArIEZUQyBDLkRFOTMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVERGICsgRlRDIEMuREU5MyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlRERiArIEZUQyBDLkRFOTMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUREYgKyBGVEMgQy5ERTkzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVERGICsgRlRDIEMuREU5MyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTk0IC0gQVpUICsgM1RDCkBhY3Rpdml0eTogSElWLkMyMyBQcmVzY3JpYmUgb3IgYWRtaW5pc3RlciBQckVQIG9yIFBFUApAZGVzY3JpcHRpb246IFByZWZlcnJlZCBiYWNrYm9uZSBjb250YWluaW5nIHppZG92dWRpbmUgYW5kIGxhbWl2dWRpbmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFaVCArIDNUQyI6CiAgZXhpc3RzICJBWlQgKyAzVEMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBWlQgKyAzVEMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQVpUICsgM1RDIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFaVCArIDNUQyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFaVCArIDNUQyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFaVCArIDNUQyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFaVCArIDNUQyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTk1IC0gQWx0ZXJuYXRpdmUgUEVQIGJhY2tib25lIHJlZ2ltZW4KQGFjdGl2aXR5OiBISVYuQzMgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBbHRlcm5hdGl2ZSBiYWNrYm9uZSByZWdpbWVuIGZvciBQRVAKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFsdGVybmF0aXZlIFBFUCBiYWNrYm9uZSByZWdpbWVuIjoKICBleGlzdHMgIkFsdGVybmF0aXZlIFBFUCBiYWNrYm9uZSByZWdpbWVuIE9ic2VydmF0aW9uIgpkZWZpbmUgIkFsdGVybmF0aXZlIFBFUCBiYWNrYm9uZSByZWdpbWVuIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQWx0ZXJuYXRpdmUgUEVQIGJhY2tib25lIHJlZ2ltZW4gT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBbHRlcm5hdGl2ZSBQRVAgYmFja2JvbmUgcmVnaW1lbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTk2IC0gQUJDICsgM1RDCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQWx0ZXJuYXRpdmUgYmFja2JvbmUgY29udGFpbmluZyBhYmFjYXZpciBhbmQgbGFtaXZ1ZGluZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQUJDICsgM1RDIjoKICBleGlzdHMgIkFCQyArIDNUQyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFCQyArIDNUQyBPYnNlcnZhdGlvbiIKZGVmaW5lICJBQkMgKyAzVEMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQUJDICsgM1RDIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQUJDICsgM1RDIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQUJDICsgM1RDIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQUJDICsgM1RDICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFOTcgLSBUREYgKyAzVEMKQGFjdGl2aXR5OiBISVYuQzMgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBbHRlcm5hdGl2ZSBiYWNrYm9uZSBjb250YWluaW5nIHRlbm9mb3ZpciBkaXNvcHJveGlsIGZ1bWFyYXRlIGFuZCBsYW1pdnVkaW5lCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUREYgKyAzVEMgQy5ERTk3IjoKICBleGlzdHMgIlRERiArIDNUQyBDLkRFOTcgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJUREYgKyAzVEMgQy5ERTk3IE9ic2VydmF0aW9uIgpkZWZpbmUgIlRERiArIDNUQyBDLkRFOTcgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVERGICsgM1RDIEMuREU5NyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlRERiArIDNUQyBDLkRFOTcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUREYgKyAzVEMgQy5ERTk3IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVERGICsgM1RDIEMuREU5NyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTk4IC0gVERGICsgRlRDCkBhY3Rpdml0eTogSElWLkMzIENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQWx0ZXJuYXRpdmUgYmFja2JvbmUgY29udGFpbmluZyB0ZW5vZm92aXIgZGlzb3Byb3hpbCBmdW1hcmF0ZSBhbmQgZW10cmljaXRhYmluZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVERGICsgRlRDIEMuREU5OCI6CiAgZXhpc3RzICJUREYgKyBGVEMgQy5ERTk4IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVERGICsgRlRDIEMuREU5OCBPYnNlcnZhdGlvbiIKZGVmaW5lICJUREYgKyBGVEMgQy5ERTk4IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlRERiArIEZUQyBDLkRFOTggQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJUREYgKyBGVEMgQy5ERTk4IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVERGICsgRlRDIEMuREU5OCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFRERiArIEZUQyBDLkRFOTggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREU5OSAtIFByZWZlcnJlZCB0aGlyZCBQRVAgZHJ1ZwpAYWN0aXZpdHk6IEhJVi5DMjMgUHJlc2NyaWJlIG9yIGFkbWluaXN0ZXIgUHJFUCBvciBQRVAKQGRlc2NyaXB0aW9uOiBQcmVmZXJyZWQgdGhpcmQgZHJ1ZyBmb3IgUEVQCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQcmVmZXJyZWQgdGhpcmQgUEVQIGRydWciOgogIGV4aXN0cyAiUHJlZmVycmVkIHRoaXJkIFBFUCBkcnVnIE9ic2VydmF0aW9uIgpkZWZpbmUgIlByZWZlcnJlZCB0aGlyZCBQRVAgZHJ1ZyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlByZWZlcnJlZCB0aGlyZCBQRVAgZHJ1ZyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFByZWZlcnJlZCB0aGlyZCBQRVAgZHJ1ZyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTEwMCAtIERURwpAYWN0aXZpdHk6IEhJVi5DMjMgUHJlc2NyaWJlIG9yIGFkbWluaXN0ZXIgUHJFUCBvciBQRVAKQGRlc2NyaXB0aW9uOiBQcmVmZXJyZWQgdGhpcmQgZHJ1ZyBvZiBkb2x1dGVncmF2aXIKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkRURyBDLkRFMTAwIjoKICBleGlzdHMgIkRURyBDLkRFMTAwIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRFRHIEMuREUxMDAgT2JzZXJ2YXRpb24iCmRlZmluZSAiRFRHIEMuREUxMDAgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRFRHIEMuREUxMDAgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEVEcgQy5ERTEwMCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkRURyBDLkRFMTAwIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRFRHIEMuREUxMDAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxMDEgLSBBbHRlcm5hdGl2ZSB0aGlyZCBQRVAgZHJ1ZwpAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IEFsdGVybmF0aXZlIHRoaXJkIGRydWcgZm9yIFBFUAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQWx0ZXJuYXRpdmUgdGhpcmQgUEVQIGRydWciOgogIGV4aXN0cyAiQWx0ZXJuYXRpdmUgdGhpcmQgUEVQIGRydWcgT2JzZXJ2YXRpb24iCmRlZmluZSAiQWx0ZXJuYXRpdmUgdGhpcmQgUEVQIGRydWcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBbHRlcm5hdGl2ZSB0aGlyZCBQRVAgZHJ1ZyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFsdGVybmF0aXZlIHRoaXJkIFBFUCBkcnVnICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTAyIC0gQVRWL3IKQGFjdGl2aXR5OiBISVYuQzMgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBbHRlcm5hdGl2ZSB0aGlyZCBkcnVnIG9mIGF0YXphbmF2aXIvcml0b25hdmlyIChBVFYvcikKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFUVi9yIEMuREUxMDIiOgogIGV4aXN0cyAiQVRWL3IgQy5ERTEwMiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFUVi9yIEMuREUxMDIgT2JzZXJ2YXRpb24iCmRlZmluZSAiQVRWL3IgQy5ERTEwMiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBVFYvciBDLkRFMTAyIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQVRWL3IgQy5ERTEwMiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFUVi9yIEMuREUxMDIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBVFYvciBDLkRFMTAyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTAzIC0gRFJWL3IKQGFjdGl2aXR5OiBISVYuQzMgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBbHRlcm5hdGl2ZSB0aGlyZCBkcnVnIG9mIGRhcnVuYXZpci9yaXRvbmF2aXIgKERSVi9yKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRFJWL3IgQy5ERTEwMyI6CiAgZXhpc3RzICJEUlYvciBDLkRFMTAzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRFJWL3IgQy5ERTEwMyBPYnNlcnZhdGlvbiIKZGVmaW5lICJEUlYvciBDLkRFMTAzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkRSVi9yIEMuREUxMDMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEUlYvciBDLkRFMTAzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRFJWL3IgQy5ERTEwMyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIERSVi9yIEMuREUxMDMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxMDQgLSBMUFYvcgpAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IEFsdGVybmF0aXZlIHRoaXJkIGRydWcgb2YgbG9waW5hdmlyL3JpdG9uYXZpciAoTFBWL3IpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJMUFYvciBDLkRFMTA0IjoKICBleGlzdHMgIkxQVi9yIEMuREUxMDQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJMUFYvciBDLkRFMTA0IE9ic2VydmF0aW9uIgpkZWZpbmUgIkxQVi9yIEMuREUxMDQgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTFBWL3IgQy5ERTEwNCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkxQVi9yIEMuREUxMDQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJMUFYvciBDLkRFMTA0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTFBWL3IgQy5ERTEwNCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTEwNSAtIFJBTApAYWN0aXZpdHk6IEhJVi5DMyBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IEFsdGVybmF0aXZlIHRoaXJkIGRydWcgb2YgcmFsdGVncmF2aXIgKFJBTCkKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlJBTCBDLkRFMTA1IjoKICBleGlzdHMgIlJBTCBDLkRFMTA1IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUkFMIEMuREUxMDUgT2JzZXJ2YXRpb24iCmRlZmluZSAiUkFMIEMuREUxMDUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUkFMIEMuREUxMDUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSQUwgQy5ERTEwNSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlJBTCBDLkRFMTA1IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUkFMIEMuREUxMDUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxMDYgLSBFc3RpbWF0ZWQgY3JlYXRpbmluZSBjbGVhcmFuY2UKQGFjdGl2aXR5OiBISVYuQzIzIFByZXNjcmliZSBvciBhZG1pbmlzdGVyIFByRVAgb3IgUEVQCkBkZXNjcmlwdGlvbjogRXN0aW1hdGVkIGNyZWF0aW5pbmUgY2xlYXJhbmNlIG9mIHRoZSBjbGllbnQgcmV0dXJuZWQgZnJvbSBsYWIgaW4gbUwvbWluCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJFc3RpbWF0ZWQgY3JlYXRpbmluZSBjbGVhcmFuY2UiOgogIEVsZW1lbnRzLiJFc3RpbWF0ZWQgY3JlYXRpbmluZSBjbGVhcmFuY2UiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRXN0aW1hdGVkIGNyZWF0aW5pbmUgY2xlYXJhbmNlIFZhbHVlIjoKICAiRXN0aW1hdGVkIGNyZWF0aW5pbmUgY2xlYXJhbmNlIiBPCiAgcmV0dXJuIE8udmFsdWUKLyogRW5kIG9mIEVzdGltYXRlZCBjcmVhdGluaW5lIGNsZWFyYW5jZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTExMiAtIENvbnRyYWluZGljYXRpb25zIHRvIFByRVAgdXNhZ2UKQGFjdGl2aXR5OiBISVYuQzIzIFByZXNjcmliZSBvciBhZG1pbmlzdGVyIFByRVAgb3IgUEVQCkBkZXNjcmlwdGlvbjogTGlzdGluZyBvZiBjb250cmFpbmRpY2F0aW9ucyB0byBwcmUtZXhwb3N1cmUgcHJvcGh5bGF4aXMgKFByRVApCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDb250cmFpbmRpY2F0aW9ucyB0byBQckVQIHVzYWdlIjoKICBleGlzdHMgIkNvbnRyYWluZGljYXRpb25zIHRvIFByRVAgdXNhZ2UgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ29udHJhaW5kaWNhdGlvbnMgdG8gUHJFUCB1c2FnZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNvbnRyYWluZGljYXRpb25zIHRvIFByRVAgdXNhZ2UgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDb250cmFpbmRpY2F0aW9ucyB0byBQckVQIHVzYWdlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTEzIC0gVGVub2ZvdmlyIGRpc29wcm94aWwgZnVtYXJhdGUgVERGIGFsbGVyZ3kgb3IgY29udHJhaW5kaWNhdGlvbgpAYWN0aXZpdHk6IEhJVi5DMjMgUHJlc2NyaWJlIG9yIGFkbWluaXN0ZXIgUHJFUCBvciBQRVAKQGRlc2NyaXB0aW9uOiBBbGxlcmd5IHRvIHByZS1leHBvc3VyZSBwcm9waHlsYXhpcyAoUHJFUCkgdGVub2ZvdmlyIGRpc29wcm94aWwgZnVtYXJhdGUgKFRERikKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRlbm9mb3ZpciBkaXNvcHJveGlsIGZ1bWFyYXRlIFRERiBhbGxlcmd5IG9yIGNvbnRyYWluZGljYXRpb24iOgogIGV4aXN0cyAiVGVub2ZvdmlyIGRpc29wcm94aWwgZnVtYXJhdGUgVERGIGFsbGVyZ3kgb3IgY29udHJhaW5kaWNhdGlvbiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlRlbm9mb3ZpciBkaXNvcHJveGlsIGZ1bWFyYXRlIFRERiBhbGxlcmd5IG9yIGNvbnRyYWluZGljYXRpb24gT2JzZXJ2YXRpb24iCmRlZmluZSAiVGVub2ZvdmlyIGRpc29wcm94aWwgZnVtYXJhdGUgVERGIGFsbGVyZ3kgb3IgY29udHJhaW5kaWNhdGlvbiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJUZW5vZm92aXIgZGlzb3Byb3hpbCBmdW1hcmF0ZSBUREYgYWxsZXJneSBvciBjb250cmFpbmRpY2F0aW9uIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVGVub2ZvdmlyIGRpc29wcm94aWwgZnVtYXJhdGUgVERGIGFsbGVyZ3kgb3IgY29udHJhaW5kaWNhdGlvbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlRlbm9mb3ZpciBkaXNvcHJveGlsIGZ1bWFyYXRlIFRERiBhbGxlcmd5IG9yIGNvbnRyYWluZGljYXRpb24gT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUZW5vZm92aXIgZGlzb3Byb3hpbCBmdW1hcmF0ZSBUREYgYWxsZXJneSBvciBjb250cmFpbmRpY2F0aW9uICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTE0IC0gSElWLXBvc2l0aXZlCkBhY3Rpdml0eTogSElWLkMyMyBQcmVzY3JpYmUgb3IgYWRtaW5pc3RlciBQckVQIG9yIFBFUApAZGVzY3JpcHRpb246IENsaWVudCBpcyBISVYtcG9zaXRpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhJVi1wb3NpdGl2ZSBDLkRFMTE0IjoKICBleGlzdHMgIkhJVi1wb3NpdGl2ZSBDLkRFMTE0IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSElWLXBvc2l0aXZlIEMuREUxMTQgT2JzZXJ2YXRpb24iCmRlZmluZSAiSElWLXBvc2l0aXZlIEMuREUxMTQgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSElWLXBvc2l0aXZlIEMuREUxMTQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJISVYtcG9zaXRpdmUgQy5ERTExNCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJVi1wb3NpdGl2ZSBDLkRFMTE0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSElWLXBvc2l0aXZlIEMuREUxMTQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxMTUgLSBMb3cgZXN0aW1hdGVkIGNyZWF0aW5pbmUgY2xlYXJhbmNlCkBhY3Rpdml0eTogSElWLkMyMyBQcmVzY3JpYmUgb3IgYWRtaW5pc3RlciBQckVQIG9yIFBFUApAZGVzY3JpcHRpb246IEVzdGltYXRlZCBjcmVhdGluaW5lIGNsZWFyYW5jZSBvZiBsZXNzIHRoYW4gNjAgbWwvbWluIChpZiBrbm93bikKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkxvdyBlc3RpbWF0ZWQgY3JlYXRpbmluZSBjbGVhcmFuY2UiOgogIGV4aXN0cyAiTG93IGVzdGltYXRlZCBjcmVhdGluaW5lIGNsZWFyYW5jZSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkxvdyBlc3RpbWF0ZWQgY3JlYXRpbmluZSBjbGVhcmFuY2UgT2JzZXJ2YXRpb24iCmRlZmluZSAiTG93IGVzdGltYXRlZCBjcmVhdGluaW5lIGNsZWFyYW5jZSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJMb3cgZXN0aW1hdGVkIGNyZWF0aW5pbmUgY2xlYXJhbmNlIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTG93IGVzdGltYXRlZCBjcmVhdGluaW5lIGNsZWFyYW5jZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkxvdyBlc3RpbWF0ZWQgY3JlYXRpbmluZSBjbGVhcmFuY2UgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBMb3cgZXN0aW1hdGVkIGNyZWF0aW5pbmUgY2xlYXJhbmNlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTE2IC0gQWN1dGUgSElWIGluZmVjdGlvbiBzeW1wdG9tcwpAYWN0aXZpdHk6IEhJVi5DMjMgUHJlc2NyaWJlIG9yIGFkbWluaXN0ZXIgUHJFUCBvciBQRVAKQGRlc2NyaXB0aW9uOiBTeW1wdG9tcyB0aGF0IGNvdWxkIHN1Z2dlc3QgYW4gYWN1dGUgSElWIGluZmVjdGlvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQWN1dGUgSElWIGluZmVjdGlvbiBzeW1wdG9tcyBDLkRFMTE2IjoKICBleGlzdHMgIkFjdXRlIEhJViBpbmZlY3Rpb24gc3ltcHRvbXMgQy5ERTExNiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFjdXRlIEhJViBpbmZlY3Rpb24gc3ltcHRvbXMgQy5ERTExNiBPYnNlcnZhdGlvbiIKZGVmaW5lICJBY3V0ZSBISVYgaW5mZWN0aW9uIHN5bXB0b21zIEMuREUxMTYgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQWN1dGUgSElWIGluZmVjdGlvbiBzeW1wdG9tcyBDLkRFMTE2IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQWN1dGUgSElWIGluZmVjdGlvbiBzeW1wdG9tcyBDLkRFMTE2IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQWN1dGUgSElWIGluZmVjdGlvbiBzeW1wdG9tcyBDLkRFMTE2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQWN1dGUgSElWIGluZmVjdGlvbiBzeW1wdG9tcyBDLkRFMTE2ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTE3IC0gUHJvYmFibGUgcmVjZW50IGV4cG9zdXJlIHRvIEhJVgpAYWN0aXZpdHk6IEhJVi5DMjMgUHJlc2NyaWJlIG9yIGFkbWluaXN0ZXIgUHJFUCBvciBQRVAKQGRlc2NyaXB0aW9uOiBXaGVuIHRoZSBjbGllbnQgaXMgcmVwb3J0ZWQgdG8gaGF2ZSBoYWQgcHJvYmFibGUgcmVjZW50IGV4cG9zdXJlIHRvIEhJVgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUHJvYmFibGUgcmVjZW50IGV4cG9zdXJlIHRvIEhJViI6CiAgZXhpc3RzICJQcm9iYWJsZSByZWNlbnQgZXhwb3N1cmUgdG8gSElWIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUHJvYmFibGUgcmVjZW50IGV4cG9zdXJlIHRvIEhJViBPYnNlcnZhdGlvbiIKZGVmaW5lICJQcm9iYWJsZSByZWNlbnQgZXhwb3N1cmUgdG8gSElWIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlByb2JhYmxlIHJlY2VudCBleHBvc3VyZSB0byBISVYgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQcm9iYWJsZSByZWNlbnQgZXhwb3N1cmUgdG8gSElWIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUHJvYmFibGUgcmVjZW50IGV4cG9zdXJlIHRvIEhJViBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFByb2JhYmxlIHJlY2VudCBleHBvc3VyZSB0byBISVYgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxMTggLSBPdGhlciBhbGxlcmd5IG9yIGNvbnRyYWluZGljYXRpb24gdG8gYSBtZWRpY2luZSBpbiB0aGUgUHJFUCByZWdpbWVuCkBhY3Rpdml0eTogSElWLkMyMyBQcmVzY3JpYmUgb3IgYWRtaW5pc3RlciBQckVQIG9yIFBFUApAZGVzY3JpcHRpb246IENsaWVudCBoYXMgYW5vdGhlciBhbGxlcmd5IG9yIGNvbnRyYWluZGljYXRpb24gdG8gYSBtZWRpY2luZSBpbiB0aGUgcHJlLWV4cG9zdXJlIHByb3BoeWxheGlzIChQckVQKSByZWdpbWVuCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJPdGhlciBhbGxlcmd5IG9yIGNvbnRyYWluZGljYXRpb24gdG8gYSBtZWRpY2luZSBpbiB0aGUgUHJFUCByZWdpbWVuIjoKICBleGlzdHMgIk90aGVyIGFsbGVyZ3kgb3IgY29udHJhaW5kaWNhdGlvbiB0byBhIG1lZGljaW5lIGluIHRoZSBQckVQIHJlZ2ltZW4gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJPdGhlciBhbGxlcmd5IG9yIGNvbnRyYWluZGljYXRpb24gdG8gYSBtZWRpY2luZSBpbiB0aGUgUHJFUCByZWdpbWVuIE9ic2VydmF0aW9uIgpkZWZpbmUgIk90aGVyIGFsbGVyZ3kgb3IgY29udHJhaW5kaWNhdGlvbiB0byBhIG1lZGljaW5lIGluIHRoZSBQckVQIHJlZ2ltZW4gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iT3RoZXIgYWxsZXJneSBvciBjb250cmFpbmRpY2F0aW9uIHRvIGEgbWVkaWNpbmUgaW4gdGhlIFByRVAgcmVnaW1lbiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk90aGVyIGFsbGVyZ3kgb3IgY29udHJhaW5kaWNhdGlvbiB0byBhIG1lZGljaW5lIGluIHRoZSBQckVQIHJlZ2ltZW4gT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJPdGhlciBhbGxlcmd5IG9yIGNvbnRyYWluZGljYXRpb24gdG8gYSBtZWRpY2luZSBpbiB0aGUgUHJFUCByZWdpbWVuIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT3RoZXIgYWxsZXJneSBvciBjb250cmFpbmRpY2F0aW9uIHRvIGEgbWVkaWNpbmUgaW4gdGhlIFByRVAgcmVnaW1lbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTEyMyAtIEFkaGVyZW5jZSBjb3Vuc2VsbGluZyBwcm92aWRlZApAYWN0aXZpdHk6IEhJVi5DMjMgUHJlc2NyaWJlIG9yIGFkbWluaXN0ZXIgUHJFUCBvciBQRVAKQGRlc2NyaXB0aW9uOiBXaGV0aGVyIGFkaGVyZW5jZSBjb3Vuc2VsbGluZyB3YXMgcHJvdmlkZWQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFkaGVyZW5jZSBjb3Vuc2VsbGluZyBwcm92aWRlZCBDLkRFMTIzIjoKICBleGlzdHMgIkFkaGVyZW5jZSBjb3Vuc2VsbGluZyBwcm92aWRlZCBDLkRFMTIzIE9ic2VydmF0aW9uIgpkZWZpbmUgIkFkaGVyZW5jZSBjb3Vuc2VsbGluZyBwcm92aWRlZCBDLkRFMTIzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQWRoZXJlbmNlIGNvdW5zZWxsaW5nIHByb3ZpZGVkIEMuREUxMjMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBZGhlcmVuY2UgY291bnNlbGxpbmcgcHJvdmlkZWQgQy5ERTEyMyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTEyNCAtIERhdGUvdGltZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQKQGFjdGl2aXR5OiBISVYuQzI0IFNjaGVkdWxlIGZvbGxvdy11cApAZGVzY3JpcHRpb246IERhdGUgdGhlIGNsaWVudCBpcyB0byByZXR1cm4gZm9yIG1vbml0b3JpbmcsIHJlLXN1cHBseSwgb3IgYW55IG90aGVyIHJlYXNvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRGF0ZS90aW1lIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudCBDLkRFMTI0IjoKICBFbGVtZW50cy4iRGF0ZS90aW1lIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudCBDLkRFMTI0IiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkRhdGUvdGltZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgQy5ERTEyNCBWYWx1ZSI6CiAgIkRhdGUvdGltZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgQy5ERTEyNCIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBEYXRlL3RpbWUgb2YgZm9sbG93LXVwIGFwcG9pbnRtZW50IEMuREUxMjQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxMjUgLSBUeXBlIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudApAYWN0aXZpdHk6IEhJVi5DMjQgU2NoZWR1bGUgZm9sbG93LXVwCkBkZXNjcmlwdGlvbjogVHlwZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgZm9yIHRlc3Rpbmcgc2VydmljZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlR5cGUgb2YgZm9sbG93LXVwIGFwcG9pbnRtZW50IEMuREUxMjUiOgogIGV4aXN0cyAiVHlwZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgQy5ERTEyNSBPYnNlcnZhdGlvbiIKZGVmaW5lICJUeXBlIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudCBDLkRFMTI1IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVHlwZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgQy5ERTEyNSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFR5cGUgb2YgZm9sbG93LXVwIGFwcG9pbnRtZW50IEMuREUxMjUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxMjYgLSBSZXRlc3RpbmcgZm9yIEhJVgpAYWN0aXZpdHk6IEhJVi5DMjQgU2NoZWR1bGUgZm9sbG93LXVwCkBkZXNjcmlwdGlvbjogUmV0ZXN0aW5nIGZvbGxvdy11cCBhcHBvaW50bWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmV0ZXN0aW5nIGZvciBISVYgQy5ERTEyNiI6CiAgZXhpc3RzICJSZXRlc3RpbmcgZm9yIEhJViBDLkRFMTI2IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmV0ZXN0aW5nIGZvciBISVYgQy5ERTEyNiBPYnNlcnZhdGlvbiIKZGVmaW5lICJSZXRlc3RpbmcgZm9yIEhJViBDLkRFMTI2IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJldGVzdGluZyBmb3IgSElWIEMuREUxMjYgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSZXRlc3RpbmcgZm9yIEhJViBDLkRFMTI2IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmV0ZXN0aW5nIGZvciBISVYgQy5ERTEyNiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJldGVzdGluZyBmb3IgSElWIEMuREUxMjYgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxMjcgLSBGb2xsb3ctdXAgYXBwb2ludG1lbnQgZm9yIFByRVAKQGFjdGl2aXR5OiBISVYuQzI0IFNjaGVkdWxlIGZvbGxvdy11cApAZGVzY3JpcHRpb246IFJldGVzdGluZyBmb2xsb3ctdXAgYXBwb2ludG1lbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkZvbGxvdy11cCBhcHBvaW50bWVudCBmb3IgUHJFUCI6CiAgZXhpc3RzICJGb2xsb3ctdXAgYXBwb2ludG1lbnQgZm9yIFByRVAgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJGb2xsb3ctdXAgYXBwb2ludG1lbnQgZm9yIFByRVAgT2JzZXJ2YXRpb24iCmRlZmluZSAiRm9sbG93LXVwIGFwcG9pbnRtZW50IGZvciBQckVQIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkZvbGxvdy11cCBhcHBvaW50bWVudCBmb3IgUHJFUCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkZvbGxvdy11cCBhcHBvaW50bWVudCBmb3IgUHJFUCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkZvbGxvdy11cCBhcHBvaW50bWVudCBmb3IgUHJFUCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEZvbGxvdy11cCBhcHBvaW50bWVudCBmb3IgUHJFUCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTEyOCAtIE90aGVyCkBhY3Rpdml0eTogSElWLkMyNCBTY2hlZHVsZSBmb2xsb3ctdXAKQGRlc2NyaXB0aW9uOiBPdGhlciByZWFzb24gZm9yIHRoZSBmb2xsb3ctdXAgYXBwb2ludG1lbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk90aGVyIEMuREUxMjgiOgogIGV4aXN0cyAiT3RoZXIgQy5ERTEyOCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk90aGVyIEMuREUxMjggT2JzZXJ2YXRpb24iCmRlZmluZSAiT3RoZXIgQy5ERTEyOCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJPdGhlciBDLkRFMTI4IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiT3RoZXIgQy5ERTEyOCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk90aGVyIEMuREUxMjggT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBPdGhlciBDLkRFMTI4ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTMxIC0gUHJldmVudGlvbiBzZXJ2aWNlcyBvZmZlcmVkIGFuZCByZWZlcnJhbHMKQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIHRvIHByZXZlbnRpb24gc2VydmljZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlByZXZlbnRpb24gc2VydmljZXMgb2ZmZXJlZCBhbmQgcmVmZXJyYWxzIEMuREUxMzEiOgogIGV4aXN0cyAiUHJldmVudGlvbiBzZXJ2aWNlcyBvZmZlcmVkIGFuZCByZWZlcnJhbHMgQy5ERTEzMSBPYnNlcnZhdGlvbiIKZGVmaW5lICJQcmV2ZW50aW9uIHNlcnZpY2VzIG9mZmVyZWQgYW5kIHJlZmVycmFscyBDLkRFMTMxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUHJldmVudGlvbiBzZXJ2aWNlcyBvZmZlcmVkIGFuZCByZWZlcnJhbHMgQy5ERTEzMSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFByZXZlbnRpb24gc2VydmljZXMgb2ZmZXJlZCBhbmQgcmVmZXJyYWxzIEMuREUxMzEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxMzIgLSBNYWxlIGFuZCBmZW1hbGUgY29uZG9tcyBhbmQgY29uZG9tLWNvbXBhdGlibGUgbHVicmljYW50cyBvZmZlcmVkCkBhY3Rpdml0eTogSElWLkMxMCBDb3Vuc2VsIG9uIHJpc2sgYW5kIHByZXZlbnRpb24KQGRlc2NyaXB0aW9uOiBPZmZlciBtYWxlIGFuZCBmZW1hbGUgY29uZG9tcyBhbmQgY29uZG9tLWNvbXBhdGlibGUgbHVicmljYW50cwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTWFsZSBhbmQgZmVtYWxlIGNvbmRvbXMgYW5kIGNvbmRvbS1jb21wYXRpYmxlIGx1YnJpY2FudHMgb2ZmZXJlZCI6CiAgZXhpc3RzICJNYWxlIGFuZCBmZW1hbGUgY29uZG9tcyBhbmQgY29uZG9tLWNvbXBhdGlibGUgbHVicmljYW50cyBvZmZlcmVkIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTWFsZSBhbmQgZmVtYWxlIGNvbmRvbXMgYW5kIGNvbmRvbS1jb21wYXRpYmxlIGx1YnJpY2FudHMgb2ZmZXJlZCBPYnNlcnZhdGlvbiIKZGVmaW5lICJNYWxlIGFuZCBmZW1hbGUgY29uZG9tcyBhbmQgY29uZG9tLWNvbXBhdGlibGUgbHVicmljYW50cyBvZmZlcmVkIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk1hbGUgYW5kIGZlbWFsZSBjb25kb21zIGFuZCBjb25kb20tY29tcGF0aWJsZSBsdWJyaWNhbnRzIG9mZmVyZWQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJNYWxlIGFuZCBmZW1hbGUgY29uZG9tcyBhbmQgY29uZG9tLWNvbXBhdGlibGUgbHVicmljYW50cyBvZmZlcmVkIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTWFsZSBhbmQgZmVtYWxlIGNvbmRvbXMgYW5kIGNvbmRvbS1jb21wYXRpYmxlIGx1YnJpY2FudHMgb2ZmZXJlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE1hbGUgYW5kIGZlbWFsZSBjb25kb21zIGFuZCBjb25kb20tY29tcGF0aWJsZSBsdWJyaWNhbnRzIG9mZmVyZWQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxMzMgLSBWb2x1bnRhcnkgbWVkaWNhbCBtYWxlIGNpcmN1bWNpc2lvbiBWTU1DIHJlZmVycmFsCkBhY3Rpdml0eTogSElWLkMxMCBDb3Vuc2VsIG9uIHJpc2sgYW5kIHByZXZlbnRpb24KQGRlc2NyaXB0aW9uOiBPZmZlciByZWZlcnJhbCBmb3IgVk1NQyBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVm9sdW50YXJ5IG1lZGljYWwgbWFsZSBjaXJjdW1jaXNpb24gVk1NQyByZWZlcnJhbCI6CiAgZXhpc3RzICJWb2x1bnRhcnkgbWVkaWNhbCBtYWxlIGNpcmN1bWNpc2lvbiBWTU1DIHJlZmVycmFsIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVm9sdW50YXJ5IG1lZGljYWwgbWFsZSBjaXJjdW1jaXNpb24gVk1NQyByZWZlcnJhbCBPYnNlcnZhdGlvbiIKZGVmaW5lICJWb2x1bnRhcnkgbWVkaWNhbCBtYWxlIGNpcmN1bWNpc2lvbiBWTU1DIHJlZmVycmFsIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlZvbHVudGFyeSBtZWRpY2FsIG1hbGUgY2lyY3VtY2lzaW9uIFZNTUMgcmVmZXJyYWwgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJWb2x1bnRhcnkgbWVkaWNhbCBtYWxlIGNpcmN1bWNpc2lvbiBWTU1DIHJlZmVycmFsIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVm9sdW50YXJ5IG1lZGljYWwgbWFsZSBjaXJjdW1jaXNpb24gVk1NQyByZWZlcnJhbCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFZvbHVudGFyeSBtZWRpY2FsIG1hbGUgY2lyY3VtY2lzaW9uIFZNTUMgcmVmZXJyYWwgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxMzQgLSBIYXJtIHJlZHVjdGlvbiBmb3IgcGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MKQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIHRvIGhhcm0gcmVkdWN0aW9uIGZvciBwZW9wbGUgd2hvIGluamVjdCBkcnVncyAobmVlZGxlIGFuZCBzeXJpbmdlIHByb2dyYW1tZXMsIG9waW9pZCBzdWJzdGl0dXRpb24gdGhlcmFweSwgb3RoZXIgZHJ1Zy1kZXBlbmRlbmNlIHRyZWF0bWVudCBhbmQgb3Bpb2lkIG92ZXJkb3NlIHByZXZlbnRpb24gYW5kIG1hbmFnZW1lbnQpIHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJIYXJtIHJlZHVjdGlvbiBmb3IgcGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MgQy5ERTEzNCI6CiAgZXhpc3RzICJIYXJtIHJlZHVjdGlvbiBmb3IgcGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MgQy5ERTEzNCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkhhcm0gcmVkdWN0aW9uIGZvciBwZW9wbGUgd2hvIGluamVjdCBkcnVncyBDLkRFMTM0IE9ic2VydmF0aW9uIgpkZWZpbmUgIkhhcm0gcmVkdWN0aW9uIGZvciBwZW9wbGUgd2hvIGluamVjdCBkcnVncyBDLkRFMTM0IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhhcm0gcmVkdWN0aW9uIGZvciBwZW9wbGUgd2hvIGluamVjdCBkcnVncyBDLkRFMTM0IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSGFybSByZWR1Y3Rpb24gZm9yIHBlb3BsZSB3aG8gaW5qZWN0IGRydWdzIEMuREUxMzQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJIYXJtIHJlZHVjdGlvbiBmb3IgcGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MgQy5ERTEzNCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhhcm0gcmVkdWN0aW9uIGZvciBwZW9wbGUgd2hvIGluamVjdCBkcnVncyBDLkRFMTM0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTM1IC0gQmVoYXZpb3VyYWwgaW50ZXJ2ZW50aW9ucyB0byBzdXBwb3J0IHJpc2sgcmVkdWN0aW9uCkBhY3Rpdml0eTogSElWLkMxMCBDb3Vuc2VsIG9uIHJpc2sgYW5kIHByZXZlbnRpb24KQGRlc2NyaXB0aW9uOiBPZmZlciBvciByZWZlciB0byBzZXJ2aWNlcyBmb3IgYmVoYXZpb3VyYWwgaW50ZXJ2ZW50aW9ucyB0byBzdXBwb3J0IHJpc2sgcmVkdWN0aW9uLCBwYXJ0aWN1bGFybHkgZm9yIHBlb3BsZSB3aXRoIEhJViBhbmQgbWVtYmVycyBvZiBrZXkgcG9wdWxhdGlvbnMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkJlaGF2aW91cmFsIGludGVydmVudGlvbnMgdG8gc3VwcG9ydCByaXNrIHJlZHVjdGlvbiBDLkRFMTM1IjoKICBleGlzdHMgIkJlaGF2aW91cmFsIGludGVydmVudGlvbnMgdG8gc3VwcG9ydCByaXNrIHJlZHVjdGlvbiBDLkRFMTM1IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQmVoYXZpb3VyYWwgaW50ZXJ2ZW50aW9ucyB0byBzdXBwb3J0IHJpc2sgcmVkdWN0aW9uIEMuREUxMzUgT2JzZXJ2YXRpb24iCmRlZmluZSAiQmVoYXZpb3VyYWwgaW50ZXJ2ZW50aW9ucyB0byBzdXBwb3J0IHJpc2sgcmVkdWN0aW9uIEMuREUxMzUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQmVoYXZpb3VyYWwgaW50ZXJ2ZW50aW9ucyB0byBzdXBwb3J0IHJpc2sgcmVkdWN0aW9uIEMuREUxMzUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJCZWhhdmlvdXJhbCBpbnRlcnZlbnRpb25zIHRvIHN1cHBvcnQgcmlzayByZWR1Y3Rpb24gQy5ERTEzNSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkJlaGF2aW91cmFsIGludGVydmVudGlvbnMgdG8gc3VwcG9ydCByaXNrIHJlZHVjdGlvbiBDLkRFMTM1IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQmVoYXZpb3VyYWwgaW50ZXJ2ZW50aW9ucyB0byBzdXBwb3J0IHJpc2sgcmVkdWN0aW9uIEMuREUxMzUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxNDkgLSBTZXh1YWwgYW5kIHJlcHJvZHVjdGl2ZSBoZWFsdGggaW50ZWdyYXRlZCBzZXJ2aWNlcwpAYWN0aXZpdHk6IEhJVi5DMTAgQ291bnNlbCBvbiByaXNrIGFuZCBwcmV2ZW50aW9uCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgdG8gc2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTZXh1YWwgYW5kIHJlcHJvZHVjdGl2ZSBoZWFsdGggaW50ZWdyYXRlZCBzZXJ2aWNlcyBDLkRFMTQ5IjoKICBleGlzdHMgIlNleHVhbCBhbmQgcmVwcm9kdWN0aXZlIGhlYWx0aCBpbnRlZ3JhdGVkIHNlcnZpY2VzIEMuREUxNDkgT2JzZXJ2YXRpb24iCmRlZmluZSAiU2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIGludGVncmF0ZWQgc2VydmljZXMgQy5ERTE0OSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNleHVhbCBhbmQgcmVwcm9kdWN0aXZlIGhlYWx0aCBpbnRlZ3JhdGVkIHNlcnZpY2VzIEMuREUxNDkgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTZXh1YWwgYW5kIHJlcHJvZHVjdGl2ZSBoZWFsdGggaW50ZWdyYXRlZCBzZXJ2aWNlcyBDLkRFMTQ5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTUwIC0gQ29udHJhY2VwdGlvbiBhbmQgZmFtaWx5IHBsYW5uaW5nCkBhY3Rpdml0eTogSElWLkMxMCBDb3Vuc2VsIG9uIHJpc2sgYW5kIHByZXZlbnRpb24KQGRlc2NyaXB0aW9uOiBPZmZlciBjb250cmFjZXB0aW9uIGFuZCBmYW1pbHkgcGxhbm5pbmcgc2VydmljZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNvbnRyYWNlcHRpb24gYW5kIGZhbWlseSBwbGFubmluZyBDLkRFMTUwIjoKICBleGlzdHMgIkNvbnRyYWNlcHRpb24gYW5kIGZhbWlseSBwbGFubmluZyBDLkRFMTUwIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ29udHJhY2VwdGlvbiBhbmQgZmFtaWx5IHBsYW5uaW5nIEMuREUxNTAgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ29udHJhY2VwdGlvbiBhbmQgZmFtaWx5IHBsYW5uaW5nIEMuREUxNTAgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ29udHJhY2VwdGlvbiBhbmQgZmFtaWx5IHBsYW5uaW5nIEMuREUxNTAgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDb250cmFjZXB0aW9uIGFuZCBmYW1pbHkgcGxhbm5pbmcgQy5ERTE1MCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNvbnRyYWNlcHRpb24gYW5kIGZhbWlseSBwbGFubmluZyBDLkRFMTUwIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ29udHJhY2VwdGlvbiBhbmQgZmFtaWx5IHBsYW5uaW5nIEMuREUxNTAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxNTEgLSBDaGVjayBwcmVnbmFuY3kgc3RhdHVzCkBhY3Rpdml0eTogSElWLkMxMCBDb3Vuc2VsIG9uIHJpc2sgYW5kIHByZXZlbnRpb24KQGRlc2NyaXB0aW9uOiBDaGVjayB3b21hbidzIHByZWduYW5jeSBzdGF0dXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNoZWNrIHByZWduYW5jeSBzdGF0dXMgQy5ERTE1MSI6CiAgZXhpc3RzICJDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEMuREUxNTEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEMuREUxNTEgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ2hlY2sgcHJlZ25hbmN5IHN0YXR1cyBDLkRFMTUxIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNoZWNrIHByZWduYW5jeSBzdGF0dXMgQy5ERTE1MSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNoZWNrIHByZWduYW5jeSBzdGF0dXMgQy5ERTE1MSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNoZWNrIHByZWduYW5jeSBzdGF0dXMgQy5ERTE1MSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENoZWNrIHByZWduYW5jeSBzdGF0dXMgQy5ERTE1MSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTE1MiAtIFByZXZlbnQgbW90aGVyLXRvLWNoaWxkIHRyYW5zbWlzc2lvbgpAYWN0aXZpdHk6IEhJVi5DMTAgQ291bnNlbCBvbiByaXNrIGFuZCBwcmV2ZW50aW9uCkBkZXNjcmlwdGlvbjogT2ZmZXIgc2VydmljZXMgKGNvdW5zZWxsaW5nKSB0byBoZWxwIHByZXZlbnQgb2YgbW90aGVyLXRvLWNoaWxkIHRyYW5zbWlzc2lvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUHJldmVudCBtb3RoZXItdG8tY2hpbGQgdHJhbnNtaXNzaW9uIjoKICBleGlzdHMgIlByZXZlbnQgbW90aGVyLXRvLWNoaWxkIHRyYW5zbWlzc2lvbiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlByZXZlbnQgbW90aGVyLXRvLWNoaWxkIHRyYW5zbWlzc2lvbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJQcmV2ZW50IG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUHJldmVudCBtb3RoZXItdG8tY2hpbGQgdHJhbnNtaXNzaW9uIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUHJldmVudCBtb3RoZXItdG8tY2hpbGQgdHJhbnNtaXNzaW9uIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUHJldmVudCBtb3RoZXItdG8tY2hpbGQgdHJhbnNtaXNzaW9uIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUHJldmVudCBtb3RoZXItdG8tY2hpbGQgdHJhbnNtaXNzaW9uICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTUzIC0gQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBhbmQgdHJlYXRtZW50CkBhY3Rpdml0eTogSElWLkMxMCBDb3Vuc2VsIG9uIHJpc2sgYW5kIHByZXZlbnRpb24KQGRlc2NyaXB0aW9uOiBPZmZlciBjZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIGFuZCB0cmVhdG1lbnQgc2VydmljZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgYW5kIHRyZWF0bWVudCI6CiAgZXhpc3RzICJDZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIGFuZCB0cmVhdG1lbnQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIGFuZCB0cmVhdG1lbnQgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBhbmQgdHJlYXRtZW50IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgYW5kIHRyZWF0bWVudCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgYW5kIHRyZWF0bWVudCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgYW5kIHRyZWF0bWVudCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgYW5kIHRyZWF0bWVudCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTE1NCAtIEFuYWwgY2FuY2VyIHNjcmVlbmluZyBmb3IgbWVuIHdobyBoYXZlIHNleCB3aXRoIG1lbgpAYWN0aXZpdHk6IEhJVi5DMTAgQ291bnNlbCBvbiByaXNrIGFuZCBwcmV2ZW50aW9uCkBkZXNjcmlwdGlvbjogT2ZmZXIgYW5hbCBjYW5jZXIgc2NyZWVuaW5nIChmb3IgbWVuIHdobyBoYXZlIHNleCB3aXRoIG1lbikgc2VydmljZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFuYWwgY2FuY2VyIHNjcmVlbmluZyBmb3IgbWVuIHdobyBoYXZlIHNleCB3aXRoIG1lbiBDLkRFMTU0IjoKICBleGlzdHMgIkFuYWwgY2FuY2VyIHNjcmVlbmluZyBmb3IgbWVuIHdobyBoYXZlIHNleCB3aXRoIG1lbiBDLkRFMTU0IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQW5hbCBjYW5jZXIgc2NyZWVuaW5nIGZvciBtZW4gd2hvIGhhdmUgc2V4IHdpdGggbWVuIEMuREUxNTQgT2JzZXJ2YXRpb24iCmRlZmluZSAiQW5hbCBjYW5jZXIgc2NyZWVuaW5nIGZvciBtZW4gd2hvIGhhdmUgc2V4IHdpdGggbWVuIEMuREUxNTQgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQW5hbCBjYW5jZXIgc2NyZWVuaW5nIGZvciBtZW4gd2hvIGhhdmUgc2V4IHdpdGggbWVuIEMuREUxNTQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBbmFsIGNhbmNlciBzY3JlZW5pbmcgZm9yIG1lbiB3aG8gaGF2ZSBzZXggd2l0aCBtZW4gQy5ERTE1NCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFuYWwgY2FuY2VyIHNjcmVlbmluZyBmb3IgbWVuIHdobyBoYXZlIHNleCB3aXRoIG1lbiBDLkRFMTU0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQW5hbCBjYW5jZXIgc2NyZWVuaW5nIGZvciBtZW4gd2hvIGhhdmUgc2V4IHdpdGggbWVuIEMuREUxNTQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxNTUgLSBTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50CkBhY3Rpdml0eTogSElWLkMxMCBDb3Vuc2VsIG9uIHJpc2sgYW5kIHByZXZlbnRpb24KQGRlc2NyaXB0aW9uOiBPZmZlciBTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IEMuREUxNTUiOgogIGV4aXN0cyAiU1RJIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBDLkRFMTU1IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU1RJIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBDLkRFMTU1IE9ic2VydmF0aW9uIgpkZWZpbmUgIlNUSSB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQgQy5ERTE1NSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IEMuREUxNTUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IEMuREUxNTUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IEMuREUxNTUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IEMuREUxNTUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxNTYgLSBISVYgdGVzdGluZyBmb3IgcGFydG5lcnMgYW5kIGJpb2xvZ2ljYWwgY2hpbGRyZW4KQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IE9mZmVyIHRlc3RpbmcgZm9yIGFsbCBwYXJ0bmVycyBhbmQgYmlvbG9naWNhbCBjaGlsZHJlbiBvZiBwb3NpdGl2ZSBjYXNlcyAoaW5jbHVkZXMgcGFydG5lciBzZXJ2aWNlcyBhbmQgaW5kZXggY2FzZSB0ZXN0aW5nKSwgYXMgd2VsbCBhcyBwYXJ0bmVycyBhbmQgc29jaWFsIGNvbnRhY3RzIG9mIHBlb3BsZSBmcm9tIGtleSBwb3B1bGF0aW9ucywgd2hlcmUgYXBwcm9wcmlhdGUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhJViB0ZXN0aW5nIGZvciBwYXJ0bmVycyBhbmQgYmlvbG9naWNhbCBjaGlsZHJlbiBDLkRFMTU2IjoKICBleGlzdHMgIkhJViB0ZXN0aW5nIGZvciBwYXJ0bmVycyBhbmQgYmlvbG9naWNhbCBjaGlsZHJlbiBDLkRFMTU2IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSElWIHRlc3RpbmcgZm9yIHBhcnRuZXJzIGFuZCBiaW9sb2dpY2FsIGNoaWxkcmVuIEMuREUxNTYgT2JzZXJ2YXRpb24iCmRlZmluZSAiSElWIHRlc3RpbmcgZm9yIHBhcnRuZXJzIGFuZCBiaW9sb2dpY2FsIGNoaWxkcmVuIEMuREUxNTYgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSElWIHRlc3RpbmcgZm9yIHBhcnRuZXJzIGFuZCBiaW9sb2dpY2FsIGNoaWxkcmVuIEMuREUxNTYgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJISVYgdGVzdGluZyBmb3IgcGFydG5lcnMgYW5kIGJpb2xvZ2ljYWwgY2hpbGRyZW4gQy5ERTE1NiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJViB0ZXN0aW5nIGZvciBwYXJ0bmVycyBhbmQgYmlvbG9naWNhbCBjaGlsZHJlbiBDLkRFMTU2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSElWIHRlc3RpbmcgZm9yIHBhcnRuZXJzIGFuZCBiaW9sb2dpY2FsIGNoaWxkcmVuIEMuREUxNTYgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxNTcgLSBPZmZlciBvdGhlciBjbGluaWNhbCBzZXJ2aWNlcwpAYWN0aXZpdHk6IEhJVi5DMTAgQ291bnNlbCBvbiByaXNrIGFuZCBwcmV2ZW50aW9uCkBkZXNjcmlwdGlvbjogT3RoZXIgY2xpbmljYWwgc2VydmljZXMgb2ZmZXJlZCBvciByZWZlcnJhbHMgZ2l2ZW4gdG8gdGhlIGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiT2ZmZXIgb3RoZXIgY2xpbmljYWwgc2VydmljZXMgQy5ERTE1NyI6CiAgZXhpc3RzICJPZmZlciBvdGhlciBjbGluaWNhbCBzZXJ2aWNlcyBDLkRFMTU3IE9ic2VydmF0aW9uIgpkZWZpbmUgIk9mZmVyIG90aGVyIGNsaW5pY2FsIHNlcnZpY2VzIEMuREUxNTcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJPZmZlciBvdGhlciBjbGluaWNhbCBzZXJ2aWNlcyBDLkRFMTU3IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT2ZmZXIgb3RoZXIgY2xpbmljYWwgc2VydmljZXMgQy5ERTE1NyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTE1OCAtIEFzc2Vzc21lbnQgYW5kIHByb3Zpc2lvbiBvZiB2YWNjaW5hdGlvbnMKQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IEFzc2Vzc21lbnQgYW5kIHByb3Zpc2lvbiBvZiB2YWNjaW5hdGlvbnMsIHN1Y2ggYXMgZm9yIHBlb3BsZSBmcm9tIGtleSBwb3B1bGF0aW9ucywgcHJlZ25hbnQgd29tZW4gYW5kIGluZmFudHM7IGFuZCwgd2hlcmUgYXBwcm9wcmlhdGUsIHRldGFudXMgdmFjY2luYXRpb24gZm9yIGFkb2xlc2NlbnQgYm95cyBhbmQgbWVuIHJlY2VpdmluZyBWTU1DCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBc3Nlc3NtZW50IGFuZCBwcm92aXNpb24gb2YgdmFjY2luYXRpb25zIEMuREUxNTgiOgogIGV4aXN0cyAiQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBDLkRFMTU4IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBDLkRFMTU4IE9ic2VydmF0aW9uIgpkZWZpbmUgIkFzc2Vzc21lbnQgYW5kIHByb3Zpc2lvbiBvZiB2YWNjaW5hdGlvbnMgQy5ERTE1OCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBc3Nlc3NtZW50IGFuZCBwcm92aXNpb24gb2YgdmFjY2luYXRpb25zIEMuREUxNTggQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBc3Nlc3NtZW50IGFuZCBwcm92aXNpb24gb2YgdmFjY2luYXRpb25zIEMuREUxNTggT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBc3Nlc3NtZW50IGFuZCBwcm92aXNpb24gb2YgdmFjY2luYXRpb25zIEMuREUxNTggT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBc3Nlc3NtZW50IGFuZCBwcm92aXNpb24gb2YgdmFjY2luYXRpb25zIEMuREUxNTggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxNTkgLSBIZXBhdGl0aXMgQiB2aXJ1cyBIQlYgYW5kIGhlcGF0aXRpcyBDIHZpcnVzIEhDViB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQKQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBIQlYgdGVzdGluZyBhbmQgdmFjY2luYXRpb24gYW5kIEhDViB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhlcGF0aXRpcyBCIHZpcnVzIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCI6CiAgZXhpc3RzICJIZXBhdGl0aXMgQiB2aXJ1cyBIQlYgYW5kIGhlcGF0aXRpcyBDIHZpcnVzIEhDViB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJIZXBhdGl0aXMgQiB2aXJ1cyBIQlYgYW5kIGhlcGF0aXRpcyBDIHZpcnVzIEhDViB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQgT2JzZXJ2YXRpb24iCmRlZmluZSAiSGVwYXRpdGlzIEIgdmlydXMgSEJWIGFuZCBoZXBhdGl0aXMgQyB2aXJ1cyBIQ1YgdGVzdGluZyBhbmQgdHJlYXRtZW50IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhlcGF0aXRpcyBCIHZpcnVzIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkhlcGF0aXRpcyBCIHZpcnVzIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhlcGF0aXRpcyBCIHZpcnVzIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhlcGF0aXRpcyBCIHZpcnVzIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTE2MCAtIENvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBwbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEKQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBjby10cmltb3hhem9sZSBjaGVtb3Byb3BoeWxheGlzIHRvIHByZXZlbnQgcG5ldW1vY3lzdGlzIGNhcmluaWkgcG5ldW1vbmlhCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDby10cmltb3hhem9sZSBjaGVtb3Byb3BoeWxheGlzIHRvIHByZXZlbnQgcG5ldW1vY3lzdGlzIGNhcmluaWkgcG5ldW1vbmlhIEMuREUxNjAiOgogIGV4aXN0cyAiQ28tdHJpbW94YXpvbGUgY2hlbW9wcm9waHlsYXhpcyB0byBwcmV2ZW50IHBuZXVtb2N5c3RpcyBjYXJpbmlpIHBuZXVtb25pYSBDLkRFMTYwIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ28tdHJpbW94YXpvbGUgY2hlbW9wcm9waHlsYXhpcyB0byBwcmV2ZW50IHBuZXVtb2N5c3RpcyBjYXJpbmlpIHBuZXVtb25pYSBDLkRFMTYwIE9ic2VydmF0aW9uIgpkZWZpbmUgIkNvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBwbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEgQy5ERTE2MCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJDby10cmltb3hhem9sZSBjaGVtb3Byb3BoeWxheGlzIHRvIHByZXZlbnQgcG5ldW1vY3lzdGlzIGNhcmluaWkgcG5ldW1vbmlhIEMuREUxNjAgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDby10cmltb3hhem9sZSBjaGVtb3Byb3BoeWxheGlzIHRvIHByZXZlbnQgcG5ldW1vY3lzdGlzIGNhcmluaWkgcG5ldW1vbmlhIEMuREUxNjAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDby10cmltb3hhem9sZSBjaGVtb3Byb3BoeWxheGlzIHRvIHByZXZlbnQgcG5ldW1vY3lzdGlzIGNhcmluaWkgcG5ldW1vbmlhIEMuREUxNjAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDby10cmltb3hhem9sZSBjaGVtb3Byb3BoeWxheGlzIHRvIHByZXZlbnQgcG5ldW1vY3lzdGlzIGNhcmluaWkgcG5ldW1vbmlhIEMuREUxNjAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxNjEgLSBJbnRlbnNpZmllZCBUQiBjYXNlIGZpbmRpbmcgYW5kIGxpbmthZ2UgdG8gVEIgdHJlYXRtZW50CkBhY3Rpdml0eTogSElWLkMxMCBDb3Vuc2VsIG9uIHJpc2sgYW5kIHByZXZlbnRpb24KQGRlc2NyaXB0aW9uOiBPZmZlciBvciByZWZlciBmb3IgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW50ZW5zaWZpZWQgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudCBDLkRFMTYxIjoKICBleGlzdHMgIkludGVuc2lmaWVkIFRCIGNhc2UgZmluZGluZyBhbmQgbGlua2FnZSB0byBUQiB0cmVhdG1lbnQgQy5ERTE2MSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkludGVuc2lmaWVkIFRCIGNhc2UgZmluZGluZyBhbmQgbGlua2FnZSB0byBUQiB0cmVhdG1lbnQgQy5ERTE2MSBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbnRlbnNpZmllZCBUQiBjYXNlIGZpbmRpbmcgYW5kIGxpbmthZ2UgdG8gVEIgdHJlYXRtZW50IEMuREUxNjEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW50ZW5zaWZpZWQgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudCBDLkRFMTYxIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSW50ZW5zaWZpZWQgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudCBDLkRFMTYxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW50ZW5zaWZpZWQgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudCBDLkRFMTYxIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW50ZW5zaWZpZWQgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudCBDLkRFMTYxICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTYyIC0gUHJvdmlzaW9uIG9mIGlzb25pYXppZCBwcmV2ZW50aXZlIHRoZXJhcHkgaWYgcGVyc29uIGRvZXMgbm90IGhhdmUgVEIKQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBwcm92aXNpb24gb2YgaXNvbmlhemlkIHByZXZlbnRpdmUgdGhlcmFweSBpZiBwZXJzb24gZG9lcyBub3QgaGF2ZSBUQgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUHJvdmlzaW9uIG9mIGlzb25pYXppZCBwcmV2ZW50aXZlIHRoZXJhcHkgaWYgcGVyc29uIGRvZXMgbm90IGhhdmUgVEIgQy5ERTE2MiI6CiAgZXhpc3RzICJQcm92aXNpb24gb2YgaXNvbmlhemlkIHByZXZlbnRpdmUgdGhlcmFweSBpZiBwZXJzb24gZG9lcyBub3QgaGF2ZSBUQiBDLkRFMTYyIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUHJvdmlzaW9uIG9mIGlzb25pYXppZCBwcmV2ZW50aXZlIHRoZXJhcHkgaWYgcGVyc29uIGRvZXMgbm90IGhhdmUgVEIgQy5ERTE2MiBPYnNlcnZhdGlvbiIKZGVmaW5lICJQcm92aXNpb24gb2YgaXNvbmlhemlkIHByZXZlbnRpdmUgdGhlcmFweSBpZiBwZXJzb24gZG9lcyBub3QgaGF2ZSBUQiBDLkRFMTYyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlByb3Zpc2lvbiBvZiBpc29uaWF6aWQgcHJldmVudGl2ZSB0aGVyYXB5IGlmIHBlcnNvbiBkb2VzIG5vdCBoYXZlIFRCIEMuREUxNjIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQcm92aXNpb24gb2YgaXNvbmlhemlkIHByZXZlbnRpdmUgdGhlcmFweSBpZiBwZXJzb24gZG9lcyBub3QgaGF2ZSBUQiBDLkRFMTYyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUHJvdmlzaW9uIG9mIGlzb25pYXppZCBwcmV2ZW50aXZlIHRoZXJhcHkgaWYgcGVyc29uIGRvZXMgbm90IGhhdmUgVEIgQy5ERTE2MiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFByb3Zpc2lvbiBvZiBpc29uaWF6aWQgcHJldmVudGl2ZSB0aGVyYXB5IGlmIHBlcnNvbiBkb2VzIG5vdCBoYXZlIFRCIEMuREUxNjIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxNjMgLSBNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kKQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBtYWxhcmlhIHByZXZlbnRpb24gKHN1Y2ggYXMgYmVkIG5ldHMgYW5kIHByb3BoeWxheGlzKSwgZGVwZW5kaW5nIG9uIGVwaWRlbWlvbG9neQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTWFsYXJpYSBwcmV2ZW50aW9uIHN1Y2ggYXMgYmVkIG5ldHMgYW5kIHByb3BoeWxheGlzLCBkZXBlbmRpbmcgb24gZXBpZGVtaW9sb2d5IEMuREUxNjMiOgogIGV4aXN0cyAiTWFsYXJpYSBwcmV2ZW50aW9uIHN1Y2ggYXMgYmVkIG5ldHMgYW5kIHByb3BoeWxheGlzLCBkZXBlbmRpbmcgb24gZXBpZGVtaW9sb2d5IEMuREUxNjMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kgQy5ERTE2MyBPYnNlcnZhdGlvbiIKZGVmaW5lICJNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kgQy5ERTE2MyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kgQy5ERTE2MyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk1hbGFyaWEgcHJldmVudGlvbiBzdWNoIGFzIGJlZCBuZXRzIGFuZCBwcm9waHlsYXhpcywgZGVwZW5kaW5nIG9uIGVwaWRlbWlvbG9neSBDLkRFMTYzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTWFsYXJpYSBwcmV2ZW50aW9uIHN1Y2ggYXMgYmVkIG5ldHMgYW5kIHByb3BoeWxheGlzLCBkZXBlbmRpbmcgb24gZXBpZGVtaW9sb2d5IEMuREUxNjMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kgQy5ERTE2MyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTE2NCAtIE90aGVyIHN1cHBvcnQgc2VydmljZXMKQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBvdGhlciBzdXBwb3J0IHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJPdGhlciBzdXBwb3J0IHNlcnZpY2VzIEMuREUxNjQiOgogIGV4aXN0cyAiT3RoZXIgc3VwcG9ydCBzZXJ2aWNlcyBDLkRFMTY0IE9ic2VydmF0aW9uIgpkZWZpbmUgIk90aGVyIHN1cHBvcnQgc2VydmljZXMgQy5ERTE2NCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk90aGVyIHN1cHBvcnQgc2VydmljZXMgQy5ERTE2NCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE90aGVyIHN1cHBvcnQgc2VydmljZXMgQy5ERTE2NCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTE2NSAtIE1lbnRhbCBoZWFsdGggc2VydmljZXMKQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBtZW50YWwgaGVhbHRoIHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJNZW50YWwgaGVhbHRoIHNlcnZpY2VzIEMuREUxNjUiOgogIGV4aXN0cyAiTWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBDLkRFMTY1IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBDLkRFMTY1IE9ic2VydmF0aW9uIgpkZWZpbmUgIk1lbnRhbCBoZWFsdGggc2VydmljZXMgQy5ERTE2NSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJNZW50YWwgaGVhbHRoIHNlcnZpY2VzIEMuREUxNjUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJNZW50YWwgaGVhbHRoIHNlcnZpY2VzIEMuREUxNjUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJNZW50YWwgaGVhbHRoIHNlcnZpY2VzIEMuREUxNjUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBNZW50YWwgaGVhbHRoIHNlcnZpY2VzIEMuREUxNjUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxNjYgLSBQc3ljaG9zb2NpYWwgY291bnNlbGxpbmcsIHN1cHBvcnQgYW5kIHRyZWF0bWVudCBhZGhlcmVuY2UgY291bnNlbGxpbmcKQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBwc3ljaG9zb2NpYWwgY291bnNlbGxpbmcsIHN1cHBvcnQgYW5kIHRyZWF0bWVudCBhZGhlcmVuY2UgY291bnNlbGxpbmcKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBzeWNob3NvY2lhbCBjb3Vuc2VsbGluZywgc3VwcG9ydCBhbmQgdHJlYXRtZW50IGFkaGVyZW5jZSBjb3Vuc2VsbGluZyBDLkRFMTY2IjoKICBleGlzdHMgIlBzeWNob3NvY2lhbCBjb3Vuc2VsbGluZywgc3VwcG9ydCBhbmQgdHJlYXRtZW50IGFkaGVyZW5jZSBjb3Vuc2VsbGluZyBDLkRFMTY2IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIEMuREUxNjYgT2JzZXJ2YXRpb24iCmRlZmluZSAiUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIEMuREUxNjYgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIEMuREUxNjYgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQc3ljaG9zb2NpYWwgY291bnNlbGxpbmcsIHN1cHBvcnQgYW5kIHRyZWF0bWVudCBhZGhlcmVuY2UgY291bnNlbGxpbmcgQy5ERTE2NiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBzeWNob3NvY2lhbCBjb3Vuc2VsbGluZywgc3VwcG9ydCBhbmQgdHJlYXRtZW50IGFkaGVyZW5jZSBjb3Vuc2VsbGluZyBDLkRFMTY2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIEMuREUxNjYgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkMuREUxNjcgLSBTdXBwb3J0IGZvciBkaXNjbG9zdXJlIGFuZCBwYXJ0bmVyIHNlcnZpY2VzCkBhY3Rpdml0eTogSElWLkMxMCBDb3Vuc2VsIG9uIHJpc2sgYW5kIHByZXZlbnRpb24KQGRlc2NyaXB0aW9uOiBPZmZlciBvciByZWZlciBmb3Igc3VwcG9ydCBmb3IgZGlzY2xvc3VyZSBhbmQgcGFydG5lciBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU3VwcG9ydCBmb3IgZGlzY2xvc3VyZSBhbmQgcGFydG5lciBzZXJ2aWNlcyBDLkRFMTY3IjoKICBleGlzdHMgIlN1cHBvcnQgZm9yIGRpc2Nsb3N1cmUgYW5kIHBhcnRuZXIgc2VydmljZXMgQy5ERTE2NyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlN1cHBvcnQgZm9yIGRpc2Nsb3N1cmUgYW5kIHBhcnRuZXIgc2VydmljZXMgQy5ERTE2NyBPYnNlcnZhdGlvbiIKZGVmaW5lICJTdXBwb3J0IGZvciBkaXNjbG9zdXJlIGFuZCBwYXJ0bmVyIHNlcnZpY2VzIEMuREUxNjcgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iU3VwcG9ydCBmb3IgZGlzY2xvc3VyZSBhbmQgcGFydG5lciBzZXJ2aWNlcyBDLkRFMTY3IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU3VwcG9ydCBmb3IgZGlzY2xvc3VyZSBhbmQgcGFydG5lciBzZXJ2aWNlcyBDLkRFMTY3IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU3VwcG9ydCBmb3IgZGlzY2xvc3VyZSBhbmQgcGFydG5lciBzZXJ2aWNlcyBDLkRFMTY3IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU3VwcG9ydCBmb3IgZGlzY2xvc3VyZSBhbmQgcGFydG5lciBzZXJ2aWNlcyBDLkRFMTY3ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5DLkRFMTY4IC0gTGVnYWwgYW5kIHNvY2lhbCBzZXJ2aWNlcwpAYWN0aXZpdHk6IEhJVi5DMTAgQ291bnNlbCBvbiByaXNrIGFuZCBwcmV2ZW50aW9uCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgZm9yIGxlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkxlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMgQy5ERTE2OCI6CiAgZXhpc3RzICJMZWdhbCBhbmQgc29jaWFsIHNlcnZpY2VzIEMuREUxNjggQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJMZWdhbCBhbmQgc29jaWFsIHNlcnZpY2VzIEMuREUxNjggT2JzZXJ2YXRpb24iCmRlZmluZSAiTGVnYWwgYW5kIHNvY2lhbCBzZXJ2aWNlcyBDLkRFMTY4IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkxlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMgQy5ERTE2OCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkxlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMgQy5ERTE2OCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkxlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMgQy5ERTE2OCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIExlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMgQy5ERTE2OCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQy5ERTE2OSAtIFNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4KQGFjdGl2aXR5OiBISVYuQzEwIENvdW5zZWwgb24gcmlzayBhbmQgcHJldmVudGlvbgpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBzZXJ2aWNlcyBmb3IgcmVzcG9uZGluZyB0byB2aW9sZW5jZSBhZ2FpbnN0IHdvbWVuLCBpbmNsdWRpbmcgZmlyc3QtbGluZSBzdXBwb3J0IGFuZCBwc3ljaG9zb2NpYWwgc3VwcG9ydCwgcG9zdC1yYXBlIGNhcmUgYW5kIG90aGVyIHN1cHBvcnQgc2VydmljZXMgaW5jbHVkaW5nIHNoZWx0ZXJzLCBsZWdhbCBzZXJ2aWNlcyBhbmQgd29tZW4gYW5kIGNoaWxkIHByb3RlY3Rpb24gc2VydmljZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gQy5ERTE2OSI6CiAgZXhpc3RzICJTZXJ2aWNlcyBmb3IgcmVzcG9uZGluZyB0byB2aW9sZW5jZSBhZ2FpbnN0IHdvbWVuIEMuREUxNjkgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJTZXJ2aWNlcyBmb3IgcmVzcG9uZGluZyB0byB2aW9sZW5jZSBhZ2FpbnN0IHdvbWVuIEMuREUxNjkgT2JzZXJ2YXRpb24iCmRlZmluZSAiU2VydmljZXMgZm9yIHJlc3BvbmRpbmcgdG8gdmlvbGVuY2UgYWdhaW5zdCB3b21lbiBDLkRFMTY5IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gQy5ERTE2OSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gQy5ERTE2OSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gQy5ERTE2OSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gQy5ERTE2OSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTEgLSBSZWFzb24gZm9yIHZpc2l0CkBhY3Rpdml0eTogSElWLkQxIERldGVybWluZSByZWFzb24gZm9yIHZpc2l0CkBkZXNjcmlwdGlvbjogV2hldGhlciB2aXNpdCB3YXMgc2NoZWR1bGVkIG9yIHVuc2NoZWR1bGVkLCBjbGluaWNhbCBvbmx5LCBvciBmb3IgQVJWIGRydWcgcGljay11cAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmVhc29uIGZvciB2aXNpdCBELkRFMSI6CiAgZXhpc3RzICJSZWFzb24gZm9yIHZpc2l0IEQuREUxIE9ic2VydmF0aW9uIgpkZWZpbmUgIlJlYXNvbiBmb3IgdmlzaXQgRC5ERTEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSZWFzb24gZm9yIHZpc2l0IEQuREUxIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUmVhc29uIGZvciB2aXNpdCBELkRFMSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTIgLSBGaXJzdCBjbGluaWNhbCB2aXNpdApAYWN0aXZpdHk6IEhJVi5EMSBEZXRlcm1pbmUgcmVhc29uIGZvciB2aXNpdApAZGVzY3JpcHRpb246IFRoZSBjbGllbnQncyBmaXJzdCBhcHBvaW50bWVudCBmb3IgY2xpbmljYWwgY2FyZSBieSBhIHByb3ZpZGVyIGF0IHRoZSBmYWNpbGl0eQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRmlyc3QgY2xpbmljYWwgdmlzaXQiOgogIGV4aXN0cyAiRmlyc3QgY2xpbmljYWwgdmlzaXQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJGaXJzdCBjbGluaWNhbCB2aXNpdCBPYnNlcnZhdGlvbiIKZGVmaW5lICJGaXJzdCBjbGluaWNhbCB2aXNpdCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJGaXJzdCBjbGluaWNhbCB2aXNpdCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkZpcnN0IGNsaW5pY2FsIHZpc2l0IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRmlyc3QgY2xpbmljYWwgdmlzaXQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBGaXJzdCBjbGluaWNhbCB2aXNpdCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMgLSBDbGluaWNhbCB2aXNpdApAYWN0aXZpdHk6IEhJVi5EMSBEZXRlcm1pbmUgcmVhc29uIGZvciB2aXNpdApAZGVzY3JpcHRpb246IEFwcG9pbnRtZW50IGZvciBjbGluaWNhbCBjYXJlIGJ5IGEgcHJvdmlkZXIKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNsaW5pY2FsIHZpc2l0IEQuREUzIjoKICBleGlzdHMgIkNsaW5pY2FsIHZpc2l0IEQuREUzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ2xpbmljYWwgdmlzaXQgRC5ERTMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ2xpbmljYWwgdmlzaXQgRC5ERTMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ2xpbmljYWwgdmlzaXQgRC5ERTMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDbGluaWNhbCB2aXNpdCBELkRFMyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNsaW5pY2FsIHZpc2l0IEQuREUzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ2xpbmljYWwgdmlzaXQgRC5ERTMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU0IC0gQVJUIGluaXRpYXRpb24KQGFjdGl2aXR5OiBISVYuRDEgRGV0ZXJtaW5lIHJlYXNvbiBmb3IgdmlzaXQKQGRlc2NyaXB0aW9uOiBBcHBvaW50bWVudCBmb3IgaW5pdGlhdGlvbiBvZiBBUlQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFSVCBpbml0aWF0aW9uIjoKICBleGlzdHMgIkFSVCBpbml0aWF0aW9uIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQVJUIGluaXRpYXRpb24gT2JzZXJ2YXRpb24iCmRlZmluZSAiQVJUIGluaXRpYXRpb24gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQVJUIGluaXRpYXRpb24gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBUlQgaW5pdGlhdGlvbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFSVCBpbml0aWF0aW9uIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQVJUIGluaXRpYXRpb24gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1IC0gQVJUIGRydWcgcGljayB1cApAYWN0aXZpdHk6IEhJVi5EMSBEZXRlcm1pbmUgcmVhc29uIGZvciB2aXNpdApAZGVzY3JpcHRpb246IEFwcG9pbnRtZW50IGZvciBhbiBhbnRpcmV0cm92aXJhbCBkcnVnIHBpY2sgdXAKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFSVCBkcnVnIHBpY2sgdXAiOgogIGV4aXN0cyAiQVJUIGRydWcgcGljayB1cCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFSVCBkcnVnIHBpY2sgdXAgT2JzZXJ2YXRpb24iCmRlZmluZSAiQVJUIGRydWcgcGljayB1cCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBUlQgZHJ1ZyBwaWNrIHVwIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQVJUIGRydWcgcGljayB1cCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFSVCBkcnVnIHBpY2sgdXAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBUlQgZHJ1ZyBwaWNrIHVwICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNiAtIElzc3VlcyBhbmQgY29uY2VybnMKQGFjdGl2aXR5OiBISVYuRDEgRGV0ZXJtaW5lIHJlYXNvbiBmb3IgdmlzaXQKQGRlc2NyaXB0aW9uOiBWaXNpdCB0byBhZGRyZXNzIGlzc3VlcyBhbmQgY29uY2VybnMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIklzc3VlcyBhbmQgY29uY2VybnMiOgogIGV4aXN0cyAiSXNzdWVzIGFuZCBjb25jZXJucyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIklzc3VlcyBhbmQgY29uY2VybnMgT2JzZXJ2YXRpb24iCmRlZmluZSAiSXNzdWVzIGFuZCBjb25jZXJucyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJJc3N1ZXMgYW5kIGNvbmNlcm5zIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSXNzdWVzIGFuZCBjb25jZXJucyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIklzc3VlcyBhbmQgY29uY2VybnMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBJc3N1ZXMgYW5kIGNvbmNlcm5zICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNyAtIFBvc3QtdHJlYXRtZW50IGZvbGxvdy11cCB2aXNpdCBmb3IgY2VydmljYWwgcHJlY2FuY2VyIGxlc2lvbnMgb3IgaW52YXNpdmUgY2VydmljYWwgY2FuY2VyCkBhY3Rpdml0eTogSElWLkQxIERldGVybWluZSByZWFzb24gZm9yIHZpc2l0CkBkZXNjcmlwdGlvbjogQXBwb2ludG1lbnQgZm9yIGEgcG9zdC10cmVhdG1lbnQgZm9sbG93LXVwIHZpc2l0IGZvciBjZXJ2aWNhbCBwcmVjYW5jZXIgbGVzaW9ucyBvciBpbnZhc2l2ZSBjZXJ2aWNhbCBjYW5jZXIKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBvc3QtdHJlYXRtZW50IGZvbGxvdy11cCB2aXNpdCBmb3IgY2VydmljYWwgcHJlY2FuY2VyIGxlc2lvbnMgb3IgaW52YXNpdmUgY2VydmljYWwgY2FuY2VyIEQuREU3IjoKICBleGlzdHMgIlBvc3QtdHJlYXRtZW50IGZvbGxvdy11cCB2aXNpdCBmb3IgY2VydmljYWwgcHJlY2FuY2VyIGxlc2lvbnMgb3IgaW52YXNpdmUgY2VydmljYWwgY2FuY2VyIEQuREU3IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUG9zdC10cmVhdG1lbnQgZm9sbG93LXVwIHZpc2l0IGZvciBjZXJ2aWNhbCBwcmVjYW5jZXIgbGVzaW9ucyBvciBpbnZhc2l2ZSBjZXJ2aWNhbCBjYW5jZXIgRC5ERTcgT2JzZXJ2YXRpb24iCmRlZmluZSAiUG9zdC10cmVhdG1lbnQgZm9sbG93LXVwIHZpc2l0IGZvciBjZXJ2aWNhbCBwcmVjYW5jZXIgbGVzaW9ucyBvciBpbnZhc2l2ZSBjZXJ2aWNhbCBjYW5jZXIgRC5ERTcgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUG9zdC10cmVhdG1lbnQgZm9sbG93LXVwIHZpc2l0IGZvciBjZXJ2aWNhbCBwcmVjYW5jZXIgbGVzaW9ucyBvciBpbnZhc2l2ZSBjZXJ2aWNhbCBjYW5jZXIgRC5ERTcgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQb3N0LXRyZWF0bWVudCBmb2xsb3ctdXAgdmlzaXQgZm9yIGNlcnZpY2FsIHByZWNhbmNlciBsZXNpb25zIG9yIGludmFzaXZlIGNlcnZpY2FsIGNhbmNlciBELkRFNyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBvc3QtdHJlYXRtZW50IGZvbGxvdy11cCB2aXNpdCBmb3IgY2VydmljYWwgcHJlY2FuY2VyIGxlc2lvbnMgb3IgaW52YXNpdmUgY2VydmljYWwgY2FuY2VyIEQuREU3IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUG9zdC10cmVhdG1lbnQgZm9sbG93LXVwIHZpc2l0IGZvciBjZXJ2aWNhbCBwcmVjYW5jZXIgbGVzaW9ucyBvciBpbnZhc2l2ZSBjZXJ2aWNhbCBjYW5jZXIgRC5ERTcgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5IC0gQm9keSB0ZW1wZXJhdHVyZQpAYWN0aXZpdHk6IEhJVi5EMiBUYWtlIHZpdGFsIHNpZ25zCkBkZXNjcmlwdGlvbjogVGVtcGVyYXR1cmUgb2YgdGhlIGNsaWVudCBpbiBDZWxzaXVzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJCb2R5IHRlbXBlcmF0dXJlIjoKICBFbGVtZW50cy4iQm9keSB0ZW1wZXJhdHVyZSIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJCb2R5IHRlbXBlcmF0dXJlIFZhbHVlIjoKICAiQm9keSB0ZW1wZXJhdHVyZSIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBCb2R5IHRlbXBlcmF0dXJlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTMgLSBCb2R5IHdlaWdodApAYWN0aXZpdHk6IEhJVi5EMiBUYWtlIHZpdGFsIHNpZ25zCkBkZXNjcmlwdGlvbjogVGhlIGNsaWVudCdzIGN1cnJlbnQgd2VpZ2h0IGluIGtpbG9ncmFtcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQm9keSB3ZWlnaHQiOgogIEVsZW1lbnRzLiJCb2R5IHdlaWdodCIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJCb2R5IHdlaWdodCBWYWx1ZSI6CiAgIkJvZHkgd2VpZ2h0IiBPCiAgcmV0dXJuIE8udmFsdWUKLyogRW5kIG9mIEJvZHkgd2VpZ2h0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTcgLSBTaWducyBvZiBzZXJpb3VzIGlsbG5lc3MKQGFjdGl2aXR5OiBISVYuRDMgQ2hlY2sgZm9yIHNpZ25zIG9mIHNlcmlvdXMgaWxsbmVzcwpAZGVzY3JpcHRpb246IFNpZ25zIHRoYXQgbWF5IGluZGljYXRlIHRoZSBjbGllbnQgaGFzIGEgc2VyaW91cyBpbGxuZXNzIGFuZCBuZWVkcyB0cmlhZ2Ugb3IgYW4gZW1lcmdlbmN5IHJlZmVycmFsCiovCmRlZmluZSAiU2lnbnMgb2Ygc2VyaW91cyBpbGxuZXNzIjoKICBleGlzdHMgIlNpZ25zIG9mIHNlcmlvdXMgaWxsbmVzcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJTaWducyBvZiBzZXJpb3VzIGlsbG5lc3MgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTaWducyBvZiBzZXJpb3VzIGlsbG5lc3MgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTaWducyBvZiBzZXJpb3VzIGlsbG5lc3MgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxOCAtIEZldmVyIG9mIDM5IEMgb3IgZ3JlYXRlcgpAYWN0aXZpdHk6IEhJVi5EMyBDaGVjayBmb3Igc2lnbnMgb2Ygc2VyaW91cyBpbGxuZXNzCkBkZXNjcmlwdGlvbjogQ2xpZW50IGhhcyBhIGZldmVyIHdpdGggYSBtZWFzdXJlZCB0ZW1wZXJhdHVyZSBvZiAxMDIuMiBGLzM5IEMgb3IgZ3JlYXRlcgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRmV2ZXIgb2YgMzkgQyBvciBncmVhdGVyIjoKICBleGlzdHMgIkZldmVyIG9mIDM5IEMgb3IgZ3JlYXRlciBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkZldmVyIG9mIDM5IEMgb3IgZ3JlYXRlciBPYnNlcnZhdGlvbiIKZGVmaW5lICJGZXZlciBvZiAzOSBDIG9yIGdyZWF0ZXIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRmV2ZXIgb2YgMzkgQyBvciBncmVhdGVyIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRmV2ZXIgb2YgMzkgQyBvciBncmVhdGVyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRmV2ZXIgb2YgMzkgQyBvciBncmVhdGVyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRmV2ZXIgb2YgMzkgQyBvciBncmVhdGVyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTkgLSBUYWNoeWNhcmRpYQpAYWN0aXZpdHk6IEhJVi5EMyBDaGVjayBmb3Igc2lnbnMgb2Ygc2VyaW91cyBpbGxuZXNzCkBkZXNjcmlwdGlvbjogSGVhcnQgcmF0ZSBhYm92ZSBhIHJhdGUgcGVyIG1pbnV0ZSBiYXNlZCBvbiBhZ2UKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRhY2h5Y2FyZGlhIjoKICBleGlzdHMgIlRhY2h5Y2FyZGlhIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVGFjaHljYXJkaWEgT2JzZXJ2YXRpb24iCmRlZmluZSAiVGFjaHljYXJkaWEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVGFjaHljYXJkaWEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJUYWNoeWNhcmRpYSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlRhY2h5Y2FyZGlhIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVGFjaHljYXJkaWEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyMCAtIFRhY2h5cG5lYQpAYWN0aXZpdHk6IEhJVi5EMyBDaGVjayBmb3Igc2lnbnMgb2Ygc2VyaW91cyBpbGxuZXNzCkBkZXNjcmlwdGlvbjogUmVzcGlyYXRvcnkgcmF0ZSBhYm92ZSBhIG51bWJlciBvZiBicmVhdGhzIHBlciBtaW51dGUgYmFzZWQgb24gYWdlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUYWNoeXBuZWEiOgogIGV4aXN0cyAiVGFjaHlwbmVhIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVGFjaHlwbmVhIE9ic2VydmF0aW9uIgpkZWZpbmUgIlRhY2h5cG5lYSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJUYWNoeXBuZWEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJUYWNoeXBuZWEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUYWNoeXBuZWEgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUYWNoeXBuZWEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyMSAtIFVuYWJsZSB0byB3YWxrIHVuYWlkZWQKQGFjdGl2aXR5OiBISVYuRDMgQ2hlY2sgZm9yIHNpZ25zIG9mIHNlcmlvdXMgaWxsbmVzcwpAZGVzY3JpcHRpb246IENsaWVudCBpcyBub3QgYWJsZSB0byB3YWxrIHdpdGhvdXQgaGVscAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVW5hYmxlIHRvIHdhbGsgdW5haWRlZCI6CiAgZXhpc3RzICJVbmFibGUgdG8gd2FsayB1bmFpZGVkIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVW5hYmxlIHRvIHdhbGsgdW5haWRlZCBPYnNlcnZhdGlvbiIKZGVmaW5lICJVbmFibGUgdG8gd2FsayB1bmFpZGVkIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlVuYWJsZSB0byB3YWxrIHVuYWlkZWQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJVbmFibGUgdG8gd2FsayB1bmFpZGVkIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVW5hYmxlIHRvIHdhbGsgdW5haWRlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFVuYWJsZSB0byB3YWxrIHVuYWlkZWQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyMiAtIExldGhhcmd5CkBhY3Rpdml0eTogSElWLkQzIENoZWNrIGZvciBzaWducyBvZiBzZXJpb3VzIGlsbG5lc3MKQGRlc2NyaXB0aW9uOiBDbGllbnQgaXMgZXhoaWJpdGluZyBsZXRoYXJneSBhcyBhIHNpZ24gb2Ygc2VyaW91cyBpbGxuZXNzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJMZXRoYXJneSBELkRFMjIiOgogIGV4aXN0cyAiTGV0aGFyZ3kgRC5ERTIyIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTGV0aGFyZ3kgRC5ERTIyIE9ic2VydmF0aW9uIgpkZWZpbmUgIkxldGhhcmd5IEQuREUyMiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJMZXRoYXJneSBELkRFMjIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJMZXRoYXJneSBELkRFMjIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJMZXRoYXJneSBELkRFMjIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBMZXRoYXJneSBELkRFMjIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyMyAtIFVuY29uc2Npb3VzbmVzcwpAYWN0aXZpdHk6IEhJVi5EMyBDaGVjayBmb3Igc2lnbnMgb2Ygc2VyaW91cyBpbGxuZXNzCkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIGN1cnJlbnRseSB1bmNvbnNjaW91cwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVW5jb25zY2lvdXNuZXNzIjoKICBleGlzdHMgIlVuY29uc2Npb3VzbmVzcyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlVuY29uc2Npb3VzbmVzcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJVbmNvbnNjaW91c25lc3MgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVW5jb25zY2lvdXNuZXNzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVW5jb25zY2lvdXNuZXNzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVW5jb25zY2lvdXNuZXNzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVW5jb25zY2lvdXNuZXNzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMjQgLSBDb252dWxzaW9ucwpAYWN0aXZpdHk6IEhJVi5EMyBDaGVjayBmb3Igc2lnbnMgb2Ygc2VyaW91cyBpbGxuZXNzCkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIGNvbnZ1bHNpbmcKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNvbnZ1bHNpb25zIjoKICBleGlzdHMgIkNvbnZ1bHNpb25zIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ29udnVsc2lvbnMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ29udnVsc2lvbnMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ29udnVsc2lvbnMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDb252dWxzaW9ucyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNvbnZ1bHNpb25zIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ29udnVsc2lvbnMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyNSAtIFVuYWJsZSB0byBkcmluawpAYWN0aXZpdHk6IEhJVi5EMyBDaGVjayBmb3Igc2lnbnMgb2Ygc2VyaW91cyBpbGxuZXNzCkBkZXNjcmlwdGlvbjogQ2hpbGQgaXMgbm90IGFibGUgdG8gZHJpbmsKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlVuYWJsZSB0byBkcmluayI6CiAgZXhpc3RzICJVbmFibGUgdG8gZHJpbmsgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJVbmFibGUgdG8gZHJpbmsgT2JzZXJ2YXRpb24iCmRlZmluZSAiVW5hYmxlIHRvIGRyaW5rIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlVuYWJsZSB0byBkcmluayBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlVuYWJsZSB0byBkcmluayBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlVuYWJsZSB0byBkcmluayBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFVuYWJsZSB0byBkcmluayAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTI2IC0gVW5hYmxlIHRvIGJyZWFzdGZlZWQKQGFjdGl2aXR5OiBISVYuRDMgQ2hlY2sgZm9yIHNpZ25zIG9mIHNlcmlvdXMgaWxsbmVzcwpAZGVzY3JpcHRpb246IEluZmFudCBvciBjaGlsZCBpcyBub3QgYWJsZSB0byBicmVhc3RmZWVkCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJVbmFibGUgdG8gYnJlYXN0ZmVlZCI6CiAgZXhpc3RzICJVbmFibGUgdG8gYnJlYXN0ZmVlZCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlVuYWJsZSB0byBicmVhc3RmZWVkIE9ic2VydmF0aW9uIgpkZWZpbmUgIlVuYWJsZSB0byBicmVhc3RmZWVkIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlVuYWJsZSB0byBicmVhc3RmZWVkIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVW5hYmxlIHRvIGJyZWFzdGZlZWQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJVbmFibGUgdG8gYnJlYXN0ZmVlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFVuYWJsZSB0byBicmVhc3RmZWVkICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMjcgLSBSZXBlYXRlZCB2b21pdGluZwpAYWN0aXZpdHk6IEhJVi5EMyBDaGVjayBmb3Igc2lnbnMgb2Ygc2VyaW91cyBpbGxuZXNzCkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIHJlcGVhdGVkbHkgdm9taXRpbmcKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlJlcGVhdGVkIHZvbWl0aW5nIjoKICBleGlzdHMgIlJlcGVhdGVkIHZvbWl0aW5nIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmVwZWF0ZWQgdm9taXRpbmcgT2JzZXJ2YXRpb24iCmRlZmluZSAiUmVwZWF0ZWQgdm9taXRpbmcgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUmVwZWF0ZWQgdm9taXRpbmcgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSZXBlYXRlZCB2b21pdGluZyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlJlcGVhdGVkIHZvbWl0aW5nIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUmVwZWF0ZWQgdm9taXRpbmcgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyOCAtIEhlYWRhY2hlCkBhY3Rpdml0eTogSElWLkQzIENoZWNrIGZvciBzaWducyBvZiBzZXJpb3VzIGlsbG5lc3MKQGRlc2NyaXB0aW9uOiBDbGllbnQgaXMgZXhoaWJpdGluZyBhIGhlYWRhY2hlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJIZWFkYWNoZSBELkRFMjgiOgogIGV4aXN0cyAiSGVhZGFjaGUgRC5ERTI4IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSGVhZGFjaGUgRC5ERTI4IE9ic2VydmF0aW9uIgpkZWZpbmUgIkhlYWRhY2hlIEQuREUyOCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJIZWFkYWNoZSBELkRFMjggQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJIZWFkYWNoZSBELkRFMjggT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJIZWFkYWNoZSBELkRFMjggT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBIZWFkYWNoZSBELkRFMjggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyOSAtIE90aGVyIHNpZ24gb2Ygc2VyaW91cyBpbGxuZXNzCkBhY3Rpdml0eTogSElWLkQzIENoZWNrIGZvciBzaWducyBvZiBzZXJpb3VzIGlsbG5lc3MKQGRlc2NyaXB0aW9uOiBDbGllbnQgaXMgZXhoaWJpdGluZyBhbm90aGVyIHNpZ24gb2YgYSBzZXJpb3VzIGlsbG5lc3MKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk90aGVyIHNpZ24gb2Ygc2VyaW91cyBpbGxuZXNzIjoKICBleGlzdHMgIk90aGVyIHNpZ24gb2Ygc2VyaW91cyBpbGxuZXNzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiT3RoZXIgc2lnbiBvZiBzZXJpb3VzIGlsbG5lc3MgT2JzZXJ2YXRpb24iCmRlZmluZSAiT3RoZXIgc2lnbiBvZiBzZXJpb3VzIGlsbG5lc3MgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iT3RoZXIgc2lnbiBvZiBzZXJpb3VzIGlsbG5lc3MgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJPdGhlciBzaWduIG9mIHNlcmlvdXMgaWxsbmVzcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk90aGVyIHNpZ24gb2Ygc2VyaW91cyBpbGxuZXNzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT3RoZXIgc2lnbiBvZiBzZXJpb3VzIGlsbG5lc3MgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMSAtIEN1cnJlbnRseSBwcmVnbmFudApAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IENsaWVudCBpcyBjdXJyZW50bHkgcHJlZ25hbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkN1cnJlbnRseSBwcmVnbmFudCBELkRFMzEiOgogIGV4aXN0cyAiQ3VycmVudGx5IHByZWduYW50IEQuREUzMSBPYnNlcnZhdGlvbiIKZGVmaW5lICJDdXJyZW50bHkgcHJlZ25hbnQgRC5ERTMxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ3VycmVudGx5IHByZWduYW50IEQuREUzMSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEN1cnJlbnRseSBwcmVnbmFudCBELkRFMzEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzNyAtIFNlcm9kaXNjb3JkYW50IHBhcnRuZXIKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBISVYgc3RhdHVzIGlzIGRpZmZlcmVudCBmcm9tIGEgY3VycmVudCBwYXJ0bmVyJ3MgSElWIHN0YXR1cwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2Vyb2Rpc2NvcmRhbnQgcGFydG5lciBELkRFMzciOgogIGV4aXN0cyAiU2Vyb2Rpc2NvcmRhbnQgcGFydG5lciBELkRFMzcgT2JzZXJ2YXRpb24iCmRlZmluZSAiU2Vyb2Rpc2NvcmRhbnQgcGFydG5lciBELkRFMzcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTZXJvZGlzY29yZGFudCBwYXJ0bmVyIEQuREUzNyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNlcm9kaXNjb3JkYW50IHBhcnRuZXIgRC5ERTM3ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzggLSBPbiBBUlQKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBDbGllbnQgaXMgY3VycmVudGx5IHRha2luZyBBUlQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk9uIEFSVCBELkRFMzgiOgogIEVsZW1lbnRzLiJPbiBBUlQgRC5ERTM4IiBNUwogICAgICB3aGVyZSBNUy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE9uIEFSVCBELkRFMzggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzOSAtIEFSVCBzdGFydCBkYXRlCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGNsaWVudCBzdGFydGVkIG9yIHJlc3RhcnRlZCBBUlQKKi8KZGVmaW5lICJBUlQgc3RhcnQgZGF0ZSBELkRFMzkiOgogICJPbiBBUlQgRC5ERTM4IiBNUwogIHJldHVybiBzdGFydCBvZiBNUy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpCi8qIEVuZCBvZiBBUlQgc3RhcnQgZGF0ZSBELkRFMzkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU0MiAtIEVzdGFibGlzaGVkIG9uIEFSVApAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IElzIHRoZSBjbGllbnQgc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIG9uIEFSVD8KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkVzdGFibGlzaGVkIG9uIEFSVCI6CiAgZXhpc3RzICJFc3RhYmxpc2hlZCBvbiBBUlQgT2JzZXJ2YXRpb24iCmRlZmluZSAiRXN0YWJsaXNoZWQgb24gQVJUIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRXN0YWJsaXNoZWQgb24gQVJUIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRXN0YWJsaXNoZWQgb24gQVJUICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNDMgLSBBUlQgc3RhcnQgdHlwZQpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFdoZXRoZXIgdGhlIGNsaWVudCBpcyBBUlQgbmFpdmUgb3IgaXMgcmVzdGFydGluZyBBUlQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFSVCBzdGFydCB0eXBlIjoKICBleGlzdHMgIkFSVCBzdGFydCB0eXBlIE9ic2VydmF0aW9uIgpkZWZpbmUgIkFSVCBzdGFydCB0eXBlIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQVJUIHN0YXJ0IHR5cGUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBUlQgc3RhcnQgdHlwZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTQ0IC0gRmlyc3QtdGltZSB1c2VyIG9mIEFSVApAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IENsaWVudCBpcyBBUlQgbmFpdmUsIGhhdmluZyBuZXZlciB0YWtlbiBBUlQgdG8gdHJlYXQgSElWIGJlZm9yZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRmlyc3QtdGltZSB1c2VyIG9mIEFSVCI6CiAgZXhpc3RzICJGaXJzdC10aW1lIHVzZXIgb2YgQVJUIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRmlyc3QtdGltZSB1c2VyIG9mIEFSVCBPYnNlcnZhdGlvbiIKZGVmaW5lICJGaXJzdC10aW1lIHVzZXIgb2YgQVJUIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkZpcnN0LXRpbWUgdXNlciBvZiBBUlQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJGaXJzdC10aW1lIHVzZXIgb2YgQVJUIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRmlyc3QtdGltZSB1c2VyIG9mIEFSVCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEZpcnN0LXRpbWUgdXNlciBvZiBBUlQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU0NSAtIFJlc3RhcnRpbmcgQVJUCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIHJlc3RhcnRpbmcgQVJUIGFmdGVyIHN0b3BwaW5nIHRyZWF0bWVudCBmb3IgYW55IHJlYXNvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmVzdGFydGluZyBBUlQiOgogIGV4aXN0cyAiUmVzdGFydGluZyBBUlQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJSZXN0YXJ0aW5nIEFSVCBPYnNlcnZhdGlvbiIKZGVmaW5lICJSZXN0YXJ0aW5nIEFSVCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJSZXN0YXJ0aW5nIEFSVCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlJlc3RhcnRpbmcgQVJUIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmVzdGFydGluZyBBUlQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBSZXN0YXJ0aW5nIEFSVCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTc1IC0gQ3VycmVudCBBUlQgcmVnaW1lbgpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoZSBjdXJyZW50IEFSVCByZWdpbWVuIHRoZSBjbGllbnQgaXMgdGFraW5nCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDdXJyZW50IEFSVCByZWdpbWVuIjoKICBleGlzdHMgIkN1cnJlbnQgQVJUIHJlZ2ltZW4gT2JzZXJ2YXRpb24iCmRlZmluZSAiQ3VycmVudCBBUlQgcmVnaW1lbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkN1cnJlbnQgQVJUIHJlZ2ltZW4gT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDdXJyZW50IEFSVCByZWdpbWVuICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNzcgLSBQcmVmZXJyZWQgZmlyc3QtbGluZSBBUlQgcmVnaW1lbgpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoZSBwcmVmZXJyZWQgZmlyc3QtbGluZSBBUlQgcmVnaW1lbiBmb3IgdGhlIGNsaWVudCBhY2NvcmRpbmcgdG8gV0hPIChvciBuYXRpb25hbCkgZ3VpZGVsaW5lcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUHJlZmVycmVkIGZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4iOgogIGV4aXN0cyAiUHJlZmVycmVkIGZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gT2JzZXJ2YXRpb24iCmRlZmluZSAiUHJlZmVycmVkIGZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQcmVmZXJyZWQgZmlyc3QtbGluZSBBUlQgcmVnaW1lbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFByZWZlcnJlZCBmaXJzdC1saW5lIEFSVCByZWdpbWVuICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNzggLSBBbHRlcm5hdGl2ZSBmaXJzdC1saW5lIEFSVCByZWdpbWVuCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVGhlIGFsdGVybmF0aXZlIGZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIHRoZSBjbGllbnQgYWNjb3JkaW5nIHRvIFdITyAob3IgbmF0aW9uYWwpIGd1aWRlbGluZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFsdGVybmF0aXZlIGZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4iOgogIGV4aXN0cyAiQWx0ZXJuYXRpdmUgZmlyc3QtbGluZSBBUlQgcmVnaW1lbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJBbHRlcm5hdGl2ZSBmaXJzdC1saW5lIEFSVCByZWdpbWVuIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQWx0ZXJuYXRpdmUgZmlyc3QtbGluZSBBUlQgcmVnaW1lbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFsdGVybmF0aXZlIGZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU3OSAtIEZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gdW5kZXIgc3BlY2lhbCBjaXJjdW1zdGFuY2VzCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVGhlIGZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIHRoZSBjbGllbnQgdW5kZXIgc3BlY2lhbCBjaXJjdW1zdGFuY2VzIGFjY29yZGluZyB0byBXSE8gKG9yIG5hdGlvbmFsKSBndWlkZWxpbmVzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJGaXJzdC1saW5lIEFSVCByZWdpbWVuIHVuZGVyIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcyI6CiAgZXhpc3RzICJGaXJzdC1saW5lIEFSVCByZWdpbWVuIHVuZGVyIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJGaXJzdC1saW5lIEFSVCByZWdpbWVuIHVuZGVyIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gdW5kZXIgc3BlY2lhbCBjaXJjdW1zdGFuY2VzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRmlyc3QtbGluZSBBUlQgcmVnaW1lbiB1bmRlciBzcGVjaWFsIGNpcmN1bXN0YW5jZXMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU4MCAtIFByZWZlcnJlZCBzZWNvbmQtbGluZSBBUlQgcmVnaW1lbgpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoZSBwcmVmZXJyZWQgc2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gZm9yIHRoZSBjbGllbnQgYWNjb3JkaW5nIHRvIFdITyAob3IgbmF0aW9uYWwpIGd1aWRlbGluZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlByZWZlcnJlZCBzZWNvbmQtbGluZSBBUlQgcmVnaW1lbiI6CiAgZXhpc3RzICJQcmVmZXJyZWQgc2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gT2JzZXJ2YXRpb24iCmRlZmluZSAiUHJlZmVycmVkIHNlY29uZC1saW5lIEFSVCByZWdpbWVuIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUHJlZmVycmVkIHNlY29uZC1saW5lIEFSVCByZWdpbWVuIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUHJlZmVycmVkIHNlY29uZC1saW5lIEFSVCByZWdpbWVuICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFODEgLSBBbHRlcm5hdGl2ZSBzZWNvbmQtbGluZSBBUlQgcmVnaW1lbgpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoZSBhbHRlcm5hdGl2ZSBzZWNvbmQtbGluZSBBUlQgcmVnaW1lbiBmb3IgdGhlIGNsaWVudCBhY2NvcmRpbmcgdG8gV0hPIChvciBuYXRpb25hbCkgZ3VpZGVsaW5lcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQWx0ZXJuYXRpdmUgc2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4iOgogIGV4aXN0cyAiQWx0ZXJuYXRpdmUgc2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gT2JzZXJ2YXRpb24iCmRlZmluZSAiQWx0ZXJuYXRpdmUgc2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBbHRlcm5hdGl2ZSBzZWNvbmQtbGluZSBBUlQgcmVnaW1lbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFsdGVybmF0aXZlIHNlY29uZC1saW5lIEFSVCByZWdpbWVuICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFODIgLSBPcHRpbWFsIHJlZ2ltZW4gZm9yIHRyYW5zaXRpb24KQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUaGUgb3B0aW1hbCByZWdpbWVuIGZvciB0cmFuc2l0aW9uIHRvIERURy1iYXNlZCByZWdpbWVucyBmb3IgY2hpbGRyZW4gZXN0YWJsaXNoZWQgb24gQVJUCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJPcHRpbWFsIHJlZ2ltZW4gZm9yIHRyYW5zaXRpb24iOgogIGV4aXN0cyAiT3B0aW1hbCByZWdpbWVuIGZvciB0cmFuc2l0aW9uIE9ic2VydmF0aW9uIgpkZWZpbmUgIk9wdGltYWwgcmVnaW1lbiBmb3IgdHJhbnNpdGlvbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk9wdGltYWwgcmVnaW1lbiBmb3IgdHJhbnNpdGlvbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE9wdGltYWwgcmVnaW1lbiBmb3IgdHJhbnNpdGlvbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTgzIC0gQ3VycmVudCBBUlQgcmVnaW1lbiBmaXJzdC0sIHNlY29uZC0sIG9yIHRoaXJkLWxpbmUKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBUlQgcmVnaW1lbiBmb3IgdHJlYXRpbmcgY2xpZW50cyBsaXZpbmcgd2l0aCBISVYsIGJhc2VkIG9uIG5hdGlvbmFsIGd1aWRhbmNlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDdXJyZW50IEFSVCByZWdpbWVuIGZpcnN0LSwgc2Vjb25kLSwgb3IgdGhpcmQtbGluZSI6CiAgZXhpc3RzICJDdXJyZW50IEFSVCByZWdpbWVuIGZpcnN0LSwgc2Vjb25kLSwgb3IgdGhpcmQtbGluZSBPYnNlcnZhdGlvbiIKZGVmaW5lICJDdXJyZW50IEFSVCByZWdpbWVuIGZpcnN0LSwgc2Vjb25kLSwgb3IgdGhpcmQtbGluZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkN1cnJlbnQgQVJUIHJlZ2ltZW4gZmlyc3QtLCBzZWNvbmQtLCBvciB0aGlyZC1saW5lIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ3VycmVudCBBUlQgcmVnaW1lbiBmaXJzdC0sIHNlY29uZC0sIG9yIHRoaXJkLWxpbmUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU4NCAtIEZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGFkdWx0cyBhbmQgYWRvbGVzY2VudHMKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBhZHVsdHMgYW5kIGFkb2xlc2NlbnRzIGxpdmluZyB3aXRoIEhJVgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRmlyc3QtbGluZSBBUlQgcmVnaW1lbiBmb3IgYWR1bHRzIGFuZCBhZG9sZXNjZW50cyI6CiAgZXhpc3RzICJGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBhZHVsdHMgYW5kIGFkb2xlc2NlbnRzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRmlyc3QtbGluZSBBUlQgcmVnaW1lbiBmb3IgYWR1bHRzIGFuZCBhZG9sZXNjZW50cyBPYnNlcnZhdGlvbiIKZGVmaW5lICJGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBhZHVsdHMgYW5kIGFkb2xlc2NlbnRzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGFkdWx0cyBhbmQgYWRvbGVzY2VudHMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBhZHVsdHMgYW5kIGFkb2xlc2NlbnRzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRmlyc3QtbGluZSBBUlQgcmVnaW1lbiBmb3IgYWR1bHRzIGFuZCBhZG9sZXNjZW50cyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGFkdWx0cyBhbmQgYWRvbGVzY2VudHMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU4NSAtIEZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGNoaWxkcmVuCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogRmlyc3QtbGluZSBBUlQgcmVnaW1lbiBmb3IgY2hpbGRyZW4gbGl2aW5nIHdpdGggSElWCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBjaGlsZHJlbiI6CiAgZXhpc3RzICJGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBjaGlsZHJlbiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGNoaWxkcmVuIE9ic2VydmF0aW9uIgpkZWZpbmUgIkZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGNoaWxkcmVuIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGNoaWxkcmVuIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRmlyc3QtbGluZSBBUlQgcmVnaW1lbiBmb3IgY2hpbGRyZW4gT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBjaGlsZHJlbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGNoaWxkcmVuICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFODYgLSBGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBuZW9uYXRlcwpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IEZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIG5lb25hdGVzIGxpdmluZyB3aXRoIEhJVgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRmlyc3QtbGluZSBBUlQgcmVnaW1lbiBmb3IgbmVvbmF0ZXMiOgogIGV4aXN0cyAiRmlyc3QtbGluZSBBUlQgcmVnaW1lbiBmb3IgbmVvbmF0ZXMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBuZW9uYXRlcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBuZW9uYXRlcyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBuZW9uYXRlcyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkZpcnN0LWxpbmUgQVJUIHJlZ2ltZW4gZm9yIG5lb25hdGVzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRmlyc3QtbGluZSBBUlQgcmVnaW1lbiBmb3IgbmVvbmF0ZXMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBGaXJzdC1saW5lIEFSVCByZWdpbWVuIGZvciBuZW9uYXRlcyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTg3IC0gU2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGFkdWx0cyBhbmQgYWRvbGVzY2VudHMKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBTZWNvbmQtbGluZSBBUlQgcmVnaW1lbiBmb3IgYWR1bHRzIGFuZCBhZG9sZXNjZW50cyBsaXZpbmcgd2l0aCBISVYKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlNlY29uZC1saW5lIEFSVCByZWdpbWVuIGZvciBhZHVsdHMgYW5kIGFkb2xlc2NlbnRzIjoKICBleGlzdHMgIlNlY29uZC1saW5lIEFSVCByZWdpbWVuIGZvciBhZHVsdHMgYW5kIGFkb2xlc2NlbnRzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGFkdWx0cyBhbmQgYWRvbGVzY2VudHMgT2JzZXJ2YXRpb24iCmRlZmluZSAiU2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGFkdWx0cyBhbmQgYWRvbGVzY2VudHMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iU2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGFkdWx0cyBhbmQgYWRvbGVzY2VudHMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTZWNvbmQtbGluZSBBUlQgcmVnaW1lbiBmb3IgYWR1bHRzIGFuZCBhZG9sZXNjZW50cyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNlY29uZC1saW5lIEFSVCByZWdpbWVuIGZvciBhZHVsdHMgYW5kIGFkb2xlc2NlbnRzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGFkdWx0cyBhbmQgYWRvbGVzY2VudHMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU4OCAtIFNlY29uZC1saW5lIEFSVCByZWdpbWVuIGZvciBjaGlsZHJlbgpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFNlY29uZC1saW5lIEFSVCByZWdpbWVuIGZvciBjaGlsZHJlbiBsaXZpbmcgd2l0aCBISVYKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlNlY29uZC1saW5lIEFSVCByZWdpbWVuIGZvciBjaGlsZHJlbiI6CiAgZXhpc3RzICJTZWNvbmQtbGluZSBBUlQgcmVnaW1lbiBmb3IgY2hpbGRyZW4gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJTZWNvbmQtbGluZSBBUlQgcmVnaW1lbiBmb3IgY2hpbGRyZW4gT2JzZXJ2YXRpb24iCmRlZmluZSAiU2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gZm9yIGNoaWxkcmVuIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNlY29uZC1saW5lIEFSVCByZWdpbWVuIGZvciBjaGlsZHJlbiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlNlY29uZC1saW5lIEFSVCByZWdpbWVuIGZvciBjaGlsZHJlbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNlY29uZC1saW5lIEFSVCByZWdpbWVuIGZvciBjaGlsZHJlbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNlY29uZC1saW5lIEFSVCByZWdpbWVuIGZvciBjaGlsZHJlbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTg5IC0gVGhpcmQtbGluZSBBUlQgcmVnaW1lbgpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoaXJkLWxpbmUgQVJUIHJlZ2ltZW4gZm9yIHBlb3BsZSBsaXZpbmcgd2l0aCBISVYgKE5vdCBkZWZpbmVkIGJ5IFdITy4gTmF0aW9uYWwgcHJvZ3JhbW1lcyBzaG91bGQgZGV2ZWxvcCBwb2xpY2llcyBmb3IgdGhpcmQtbGluZSBBUlQpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUaGlyZC1saW5lIEFSVCByZWdpbWVuIjoKICBleGlzdHMgIlRoaXJkLWxpbmUgQVJUIHJlZ2ltZW4gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJUaGlyZC1saW5lIEFSVCByZWdpbWVuIE9ic2VydmF0aW9uIgpkZWZpbmUgIlRoaXJkLWxpbmUgQVJUIHJlZ2ltZW4gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVGhpcmQtbGluZSBBUlQgcmVnaW1lbiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlRoaXJkLWxpbmUgQVJUIHJlZ2ltZW4gT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUaGlyZC1saW5lIEFSVCByZWdpbWVuIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVGhpcmQtbGluZSBBUlQgcmVnaW1lbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTEyOCAtIEFSVCByZWdpbWVuIGNvbXBvc2l0aW9uCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogRHJ1ZyBjb21wb3NpdGlvbiBvZiBjbGllbnQncyBjdXJyZW50IEFSVCByZWdpbWVuCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBUlQgcmVnaW1lbiBjb21wb3NpdGlvbiI6CiAgZXhpc3RzICJBUlQgcmVnaW1lbiBjb21wb3NpdGlvbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJBUlQgcmVnaW1lbiBjb21wb3NpdGlvbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFSVCByZWdpbWVuIGNvbXBvc2l0aW9uIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQVJUIHJlZ2ltZW4gY29tcG9zaXRpb24gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxMjkgLSBBQkMKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUcmVhdGVkIHdpdGggYWJhY2F2aXIgKEFCQykKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFCQyI6CiAgZXhpc3RzICJBQkMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBQkMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQUJDIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFCQyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFCQyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFCQyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFCQyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTEzMCAtIEZUQwpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRyZWF0ZWQgd2l0aCBlbXRyaWNpdGFiaW5lIChGVEMpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJGVEMiOgogIGV4aXN0cyAiRlRDIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRlRDIE9ic2VydmF0aW9uIgpkZWZpbmUgIkZUQyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJGVEMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJGVEMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJGVEMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBGVEMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxMzEgLSAzVEMKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUcmVhdGVkIHdpdGggbGFtaXZ1ZGluZSAoM1RDKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiM1RDIjoKICBleGlzdHMgIjNUQyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIjNUQyBPYnNlcnZhdGlvbiIKZGVmaW5lICIzVEMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iM1RDIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiM1RDIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iM1RDIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgM1RDICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTMyIC0gQVpUCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVHJlYXRlZCB3aXRoIHppZG92dWRpbmUgKEFaVCkKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFaVCI6CiAgZXhpc3RzICJBWlQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBWlQgT2JzZXJ2YXRpb24iCmRlZmluZSAiQVpUIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFaVCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFaVCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFaVCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFaVCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTEzMyAtIERESQpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRyZWF0ZWQgd2l0aCBkaWRhbm9zaW5lIChEREkpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJEREkiOgogIGV4aXN0cyAiRERJIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRERJIE9ic2VydmF0aW9uIgpkZWZpbmUgIkRESSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJEREkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEREkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJEREkgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBEREkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxMzQgLSBENFQKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUcmVhdGVkIHdpdGggc3RhdnVkaW5lIChENFQpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJENFQiOgogIGV4aXN0cyAiRDRUIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRDRUIE9ic2VydmF0aW9uIgpkZWZpbmUgIkQ0VCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJENFQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJENFQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJENFQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBENFQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxMzUgLSBUREYKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUcmVhdGVkIHdpdGggdGVub2ZvdmlyIChUREYpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUREYgRC5ERTEzNSI6CiAgZXhpc3RzICJUREYgRC5ERTEzNSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlRERiBELkRFMTM1IE9ic2VydmF0aW9uIgpkZWZpbmUgIlRERiBELkRFMTM1IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlRERiBELkRFMTM1IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVERGIEQuREUxMzUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUREYgRC5ERTEzNSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFRERiBELkRFMTM1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTM2IC0gRUZWCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVHJlYXRlZCB3aXRoIGVmYXZpcmVueiAoRUZWKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRUZWIjoKICBleGlzdHMgIkVGViBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkVGViBPYnNlcnZhdGlvbiIKZGVmaW5lICJFRlYgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRUZWIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRUZWIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRUZWIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRUZWICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTM3IC0gRVRWCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVHJlYXRlZCB3aXRoIGV0cmF2aXJpbmUgKEVUVikKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkVUViI6CiAgZXhpc3RzICJFVFYgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJFVFYgT2JzZXJ2YXRpb24iCmRlZmluZSAiRVRWIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkVUViBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkVUViBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkVUViBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEVUViAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTEzOCAtIE5WUApAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRyZWF0ZWQgd2l0aCBuZXZpcmFwaW5lIChOVlApCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJOVlAiOgogIGV4aXN0cyAiTlZQIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTlZQIE9ic2VydmF0aW9uIgpkZWZpbmUgIk5WUCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJOVlAgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJOVlAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJOVlAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBOVlAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxMzkgLSBSSUwKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUcmVhdGVkIHdpdGggcmlscGl2aXJpbmUgKFJJTCkKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlJJTCI6CiAgZXhpc3RzICJSSUwgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJSSUwgT2JzZXJ2YXRpb24iCmRlZmluZSAiUklMIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJJTCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlJJTCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlJJTCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJJTCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTE0MCAtIEFUVi9yCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVHJlYXRlZCB3aXRoIGF0YXphbmF2aXIvcml0b25hdmlyIChBVFYvcikKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFUVi9yIEQuREUxNDAiOgogIGV4aXN0cyAiQVRWL3IgRC5ERTE0MCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFUVi9yIEQuREUxNDAgT2JzZXJ2YXRpb24iCmRlZmluZSAiQVRWL3IgRC5ERTE0MCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBVFYvciBELkRFMTQwIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQVRWL3IgRC5ERTE0MCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFUVi9yIEQuREUxNDAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBVFYvciBELkRFMTQwICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTQxIC0gTFBWL3IKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUcmVhdGVkIHdpdGggbG9waW5hdmlyL3JpdG9uYXZpciAoTFBWL3IpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJMUFYvciBELkRFMTQxIjoKICBleGlzdHMgIkxQVi9yIEQuREUxNDEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJMUFYvciBELkRFMTQxIE9ic2VydmF0aW9uIgpkZWZpbmUgIkxQVi9yIEQuREUxNDEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTFBWL3IgRC5ERTE0MSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkxQVi9yIEQuREUxNDEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJMUFYvciBELkRFMTQxIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTFBWL3IgRC5ERTE0MSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTE0MiAtIERSVi9yCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVHJlYXRlZCB3aXRoIGRhcnVuYXZpci9yaXRvbmF2aXIgKERSVi9yKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRFJWL3IgRC5ERTE0MiI6CiAgZXhpc3RzICJEUlYvciBELkRFMTQyIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRFJWL3IgRC5ERTE0MiBPYnNlcnZhdGlvbiIKZGVmaW5lICJEUlYvciBELkRFMTQyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkRSVi9yIEQuREUxNDIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEUlYvciBELkRFMTQyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRFJWL3IgRC5ERTE0MiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIERSVi9yIEQuREUxNDIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxNDMgLSBSVFYKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUcmVhdGVkIHdpdGggcml0b25hdmlyIChSVFYpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSVFYiOgogIGV4aXN0cyAiUlRWIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUlRWIE9ic2VydmF0aW9uIgpkZWZpbmUgIlJUViBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJSVFYgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSVFYgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSVFYgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBSVFYgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxNDQgLSBEVEcKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUcmVhdGVkIHdpdGggZG9sdXRlZ3JhdmlyIChEVEcpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJEVEcgRC5ERTE0NCI6CiAgZXhpc3RzICJEVEcgRC5ERTE0NCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkRURyBELkRFMTQ0IE9ic2VydmF0aW9uIgpkZWZpbmUgIkRURyBELkRFMTQ0IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkRURyBELkRFMTQ0IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRFRHIEQuREUxNDQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJEVEcgRC5ERTE0NCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIERURyBELkRFMTQ0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTQ1IC0gUkFMCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVHJlYXRlZCB3aXRoIHJhbHRlZ3JhdmlyIChSQUwpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSQUwgRC5ERTE0NSI6CiAgZXhpc3RzICJSQUwgRC5ERTE0NSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlJBTCBELkRFMTQ1IE9ic2VydmF0aW9uIgpkZWZpbmUgIlJBTCBELkRFMTQ1IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJBTCBELkRFMTQ1IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUkFMIEQuREUxNDUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSQUwgRC5ERTE0NSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJBTCBELkRFMTQ1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTUyIC0gUHJldmVudGlvbiBzZXJ2aWNlcyBvZmZlcmVkIGFuZCByZWZlcnJhbHMKQGFjdGl2aXR5OiBISVYuRDEyIERldGVybWluZSByZWNvbW1lbmRlZCBzY3JlZW5pbmdzIGFuZCB0ZXN0cwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBwcmV2ZW50aW9uIHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQcmV2ZW50aW9uIHNlcnZpY2VzIG9mZmVyZWQgYW5kIHJlZmVycmFscyBELkRFMTUyIjoKICBleGlzdHMgIlByZXZlbnRpb24gc2VydmljZXMgb2ZmZXJlZCBhbmQgcmVmZXJyYWxzIEQuREUxNTIgT2JzZXJ2YXRpb24iCmRlZmluZSAiUHJldmVudGlvbiBzZXJ2aWNlcyBvZmZlcmVkIGFuZCByZWZlcnJhbHMgRC5ERTE1MiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlByZXZlbnRpb24gc2VydmljZXMgb2ZmZXJlZCBhbmQgcmVmZXJyYWxzIEQuREUxNTIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQcmV2ZW50aW9uIHNlcnZpY2VzIG9mZmVyZWQgYW5kIHJlZmVycmFscyBELkRFMTUyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTUzIC0gT2ZmZXIgbWFsZSBhbmQgZmVtYWxlIGNvbmRvbXMgYW5kIGNvbmRvbS1jb21wYXRpYmxlIGx1YnJpY2FudHMKQGFjdGl2aXR5OiBISVYuRDI2IE9mZmVyIHNleHVhbCBhbmQgcmVwcm9kdWN0aXZlIGhlYWx0aCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG1hbGUgYW5kIGZlbWFsZSBjb25kb21zIGFuZCBjb25kb20tY29tcGF0aWJsZSBsdWJyaWNhbnRzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJPZmZlciBtYWxlIGFuZCBmZW1hbGUgY29uZG9tcyBhbmQgY29uZG9tLWNvbXBhdGlibGUgbHVicmljYW50cyBELkRFMTUzIjoKICBleGlzdHMgIk9mZmVyIG1hbGUgYW5kIGZlbWFsZSBjb25kb21zIGFuZCBjb25kb20tY29tcGF0aWJsZSBsdWJyaWNhbnRzIEQuREUxNTMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJPZmZlciBtYWxlIGFuZCBmZW1hbGUgY29uZG9tcyBhbmQgY29uZG9tLWNvbXBhdGlibGUgbHVicmljYW50cyBELkRFMTUzIE9ic2VydmF0aW9uIgpkZWZpbmUgIk9mZmVyIG1hbGUgYW5kIGZlbWFsZSBjb25kb21zIGFuZCBjb25kb20tY29tcGF0aWJsZSBsdWJyaWNhbnRzIEQuREUxNTMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iT2ZmZXIgbWFsZSBhbmQgZmVtYWxlIGNvbmRvbXMgYW5kIGNvbmRvbS1jb21wYXRpYmxlIGx1YnJpY2FudHMgRC5ERTE1MyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk9mZmVyIG1hbGUgYW5kIGZlbWFsZSBjb25kb21zIGFuZCBjb25kb20tY29tcGF0aWJsZSBsdWJyaWNhbnRzIEQuREUxNTMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJPZmZlciBtYWxlIGFuZCBmZW1hbGUgY29uZG9tcyBhbmQgY29uZG9tLWNvbXBhdGlibGUgbHVicmljYW50cyBELkRFMTUzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT2ZmZXIgbWFsZSBhbmQgZmVtYWxlIGNvbmRvbXMgYW5kIGNvbmRvbS1jb21wYXRpYmxlIGx1YnJpY2FudHMgRC5ERTE1MyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTE1NCAtIEhhcm0gcmVkdWN0aW9uIGZvciBwZW9wbGUgd2hvIGluamVjdCBkcnVncwpAYWN0aXZpdHk6IEhJVi5EMTIgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNjcmVlbmluZ3MgYW5kIHRlc3RzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgcGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MgdG8gaGFybSByZWR1Y3Rpb24gc2VydmljZXMgKG5lZWRsZSBhbmQgc3lyaW5nZSBwcm9ncmFtbWVzLCBvcGlvaWQgc3Vic3RpdHV0aW9uIHRoZXJhcHksIG90aGVyIGRydWctZGVwZW5kZW5jZSB0cmVhdG1lbnQgYW5kIG9waW9pZCBvdmVyZG9zZSBwcmV2ZW50aW9uIGFuZCBtYW5hZ2VtZW50KQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSGFybSByZWR1Y3Rpb24gZm9yIHBlb3BsZSB3aG8gaW5qZWN0IGRydWdzIEQuREUxNTQiOgogIGV4aXN0cyAiSGFybSByZWR1Y3Rpb24gZm9yIHBlb3BsZSB3aG8gaW5qZWN0IGRydWdzIEQuREUxNTQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJIYXJtIHJlZHVjdGlvbiBmb3IgcGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MgRC5ERTE1NCBPYnNlcnZhdGlvbiIKZGVmaW5lICJIYXJtIHJlZHVjdGlvbiBmb3IgcGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MgRC5ERTE1NCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJIYXJtIHJlZHVjdGlvbiBmb3IgcGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MgRC5ERTE1NCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkhhcm0gcmVkdWN0aW9uIGZvciBwZW9wbGUgd2hvIGluamVjdCBkcnVncyBELkRFMTU0IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSGFybSByZWR1Y3Rpb24gZm9yIHBlb3BsZSB3aG8gaW5qZWN0IGRydWdzIEQuREUxNTQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBIYXJtIHJlZHVjdGlvbiBmb3IgcGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MgRC5ERTE1NCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTE1NSAtIEJlaGF2aW91cmFsIGludGVydmVudGlvbnMgdG8gc3VwcG9ydCByaXNrIHJlZHVjdGlvbgpAYWN0aXZpdHk6IEhJVi5EMTIgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNjcmVlbmluZ3MgYW5kIHRlc3RzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgdG8gc2VydmljZXMgZm9yIGJlaGF2aW91cmFsIGludGVydmVudGlvbnMgdG8gc3VwcG9ydCByaXNrIHJlZHVjdGlvbiwgcGFydGljdWxhcmx5IGZvciBwZW9wbGUgd2l0aCBISVYgYW5kIG1lbWJlcnMgb2Yga2V5IHBvcHVsYXRpb25zCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJCZWhhdmlvdXJhbCBpbnRlcnZlbnRpb25zIHRvIHN1cHBvcnQgcmlzayByZWR1Y3Rpb24gRC5ERTE1NSI6CiAgZXhpc3RzICJCZWhhdmlvdXJhbCBpbnRlcnZlbnRpb25zIHRvIHN1cHBvcnQgcmlzayByZWR1Y3Rpb24gRC5ERTE1NSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkJlaGF2aW91cmFsIGludGVydmVudGlvbnMgdG8gc3VwcG9ydCByaXNrIHJlZHVjdGlvbiBELkRFMTU1IE9ic2VydmF0aW9uIgpkZWZpbmUgIkJlaGF2aW91cmFsIGludGVydmVudGlvbnMgdG8gc3VwcG9ydCByaXNrIHJlZHVjdGlvbiBELkRFMTU1IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkJlaGF2aW91cmFsIGludGVydmVudGlvbnMgdG8gc3VwcG9ydCByaXNrIHJlZHVjdGlvbiBELkRFMTU1IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQmVoYXZpb3VyYWwgaW50ZXJ2ZW50aW9ucyB0byBzdXBwb3J0IHJpc2sgcmVkdWN0aW9uIEQuREUxNTUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJCZWhhdmlvdXJhbCBpbnRlcnZlbnRpb25zIHRvIHN1cHBvcnQgcmlzayByZWR1Y3Rpb24gRC5ERTE1NSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEJlaGF2aW91cmFsIGludGVydmVudGlvbnMgdG8gc3VwcG9ydCByaXNrIHJlZHVjdGlvbiBELkRFMTU1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTU2IC0gU2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIGludGVncmF0ZWQgc2VydmljZXMKQGFjdGl2aXR5OiBISVYuRDEyIERldGVybWluZSByZWNvbW1lbmRlZCBzY3JlZW5pbmdzIGFuZCB0ZXN0cwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIHRvIHNleHVhbCBhbmQgcmVwcm9kdWN0aXZlIGhlYWx0aCBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIGludGVncmF0ZWQgc2VydmljZXMgRC5ERTE1NiI6CiAgZXhpc3RzICJTZXh1YWwgYW5kIHJlcHJvZHVjdGl2ZSBoZWFsdGggaW50ZWdyYXRlZCBzZXJ2aWNlcyBELkRFMTU2IE9ic2VydmF0aW9uIgpkZWZpbmUgIlNleHVhbCBhbmQgcmVwcm9kdWN0aXZlIGhlYWx0aCBpbnRlZ3JhdGVkIHNlcnZpY2VzIEQuREUxNTYgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTZXh1YWwgYW5kIHJlcHJvZHVjdGl2ZSBoZWFsdGggaW50ZWdyYXRlZCBzZXJ2aWNlcyBELkRFMTU2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIGludGVncmF0ZWQgc2VydmljZXMgRC5ERTE1NiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTE1NyAtIENvbnRyYWNlcHRpb24gYW5kIGZhbWlseSBwbGFubmluZwpAYWN0aXZpdHk6IEhJVi5EMTIgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNjcmVlbmluZ3MgYW5kIHRlc3RzCkBkZXNjcmlwdGlvbjogT2ZmZXIgY29udHJhY2VwdGlvbiBhbmQgZmFtaWx5IHBsYW5uaW5nIHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDb250cmFjZXB0aW9uIGFuZCBmYW1pbHkgcGxhbm5pbmcgRC5ERTE1NyI6CiAgZXhpc3RzICJDb250cmFjZXB0aW9uIGFuZCBmYW1pbHkgcGxhbm5pbmcgRC5ERTE1NyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkNvbnRyYWNlcHRpb24gYW5kIGZhbWlseSBwbGFubmluZyBELkRFMTU3IE9ic2VydmF0aW9uIgpkZWZpbmUgIkNvbnRyYWNlcHRpb24gYW5kIGZhbWlseSBwbGFubmluZyBELkRFMTU3IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNvbnRyYWNlcHRpb24gYW5kIGZhbWlseSBwbGFubmluZyBELkRFMTU3IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ29udHJhY2VwdGlvbiBhbmQgZmFtaWx5IHBsYW5uaW5nIEQuREUxNTcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDb250cmFjZXB0aW9uIGFuZCBmYW1pbHkgcGxhbm5pbmcgRC5ERTE1NyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENvbnRyYWNlcHRpb24gYW5kIGZhbWlseSBwbGFubmluZyBELkRFMTU3ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTU4IC0gQ2hlY2sgcHJlZ25hbmN5IHN0YXR1cwpAYWN0aXZpdHk6IEhJVi5EMTIgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNjcmVlbmluZ3MgYW5kIHRlc3RzCkBkZXNjcmlwdGlvbjogQ2hlY2sgd29tYW4ncyBwcmVnbmFuY3kgc3RhdHVzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEQuREUxNTgiOgogIGV4aXN0cyAiQ2hlY2sgcHJlZ25hbmN5IHN0YXR1cyBELkRFMTU4IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ2hlY2sgcHJlZ25hbmN5IHN0YXR1cyBELkRFMTU4IE9ic2VydmF0aW9uIgpkZWZpbmUgIkNoZWNrIHByZWduYW5jeSBzdGF0dXMgRC5ERTE1OCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEQuREUxNTggQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEQuREUxNTggT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEQuREUxNTggT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDaGVjayBwcmVnbmFuY3kgc3RhdHVzIEQuREUxNTggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxNTkgLSBQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24KQGFjdGl2aXR5OiBISVYuRDEyIERldGVybWluZSByZWNvbW1lbmRlZCBzY3JlZW5pbmdzIGFuZCB0ZXN0cwpAZGVzY3JpcHRpb246IE9mZmVyIHByZXZlbnRpb24gb2YgbW90aGVyLXRvLWNoaWxkIHRyYW5zbWlzc2lvbiBzZXJ2aWNlcyAoY291bnNlbGxpbmcpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24iOgogIGV4aXN0cyAiUHJldmVudGlvbiBvZiBtb3RoZXItdG8tY2hpbGQgdHJhbnNtaXNzaW9uIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUHJldmVudGlvbiBvZiBtb3RoZXItdG8tY2hpbGQgdHJhbnNtaXNzaW9uIE9ic2VydmF0aW9uIgpkZWZpbmUgIlByZXZlbnRpb24gb2YgbW90aGVyLXRvLWNoaWxkIHRyYW5zbWlzc2lvbiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24gT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24gT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQcmV2ZW50aW9uIG9mIG1vdGhlci10by1jaGlsZCB0cmFuc21pc3Npb24gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxNjAgLSBTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50CkBhY3Rpdml0eTogSElWLkQxMiBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2NyZWVuaW5ncyBhbmQgdGVzdHMKQGRlc2NyaXB0aW9uOiBPZmZlciBTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IEQuREUxNjAiOgogIGV4aXN0cyAiU1RJIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBELkRFMTYwIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU1RJIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBELkRFMTYwIE9ic2VydmF0aW9uIgpkZWZpbmUgIlNUSSB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQgRC5ERTE2MCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IEQuREUxNjAgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IEQuREUxNjAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IEQuREUxNjAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTVEkgdGVzdGluZyBhbmQgdHJlYXRtZW50IEQuREUxNjAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxNjIgLSBIQnNBZyB0ZXN0IHJlc3VsdApAYWN0aXZpdHk6IEhJVi5EMTIgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNjcmVlbmluZ3MgYW5kIHRlc3RzCkBkZXNjcmlwdGlvbjogSGVwYXRpdGlzIEIgdmlydXMgdGVzdCByZXN1bHQgKEhCc0FnKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSEJzQWcgdGVzdCByZXN1bHQgRC5ERTE2MiI6CiAgZXhpc3RzICJIQnNBZyB0ZXN0IHJlc3VsdCBELkRFMTYyIE9ic2VydmF0aW9uIgpkZWZpbmUgIkhCc0FnIHRlc3QgcmVzdWx0IEQuREUxNjIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJIQnNBZyB0ZXN0IHJlc3VsdCBELkRFMTYyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSEJzQWcgdGVzdCByZXN1bHQgRC5ERTE2MiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTE2MyAtIFBvc2l0aXZlCkBhY3Rpdml0eTogSElWLkQxMiBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2NyZWVuaW5ncyBhbmQgdGVzdHMKQGRlc2NyaXB0aW9uOiBIQnNBZyB0ZXN0IHJlc3VsdCB3YXMgcG9zaXRpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBvc2l0aXZlIEQuREUxNjMiOgogIGV4aXN0cyAiUG9zaXRpdmUgRC5ERTE2MyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlBvc2l0aXZlIEQuREUxNjMgT2JzZXJ2YXRpb24iCmRlZmluZSAiUG9zaXRpdmUgRC5ERTE2MyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQb3NpdGl2ZSBELkRFMTYzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUG9zaXRpdmUgRC5ERTE2MyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBvc2l0aXZlIEQuREUxNjMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQb3NpdGl2ZSBELkRFMTYzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTY0IC0gTmVnYXRpdmUKQGFjdGl2aXR5OiBISVYuRDEyIERldGVybWluZSByZWNvbW1lbmRlZCBzY3JlZW5pbmdzIGFuZCB0ZXN0cwpAZGVzY3JpcHRpb246IEhCc0FnIHRlc3QgcmVzdWx0IHdhcyBuZWdhdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTmVnYXRpdmUgRC5ERTE2NCI6CiAgZXhpc3RzICJOZWdhdGl2ZSBELkRFMTY0IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTmVnYXRpdmUgRC5ERTE2NCBPYnNlcnZhdGlvbiIKZGVmaW5lICJOZWdhdGl2ZSBELkRFMTY0IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk5lZ2F0aXZlIEQuREUxNjQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJOZWdhdGl2ZSBELkRFMTY0IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTmVnYXRpdmUgRC5ERTE2NCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5lZ2F0aXZlIEQuREUxNjQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxNjUgLSBJbmRldGVybWluYXRlCkBhY3Rpdml0eTogSElWLkQxMiBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2NyZWVuaW5ncyBhbmQgdGVzdHMKQGRlc2NyaXB0aW9uOiBIQnNBZyB0ZXN0IHJlc3VsdCB3YXMgaW5kZXRlcm1pbmF0ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW5kZXRlcm1pbmF0ZSBELkRFMTY1IjoKICBleGlzdHMgIkluZGV0ZXJtaW5hdGUgRC5ERTE2NSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkluZGV0ZXJtaW5hdGUgRC5ERTE2NSBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbmRldGVybWluYXRlIEQuREUxNjUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW5kZXRlcm1pbmF0ZSBELkRFMTY1IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSW5kZXRlcm1pbmF0ZSBELkRFMTY1IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW5kZXRlcm1pbmF0ZSBELkRFMTY1IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW5kZXRlcm1pbmF0ZSBELkRFMTY1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTcwIC0gSENWIHRlc3QgcmVzdWx0CkBhY3Rpdml0eTogSElWLkQxMiBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2NyZWVuaW5ncyBhbmQgdGVzdHMKQGRlc2NyaXB0aW9uOiBIZXBhdGl0aXMgQyB2aXJ1cyB0ZXN0IHJlc3VsdCAoSENWIGFudGlib2R5LCBIQ1YgUk5BIG9yIEhDViBjb3JlIGFudGlnZW4pCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJIQ1YgdGVzdCByZXN1bHQgRC5ERTE3MCI6CiAgZXhpc3RzICJIQ1YgdGVzdCByZXN1bHQgRC5ERTE3MCBPYnNlcnZhdGlvbiIKZGVmaW5lICJIQ1YgdGVzdCByZXN1bHQgRC5ERTE3MCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhDViB0ZXN0IHJlc3VsdCBELkRFMTcwIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSENWIHRlc3QgcmVzdWx0IEQuREUxNzAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxNzEgLSBQb3NpdGl2ZQpAYWN0aXZpdHk6IEhJVi5EMTIgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNjcmVlbmluZ3MgYW5kIHRlc3RzCkBkZXNjcmlwdGlvbjogSENWIHRlc3QgcmVzdWx0IHdhcyBwb3NpdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUG9zaXRpdmUgRC5ERTE3MSI6CiAgZXhpc3RzICJQb3NpdGl2ZSBELkRFMTcxIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUG9zaXRpdmUgRC5ERTE3MSBPYnNlcnZhdGlvbiIKZGVmaW5lICJQb3NpdGl2ZSBELkRFMTcxIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlBvc2l0aXZlIEQuREUxNzEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQb3NpdGl2ZSBELkRFMTcxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUG9zaXRpdmUgRC5ERTE3MSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFBvc2l0aXZlIEQuREUxNzEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxNzIgLSBOZWdhdGl2ZQpAYWN0aXZpdHk6IEhJVi5EMTIgRGV0ZXJtaW5lIHJlY29tbWVuZGVkIHNjcmVlbmluZ3MgYW5kIHRlc3RzCkBkZXNjcmlwdGlvbjogSENWIHRlc3QgcmVzdWx0IHdhcyBuZWdhdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTmVnYXRpdmUgRC5ERTE3MiI6CiAgZXhpc3RzICJOZWdhdGl2ZSBELkRFMTcyIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTmVnYXRpdmUgRC5ERTE3MiBPYnNlcnZhdGlvbiIKZGVmaW5lICJOZWdhdGl2ZSBELkRFMTcyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk5lZ2F0aXZlIEQuREUxNzIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJOZWdhdGl2ZSBELkRFMTcyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTmVnYXRpdmUgRC5ERTE3MiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5lZ2F0aXZlIEQuREUxNzIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxNzMgLSBJbmRldGVybWluYXRlCkBhY3Rpdml0eTogSElWLkQxMiBEZXRlcm1pbmUgcmVjb21tZW5kZWQgc2NyZWVuaW5ncyBhbmQgdGVzdHMKQGRlc2NyaXB0aW9uOiBIQ1YgdGVzdCByZXN1bHQgd2FzIGluZGV0ZXJtaW5hdGUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkluZGV0ZXJtaW5hdGUgRC5ERTE3MyI6CiAgZXhpc3RzICJJbmRldGVybWluYXRlIEQuREUxNzMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJJbmRldGVybWluYXRlIEQuREUxNzMgT2JzZXJ2YXRpb24iCmRlZmluZSAiSW5kZXRlcm1pbmF0ZSBELkRFMTczIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkluZGV0ZXJtaW5hdGUgRC5ERTE3MyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkluZGV0ZXJtaW5hdGUgRC5ERTE3MyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkluZGV0ZXJtaW5hdGUgRC5ERTE3MyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEluZGV0ZXJtaW5hdGUgRC5ERTE3MyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTE4NiAtIEhJViBjbGluaWNhbCBzdGFnZQpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFdITyBjbGluaWNhbCBzdGFnZSBvZiBjbGllbnQgYmFzZWQgb24gc2lnbnMgYW5kIHN5bXB0b21zLiBXSE8gY2xpbmljYWwgc3RhZ2luZyBpcyBhIHdheSB0byBjYXRlZ29yaXplIEhJViBkaXNlYXNlIHNldmVyaXR5IGJhc2VkIG9uIG5ldyBvciByZWN1cnJlbnQgY2xpbmljYWwgZXZlbnRzLiBUaGVyZSBhcmUgNCBXSE8gY2xpbmljYWwgc3RhZ2VzIHRoYXQgcmFuZ2UgZnJvbSBtaWxkIHN5bXB0b21zIChXSE8gY2xpbmljYWwgc3RhZ2UgMSkgdG8gc2V2ZXJlIHN5bXB0b21zIChXSE8gY2xpbmljYWwgc3RhZ2UgNCkuCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJISVYgY2xpbmljYWwgc3RhZ2UgRC5ERTE4NiI6CiAgZXhpc3RzICJISVYgY2xpbmljYWwgc3RhZ2UgRC5ERTE4NiBPYnNlcnZhdGlvbiIKZGVmaW5lICJISVYgY2xpbmljYWwgc3RhZ2UgRC5ERTE4NiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJViBjbGluaWNhbCBzdGFnZSBELkRFMTg2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSElWIGNsaW5pY2FsIHN0YWdlIEQuREUxODYgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxODcgLSBXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDEKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBDbGllbnQgaXMgY3VycmVudGx5IGFzc2Vzc2VkIHRvIGJlIGF0IGEgY2xpbmljYWwgc3RhZ2UgMSwgYmFzZWQgb24gY2xpbmljYWwgYXNzZXNzbWVudCBhbmQgZGlhZ25vc3RpY3MKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIldITyBISVYgY2xpbmljYWwgc3RhZ2UgMSI6CiAgZXhpc3RzICJXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDEgT2JzZXJ2YXRpb24iCmRlZmluZSAiV0hPIEhJViBjbGluaWNhbCBzdGFnZSAxIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIldITyBISVYgY2xpbmljYWwgc3RhZ2UgMSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIldITyBISVYgY2xpbmljYWwgc3RhZ2UgMSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIldITyBISVYgY2xpbmljYWwgc3RhZ2UgMSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFdITyBISVYgY2xpbmljYWwgc3RhZ2UgMSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTE4OCAtIFdITyBISVYgY2xpbmljYWwgc3RhZ2UgMgpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IENsaWVudCBpcyBjdXJyZW50bHkgYXNzZXNzZWQgdG8gYmUgYXQgYSBjbGluaWNhbCBzdGFnZSAyLCBiYXNlZCBvbiBjbGluaWNhbCBhc3Nlc3NtZW50IGFuZCBkaWFnbm9zdGljcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiV0hPIEhJViBjbGluaWNhbCBzdGFnZSAyIjoKICBleGlzdHMgIldITyBISVYgY2xpbmljYWwgc3RhZ2UgMiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIldITyBISVYgY2xpbmljYWwgc3RhZ2UgMiBPYnNlcnZhdGlvbiIKZGVmaW5lICJXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iV0hPIEhJViBjbGluaWNhbCBzdGFnZSAyIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiV0hPIEhJViBjbGluaWNhbCBzdGFnZSAyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iV0hPIEhJViBjbGluaWNhbCBzdGFnZSAyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgV0hPIEhJViBjbGluaWNhbCBzdGFnZSAyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTg5IC0gV0hPIEhJViBjbGluaWNhbCBzdGFnZSAzCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIGN1cnJlbnRseSBhc3Nlc3NlZCB0byBiZSBhdCBhIGNsaW5pY2FsIHN0YWdlIDMsIGJhc2VkIG9uIGNsaW5pY2FsIGFzc2Vzc21lbnQgYW5kIGRpYWdub3N0aWNzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDMiOgogIGV4aXN0cyAiV0hPIEhJViBjbGluaWNhbCBzdGFnZSAzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiV0hPIEhJViBjbGluaWNhbCBzdGFnZSAzIE9ic2VydmF0aW9uIgpkZWZpbmUgIldITyBISVYgY2xpbmljYWwgc3RhZ2UgMyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxOTAgLSBXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDQKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBDbGllbnQgaXMgY3VycmVudGx5IGFzc2Vzc2VkIHRvIGJlIGF0IGEgY2xpbmljYWwgc3RhZ2UgNCwgYmFzZWQgb24gY2xpbmljYWwgYXNzZXNzbWVudCBhbmQgZGlhZ25vc3RpY3MKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIldITyBISVYgY2xpbmljYWwgc3RhZ2UgNCI6CiAgZXhpc3RzICJXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJXSE8gSElWIGNsaW5pY2FsIHN0YWdlIDQgT2JzZXJ2YXRpb24iCmRlZmluZSAiV0hPIEhJViBjbGluaWNhbCBzdGFnZSA0IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIldITyBISVYgY2xpbmljYWwgc3RhZ2UgNCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIldITyBISVYgY2xpbmljYWwgc3RhZ2UgNCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIldITyBISVYgY2xpbmljYWwgc3RhZ2UgNCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFdITyBISVYgY2xpbmljYWwgc3RhZ2UgNCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTE5NCAtIERhdGUgb2YgdmlyYWwgbG9hZCBzYW1wbGUgY29sbGVjdGlvbgpAYWN0aXZpdHk6IEhJVi5EMTAgQ291bnNlbCByZXR1cm5pbmcgY2xpZW50CkBkZXNjcmlwdGlvbjogRGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBzYW1wbGUgd2FzIGNvbGxlY3RlZCB0byB0ZXN0IHRoZSBjbGllbnQncyBISVYgdmlyYWwgbG9hZAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRGF0ZSBvZiB2aXJhbCBsb2FkIHNhbXBsZSBjb2xsZWN0aW9uIEQuREUxOTQiOgogIEVsZW1lbnRzLiJEYXRlIG9mIHZpcmFsIGxvYWQgc2FtcGxlIGNvbGxlY3Rpb24gRC5ERTE5NCIgUAogICAgd2hlcmUgUC5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgUC5wZXJmb3JtZWQudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIERhdGUgb2YgdmlyYWwgbG9hZCBzYW1wbGUgY29sbGVjdGlvbiBELkRFMTk0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTk1IC0gRGF0ZSBvZiBzY2hlZHVsZWQgcmV2aWV3IG9mIHZpcmFsIGxvYWQgdGVzdCByZXN1bHRzCkBhY3Rpdml0eTogSElWLkQxMCBDb3Vuc2VsIHJldHVybmluZyBjbGllbnQKQGRlc2NyaXB0aW9uOiBFeHBlY3RlZCBkYXRlIHdoZW4gY2xpZW50J3MgdmlyYWwgbG9hZCB0ZXN0IHJlc3VsdHMgd2lsbCBiZSByZXR1cm5lZCBhbmQgcmV2aWV3ZWQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkRhdGUgb2Ygc2NoZWR1bGVkIHJldmlldyBvZiB2aXJhbCBsb2FkIHRlc3QgcmVzdWx0cyI6CiAgRWxlbWVudHMuIkRhdGUgb2Ygc2NoZWR1bGVkIHJldmlldyBvZiB2aXJhbCBsb2FkIHRlc3QgcmVzdWx0cyIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEYXRlIG9mIHNjaGVkdWxlZCByZXZpZXcgb2YgdmlyYWwgbG9hZCB0ZXN0IHJlc3VsdHMgVmFsdWUiOgogICJEYXRlIG9mIHNjaGVkdWxlZCByZXZpZXcgb2YgdmlyYWwgbG9hZCB0ZXN0IHJlc3VsdHMiIE8KICByZXR1cm4gTy52YWx1ZQovKiBFbmQgb2YgRGF0ZSBvZiBzY2hlZHVsZWQgcmV2aWV3IG9mIHZpcmFsIGxvYWQgdGVzdCByZXN1bHRzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMjI1IC0gVHJlYXRtZW50IGZhaWx1cmUKQGFjdGl2aXR5OiBISVYuRDE3IENoZWNrIGZvciBzaWducyBvZiB0cmVhdG1lbnQgZmFpbHVyZQpAZGVzY3JpcHRpb246IEFSVCB0cmVhdG1lbnQgZmFpbHVyZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVHJlYXRtZW50IGZhaWx1cmUiOgogIGV4aXN0cyAiVHJlYXRtZW50IGZhaWx1cmUgT2JzZXJ2YXRpb24iCmRlZmluZSAiVHJlYXRtZW50IGZhaWx1cmUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUcmVhdG1lbnQgZmFpbHVyZSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFRyZWF0bWVudCBmYWlsdXJlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMjI2IC0gQ2xpbmljYWwgZmFpbHVyZQpAYWN0aXZpdHk6IEhJVi5EMTcgQ2hlY2sgZm9yIHNpZ25zIG9mIHRyZWF0bWVudCBmYWlsdXJlCkBkZXNjcmlwdGlvbjogTmV3IG9yIHJlY3VycmVudCBjbGluaWNhbCBldmVudCBpbmRpY2F0aW5nIHNldmVyZSBpbW11bm9kZWZpY2llbmN5IGluIGFkdWx0cyBvciBhZHZhbmNlZCBvciBzZXZlcmUgaW1tdW5vZGVmaWNpZW5jeSBpbiBjaGlsZHJlbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ2xpbmljYWwgZmFpbHVyZSI6CiAgZXhpc3RzICJDbGluaWNhbCBmYWlsdXJlIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ2xpbmljYWwgZmFpbHVyZSBPYnNlcnZhdGlvbiIKZGVmaW5lICJDbGluaWNhbCBmYWlsdXJlIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNsaW5pY2FsIGZhaWx1cmUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDbGluaWNhbCBmYWlsdXJlIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ2xpbmljYWwgZmFpbHVyZSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENsaW5pY2FsIGZhaWx1cmUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyMjcgLSBJbW11bm9sb2dpY2FsIGZhaWx1cmUKQGFjdGl2aXR5OiBISVYuRDE3IENoZWNrIGZvciBzaWducyBvZiB0cmVhdG1lbnQgZmFpbHVyZQpAZGVzY3JpcHRpb246IENENCBjb3VudCBhdCBvciBiZWxvdyAyNTAgY2VsbHMvbW0zIGZvbGxvd2luZyBjbGluaWNhbCBmYWlsdXJlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJJbW11bm9sb2dpY2FsIGZhaWx1cmUiOgogIGV4aXN0cyAiSW1tdW5vbG9naWNhbCBmYWlsdXJlIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSW1tdW5vbG9naWNhbCBmYWlsdXJlIE9ic2VydmF0aW9uIgpkZWZpbmUgIkltbXVub2xvZ2ljYWwgZmFpbHVyZSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJJbW11bm9sb2dpY2FsIGZhaWx1cmUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJJbW11bm9sb2dpY2FsIGZhaWx1cmUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJJbW11bm9sb2dpY2FsIGZhaWx1cmUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBJbW11bm9sb2dpY2FsIGZhaWx1cmUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyMjggLSBWaXJvbG9naWNhbCBmYWlsdXJlCkBhY3Rpdml0eTogSElWLkQxNyBDaGVjayBmb3Igc2lnbnMgb2YgdHJlYXRtZW50IGZhaWx1cmUKQGRlc2NyaXB0aW9uOiBUaGUgaW5hYmlsaXR5IHRvIGFjaGlldmUgb3IgbWFpbnRhaW4gdmlyYWwgc3VwcHJlc3Npb24gYmVsb3cgYSBjZXJ0YWluIHRocmVzaG9sZCBpbmRpY2F0ZWQgYnkgdmlyYWwgbG9hZCBhYm92ZSAxMDAwIGNvcGllcy9tTCBiYXNlZCBvbiB0d28gY29uc2VjdXRpdmUgdmlyYWwgbG9hZCBtZWFzdXJlbWVudHMgaW4gMyBtb250aHMsIHdpdGggYWRoZXJlbmNlIHN1cHBvcnQgZm9sbG93aW5nIHRoZSBmaXJzdCB2aXJhbCBsb2FkIHRlc3QKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlZpcm9sb2dpY2FsIGZhaWx1cmUiOgogIGV4aXN0cyAiVmlyb2xvZ2ljYWwgZmFpbHVyZSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlZpcm9sb2dpY2FsIGZhaWx1cmUgT2JzZXJ2YXRpb24iCmRlZmluZSAiVmlyb2xvZ2ljYWwgZmFpbHVyZSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJWaXJvbG9naWNhbCBmYWlsdXJlIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVmlyb2xvZ2ljYWwgZmFpbHVyZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlZpcm9sb2dpY2FsIGZhaWx1cmUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBWaXJvbG9naWNhbCBmYWlsdXJlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMjU5IC0gUmlzayBmYWN0b3JzLCBjb21vcmJpZGl0aWVzIGFuZCBjb2luZmVjdGlvbnMgc2lnbnMgYW5kIHN5bXB0b21zCkBhY3Rpdml0eTogSElWLkQxNCBQcmV2ZW50LCBzY3JlZW4sIGFuZCBtYW5hZ2UgY29tb3JiaWRpdGllcyBhbmQgY29pbmZlY3Rpb25zCkBkZXNjcmlwdGlvbjogU2lnbnMgYW5kIHN5bXB0b21zIG9mIG9wcG9ydHVuaXN0aWMgaW5mZWN0aW9ucyBvciBvdGhlciBjb21vcmJpZGl0aWVzIGV4cGVyaWVuY2VkIGJ5IGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmlzayBmYWN0b3JzLCBjb21vcmJpZGl0aWVzIGFuZCBjb2luZmVjdGlvbnMgc2lnbnMgYW5kIHN5bXB0b21zIjoKICBleGlzdHMgIlJpc2sgZmFjdG9ycywgY29tb3JiaWRpdGllcyBhbmQgY29pbmZlY3Rpb25zIHNpZ25zIGFuZCBzeW1wdG9tcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJSaXNrIGZhY3RvcnMsIGNvbW9yYmlkaXRpZXMgYW5kIGNvaW5mZWN0aW9ucyBzaWducyBhbmQgc3ltcHRvbXMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSaXNrIGZhY3RvcnMsIGNvbW9yYmlkaXRpZXMgYW5kIGNvaW5mZWN0aW9ucyBzaWducyBhbmQgc3ltcHRvbXMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBSaXNrIGZhY3RvcnMsIGNvbW9yYmlkaXRpZXMgYW5kIGNvaW5mZWN0aW9ucyBzaWducyBhbmQgc3ltcHRvbXMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyODIgLSBQcmVzdW1wdGl2ZSBUQgpAYWN0aXZpdHk6IEhJVi5EMTQgUHJldmVudCwgc2NyZWVuLCBhbmQgbWFuYWdlIGNvbW9yYmlkaXRpZXMgYW5kIGNvaW5mZWN0aW9ucwpAZGVzY3JpcHRpb246IENsaWVudCdzIGNvbW9yYmlkaXRpZXMgb3IgY29pbmZlY3Rpb25zIG9yIHN5bXB0b21zIG9mIHRoZXNlIGluY2x1ZGUgcHJlc3VtcHRpdmUgVEIKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlByZXN1bXB0aXZlIFRCIEQuREUyODIiOgogIGV4aXN0cyAiUHJlc3VtcHRpdmUgVEIgRC5ERTI4MiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlByZXN1bXB0aXZlIFRCIEQuREUyODIgT2JzZXJ2YXRpb24iCmRlZmluZSAiUHJlc3VtcHRpdmUgVEIgRC5ERTI4MiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQcmVzdW1wdGl2ZSBUQiBELkRFMjgyIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUHJlc3VtcHRpdmUgVEIgRC5ERTI4MiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlByZXN1bXB0aXZlIFRCIEQuREUyODIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQcmVzdW1wdGl2ZSBUQiBELkRFMjgyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMjg5IC0gV0hPIEhJViBjbGluaWNhbCBzdGFnZSBjb25kaXRpb24gb3Igc3ltcHRvbQpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IE5ldyBvciByZWN1cnJlbnQgY2xpbmljYWwgZXZlbnRzIHVzZWQgdG8gY2F0ZWdvcml6ZSBISVYgZGlzZWFzZSBzZXZlcml0eSBiYXNlZCBhdCBiYXNlbGluZSBhbmQgZm9sbG93IHVwCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJXSE8gSElWIGNsaW5pY2FsIHN0YWdlIGNvbmRpdGlvbiBvciBzeW1wdG9tIEQuREUyODkiOgogIGV4aXN0cyAiV0hPIEhJViBjbGluaWNhbCBzdGFnZSBjb25kaXRpb24gb3Igc3ltcHRvbSBELkRFMjg5IE9ic2VydmF0aW9uIgpkZWZpbmUgIldITyBISVYgY2xpbmljYWwgc3RhZ2UgY29uZGl0aW9uIG9yIHN5bXB0b20gRC5ERTI4OSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIldITyBISVYgY2xpbmljYWwgc3RhZ2UgY29uZGl0aW9uIG9yIHN5bXB0b20gRC5ERTI4OSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFdITyBISVYgY2xpbmljYWwgc3RhZ2UgY29uZGl0aW9uIG9yIHN5bXB0b20gRC5ERTI4OSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTI5MCAtIEFzeW1wdG9tYXRpYwpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IE5vIEhJVi1yZWxhdGVkIHN5bXB0b21zIHJlcG9ydGVkIGFuZCBubyBjbGluaWNhbCBzaWducyBvbiBleGFtaW5hdGlvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQXN5bXB0b21hdGljIjoKICBleGlzdHMgIkFzeW1wdG9tYXRpYyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFzeW1wdG9tYXRpYyBPYnNlcnZhdGlvbiIKZGVmaW5lICJBc3ltcHRvbWF0aWMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQXN5bXB0b21hdGljIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQXN5bXB0b21hdGljIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQXN5bXB0b21hdGljIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQXN5bXB0b21hdGljICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMjkxIC0gUGVyc2lzdGVudCBnZW5lcmFsaXplZCBseW1waGFkZW5vcGF0aHkKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBQZXJzaXN0ZW50IGVubGFyZ2VkIGx5bXBoIG5vZGVzID4xIGNtIGF0IHR3byBvciBtb3JlIG5vbi1jb250aWd1b3VzIHNpdGVzIChleGNsdWRpbmcgaW5ndWluYWwpIHdpdGhvdXQga25vd24gY2F1c2UKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBlcnNpc3RlbnQgZ2VuZXJhbGl6ZWQgbHltcGhhZGVub3BhdGh5IjoKICBleGlzdHMgIlBlcnNpc3RlbnQgZ2VuZXJhbGl6ZWQgbHltcGhhZGVub3BhdGh5IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUGVyc2lzdGVudCBnZW5lcmFsaXplZCBseW1waGFkZW5vcGF0aHkgT2JzZXJ2YXRpb24iCmRlZmluZSAiUGVyc2lzdGVudCBnZW5lcmFsaXplZCBseW1waGFkZW5vcGF0aHkgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUGVyc2lzdGVudCBnZW5lcmFsaXplZCBseW1waGFkZW5vcGF0aHkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQZXJzaXN0ZW50IGdlbmVyYWxpemVkIGx5bXBoYWRlbm9wYXRoeSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBlcnNpc3RlbnQgZ2VuZXJhbGl6ZWQgbHltcGhhZGVub3BhdGh5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUGVyc2lzdGVudCBnZW5lcmFsaXplZCBseW1waGFkZW5vcGF0aHkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyOTIgLSBNb2RlcmF0ZSB1bmV4cGxhaW5lZCB3ZWlnaHQgbG9zcwpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IE1vZGVyYXRlIHVuZXhwbGFpbmVkIHdlaWdodCBsb3NzICg8MTAlIG9mIHByZXN1bWVkIG9yIG1lYXN1cmVkIGJvZHkgd2VpZ2h0KQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTW9kZXJhdGUgdW5leHBsYWluZWQgd2VpZ2h0IGxvc3MiOgogIGV4aXN0cyAiTW9kZXJhdGUgdW5leHBsYWluZWQgd2VpZ2h0IGxvc3MgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJNb2RlcmF0ZSB1bmV4cGxhaW5lZCB3ZWlnaHQgbG9zcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJNb2RlcmF0ZSB1bmV4cGxhaW5lZCB3ZWlnaHQgbG9zcyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJNb2RlcmF0ZSB1bmV4cGxhaW5lZCB3ZWlnaHQgbG9zcyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk1vZGVyYXRlIHVuZXhwbGFpbmVkIHdlaWdodCBsb3NzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTW9kZXJhdGUgdW5leHBsYWluZWQgd2VpZ2h0IGxvc3MgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBNb2RlcmF0ZSB1bmV4cGxhaW5lZCB3ZWlnaHQgbG9zcyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTI5MyAtIFJlY3VycmVudCByZXNwaXJhdG9yeSB0cmFjdCBpbmZlY3Rpb25zCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSByZWN1cnJlbnQgcmVzcGlyYXRvcnkgdHJhY3QgaW5mZWN0aW9ucyBpbmNsdWRpbmcgc2ludXNpdGlzLCB0b25zaWxsaXRpcywgb3RpdGlzIG1lZGlhIG9yIHBoYXJ5bmdpdGlzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSZWN1cnJlbnQgcmVzcGlyYXRvcnkgdHJhY3QgaW5mZWN0aW9ucyI6CiAgZXhpc3RzICJSZWN1cnJlbnQgcmVzcGlyYXRvcnkgdHJhY3QgaW5mZWN0aW9ucyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlJlY3VycmVudCByZXNwaXJhdG9yeSB0cmFjdCBpbmZlY3Rpb25zIE9ic2VydmF0aW9uIgpkZWZpbmUgIlJlY3VycmVudCByZXNwaXJhdG9yeSB0cmFjdCBpbmZlY3Rpb25zIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJlY3VycmVudCByZXNwaXJhdG9yeSB0cmFjdCBpbmZlY3Rpb25zIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUmVjdXJyZW50IHJlc3BpcmF0b3J5IHRyYWN0IGluZmVjdGlvbnMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSZWN1cnJlbnQgcmVzcGlyYXRvcnkgdHJhY3QgaW5mZWN0aW9ucyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJlY3VycmVudCByZXNwaXJhdG9yeSB0cmFjdCBpbmZlY3Rpb25zICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMjk0IC0gVW5leHBsYWluZWQgcGVyc2lzdGVudCBoZXBhdG9zcGxlbm9tZWdhbHkKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIHVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgaGVwYXRvc3BsZW5vbWVnYWx5CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJVbmV4cGxhaW5lZCBwZXJzaXN0ZW50IGhlcGF0b3NwbGVub21lZ2FseSI6CiAgZXhpc3RzICJVbmV4cGxhaW5lZCBwZXJzaXN0ZW50IGhlcGF0b3NwbGVub21lZ2FseSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgaGVwYXRvc3BsZW5vbWVnYWx5IE9ic2VydmF0aW9uIgpkZWZpbmUgIlVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgaGVwYXRvc3BsZW5vbWVnYWx5IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgaGVwYXRvc3BsZW5vbWVnYWx5IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVW5leHBsYWluZWQgcGVyc2lzdGVudCBoZXBhdG9zcGxlbm9tZWdhbHkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJVbmV4cGxhaW5lZCBwZXJzaXN0ZW50IGhlcGF0b3NwbGVub21lZ2FseSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgaGVwYXRvc3BsZW5vbWVnYWx5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMjk1IC0gSGVycGVzIHpvc3RlcgpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgaGVycGVzIHpvc3RlcgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSGVycGVzIHpvc3RlciI6CiAgZXhpc3RzICJIZXJwZXMgem9zdGVyIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSGVycGVzIHpvc3RlciBPYnNlcnZhdGlvbiIKZGVmaW5lICJIZXJwZXMgem9zdGVyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhlcnBlcyB6b3N0ZXIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJIZXJwZXMgem9zdGVyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSGVycGVzIHpvc3RlciBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhlcnBlcyB6b3N0ZXIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyOTYgLSBBbmd1bGFyIGNoZWlsaXRpcwpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgYW5ndWxhciBjaGVpbGl0aXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFuZ3VsYXIgY2hlaWxpdGlzIjoKICBleGlzdHMgIkFuZ3VsYXIgY2hlaWxpdGlzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQW5ndWxhciBjaGVpbGl0aXMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQW5ndWxhciBjaGVpbGl0aXMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQW5ndWxhciBjaGVpbGl0aXMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBbmd1bGFyIGNoZWlsaXRpcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFuZ3VsYXIgY2hlaWxpdGlzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQW5ndWxhciBjaGVpbGl0aXMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyOTcgLSBMaW5lYXIgZ2luZ2l2YWwgZXJ5dGhlbWEKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGxpbmVhciBnaW5naXZhbCBlcnl0aGVtYQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTGluZWFyIGdpbmdpdmFsIGVyeXRoZW1hIjoKICBleGlzdHMgIkxpbmVhciBnaW5naXZhbCBlcnl0aGVtYSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkxpbmVhciBnaW5naXZhbCBlcnl0aGVtYSBPYnNlcnZhdGlvbiIKZGVmaW5lICJMaW5lYXIgZ2luZ2l2YWwgZXJ5dGhlbWEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTGluZWFyIGdpbmdpdmFsIGVyeXRoZW1hIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTGluZWFyIGdpbmdpdmFsIGVyeXRoZW1hIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTGluZWFyIGdpbmdpdmFsIGVyeXRoZW1hIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTGluZWFyIGdpbmdpdmFsIGVyeXRoZW1hICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMjk4IC0gUmVjdXJyZW50IG9yYWwgdWxjZXJhdGlvbgpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgcmVjdXJyZW50IG9yYWwgdWxjZXJhdGlvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmVjdXJyZW50IG9yYWwgdWxjZXJhdGlvbiI6CiAgZXhpc3RzICJSZWN1cnJlbnQgb3JhbCB1bGNlcmF0aW9uIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmVjdXJyZW50IG9yYWwgdWxjZXJhdGlvbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJSZWN1cnJlbnQgb3JhbCB1bGNlcmF0aW9uIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJlY3VycmVudCBvcmFsIHVsY2VyYXRpb24gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSZWN1cnJlbnQgb3JhbCB1bGNlcmF0aW9uIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmVjdXJyZW50IG9yYWwgdWxjZXJhdGlvbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJlY3VycmVudCBvcmFsIHVsY2VyYXRpb24gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUyOTkgLSBQYXB1bGFyIHBydXJpdGljIGVydXB0aW9uCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBwYXB1bGFyIHBydXJpdGljIGVydXB0aW9uCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQYXB1bGFyIHBydXJpdGljIGVydXB0aW9uIjoKICBleGlzdHMgIlBhcHVsYXIgcHJ1cml0aWMgZXJ1cHRpb24gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQYXB1bGFyIHBydXJpdGljIGVydXB0aW9uIE9ic2VydmF0aW9uIgpkZWZpbmUgIlBhcHVsYXIgcHJ1cml0aWMgZXJ1cHRpb24gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUGFwdWxhciBwcnVyaXRpYyBlcnVwdGlvbiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlBhcHVsYXIgcHJ1cml0aWMgZXJ1cHRpb24gT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQYXB1bGFyIHBydXJpdGljIGVydXB0aW9uIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUGFwdWxhciBwcnVyaXRpYyBlcnVwdGlvbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMwMCAtIEZ1bmdhbCBuYWlsIGluZmVjdGlvbnMKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGZ1bmdhbCBuYWlsIGluZmVjdGlvbnMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkZ1bmdhbCBuYWlsIGluZmVjdGlvbnMiOgogIGV4aXN0cyAiRnVuZ2FsIG5haWwgaW5mZWN0aW9ucyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkZ1bmdhbCBuYWlsIGluZmVjdGlvbnMgT2JzZXJ2YXRpb24iCmRlZmluZSAiRnVuZ2FsIG5haWwgaW5mZWN0aW9ucyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJGdW5nYWwgbmFpbCBpbmZlY3Rpb25zIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRnVuZ2FsIG5haWwgaW5mZWN0aW9ucyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkZ1bmdhbCBuYWlsIGluZmVjdGlvbnMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBGdW5nYWwgbmFpbCBpbmZlY3Rpb25zICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzAxIC0gU2Vib3JyaG9laWMgZGVybWF0aXRpcwpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgc2Vib3JyaG9laWMgZGVybWF0aXRpcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2Vib3JyaG9laWMgZGVybWF0aXRpcyI6CiAgZXhpc3RzICJTZWJvcnJob2VpYyBkZXJtYXRpdGlzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU2Vib3JyaG9laWMgZGVybWF0aXRpcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJTZWJvcnJob2VpYyBkZXJtYXRpdGlzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNlYm9ycmhvZWljIGRlcm1hdGl0aXMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTZWJvcnJob2VpYyBkZXJtYXRpdGlzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU2Vib3JyaG9laWMgZGVybWF0aXRpcyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNlYm9ycmhvZWljIGRlcm1hdGl0aXMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMDIgLSBFeHRlbnNpdmUgd2FydCB2aXJ1cyBpbmZlY3Rpb24KQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGV4dGVuc2l2ZSB3YXJ0IHZpcnVzIGluZmVjdGlvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRXh0ZW5zaXZlIHdhcnQgdmlydXMgaW5mZWN0aW9uIjoKICBleGlzdHMgIkV4dGVuc2l2ZSB3YXJ0IHZpcnVzIGluZmVjdGlvbiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkV4dGVuc2l2ZSB3YXJ0IHZpcnVzIGluZmVjdGlvbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJFeHRlbnNpdmUgd2FydCB2aXJ1cyBpbmZlY3Rpb24gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRXh0ZW5zaXZlIHdhcnQgdmlydXMgaW5mZWN0aW9uIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRXh0ZW5zaXZlIHdhcnQgdmlydXMgaW5mZWN0aW9uIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRXh0ZW5zaXZlIHdhcnQgdmlydXMgaW5mZWN0aW9uIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRXh0ZW5zaXZlIHdhcnQgdmlydXMgaW5mZWN0aW9uICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzAzIC0gRXh0ZW5zaXZlIG1vbGx1c2N1bSBjb250YWdpb3N1bQpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgZXh0ZW5zaXZlIG1vbGx1c2N1bSBjb250YWdpb3N1bQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRXh0ZW5zaXZlIG1vbGx1c2N1bSBjb250YWdpb3N1bSI6CiAgZXhpc3RzICJFeHRlbnNpdmUgbW9sbHVzY3VtIGNvbnRhZ2lvc3VtIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRXh0ZW5zaXZlIG1vbGx1c2N1bSBjb250YWdpb3N1bSBPYnNlcnZhdGlvbiIKZGVmaW5lICJFeHRlbnNpdmUgbW9sbHVzY3VtIGNvbnRhZ2lvc3VtIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkV4dGVuc2l2ZSBtb2xsdXNjdW0gY29udGFnaW9zdW0gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJFeHRlbnNpdmUgbW9sbHVzY3VtIGNvbnRhZ2lvc3VtIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRXh0ZW5zaXZlIG1vbGx1c2N1bSBjb250YWdpb3N1bSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEV4dGVuc2l2ZSBtb2xsdXNjdW0gY29udGFnaW9zdW0gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMDQgLSBVbmV4cGxhaW5lZCBwZXJzaXN0ZW50IHBhcm90aWQgZW5sYXJnZW1lbnQKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIHVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgcGFyb3RpZCBlbmxhcmdlbWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVW5leHBsYWluZWQgcGVyc2lzdGVudCBwYXJvdGlkIGVubGFyZ2VtZW50IjoKICBleGlzdHMgIlVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgcGFyb3RpZCBlbmxhcmdlbWVudCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgcGFyb3RpZCBlbmxhcmdlbWVudCBPYnNlcnZhdGlvbiIKZGVmaW5lICJVbmV4cGxhaW5lZCBwZXJzaXN0ZW50IHBhcm90aWQgZW5sYXJnZW1lbnQgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVW5leHBsYWluZWQgcGVyc2lzdGVudCBwYXJvdGlkIGVubGFyZ2VtZW50IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVW5leHBsYWluZWQgcGVyc2lzdGVudCBwYXJvdGlkIGVubGFyZ2VtZW50IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVW5leHBsYWluZWQgcGVyc2lzdGVudCBwYXJvdGlkIGVubGFyZ2VtZW50IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVW5leHBsYWluZWQgcGVyc2lzdGVudCBwYXJvdGlkIGVubGFyZ2VtZW50ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzA1IC0gVW5leHBsYWluZWQgc2V2ZXJlIHdlaWdodCBsb3NzIGluIGFkdWx0cwpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IFVuZXhwbGFpbmVkIHNldmVyZSB3ZWlnaHQgbG9zcyAoPjEwJSBvZiBwcmVzdW1lZCBvciBtZWFzdXJlZCBib2R5IHdlaWdodCkKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlVuZXhwbGFpbmVkIHNldmVyZSB3ZWlnaHQgbG9zcyBpbiBhZHVsdHMiOgogIGV4aXN0cyAiVW5leHBsYWluZWQgc2V2ZXJlIHdlaWdodCBsb3NzIGluIGFkdWx0cyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlVuZXhwbGFpbmVkIHNldmVyZSB3ZWlnaHQgbG9zcyBpbiBhZHVsdHMgT2JzZXJ2YXRpb24iCmRlZmluZSAiVW5leHBsYWluZWQgc2V2ZXJlIHdlaWdodCBsb3NzIGluIGFkdWx0cyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJVbmV4cGxhaW5lZCBzZXZlcmUgd2VpZ2h0IGxvc3MgaW4gYWR1bHRzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVW5leHBsYWluZWQgc2V2ZXJlIHdlaWdodCBsb3NzIGluIGFkdWx0cyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlVuZXhwbGFpbmVkIHNldmVyZSB3ZWlnaHQgbG9zcyBpbiBhZHVsdHMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBVbmV4cGxhaW5lZCBzZXZlcmUgd2VpZ2h0IGxvc3MgaW4gYWR1bHRzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzA2IC0gVW5leHBsYWluZWQgbW9kZXJhdGUgbWFsbnV0cml0aW9uIG5vdCBhZGVxdWF0ZWx5IHJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgdGhlcmFweQpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IERlZmluZWQgYXMgd2VpZ2h0LWZvci1oZWlnaHQgPCAtIDIgei1zY29yZSBvciBtaWQtdXBwZXIgYXJtIGNpcmN1bWZlcmVuY2UgMTE1IG1tIHRvIDwxMjUgbW0uIEZvciBjaGlsZHJlbiB5b3VuZ2VyIHRoYW4gZml2ZSB5ZWFycyBvZiBhZ2U6IHN0dW50aW5nIGlzIGRlZmluZWQgYXMgc2V2ZXJlIGFjdXRlIG1hbG51dHJpdGlvbiAtIGVpdGhlciB3ZWlnaHQgZm9yIGhlaWdodCA8IC0zIHotc2NvcmUgb3IgbWlkLXVwcGVyIGFybSBjaXJjdW1mZXJlbmNlIDwxMTUgbW0gb3IgdGhlIHByZXNlbmNlIG9mIG9lZGVtYS4KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlVuZXhwbGFpbmVkIG1vZGVyYXRlIG1hbG51dHJpdGlvbiBub3QgYWRlcXVhdGVseSByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkiOgogIGV4aXN0cyAiVW5leHBsYWluZWQgbW9kZXJhdGUgbWFsbnV0cml0aW9uIG5vdCBhZGVxdWF0ZWx5IHJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgdGhlcmFweSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlVuZXhwbGFpbmVkIG1vZGVyYXRlIG1hbG51dHJpdGlvbiBub3QgYWRlcXVhdGVseSByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkgT2JzZXJ2YXRpb24iCmRlZmluZSAiVW5leHBsYWluZWQgbW9kZXJhdGUgbWFsbnV0cml0aW9uIG5vdCBhZGVxdWF0ZWx5IHJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgdGhlcmFweSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJVbmV4cGxhaW5lZCBtb2RlcmF0ZSBtYWxudXRyaXRpb24gbm90IGFkZXF1YXRlbHkgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVW5leHBsYWluZWQgbW9kZXJhdGUgbWFsbnV0cml0aW9uIG5vdCBhZGVxdWF0ZWx5IHJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgdGhlcmFweSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlVuZXhwbGFpbmVkIG1vZGVyYXRlIG1hbG51dHJpdGlvbiBub3QgYWRlcXVhdGVseSByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBVbmV4cGxhaW5lZCBtb2RlcmF0ZSBtYWxudXRyaXRpb24gbm90IGFkZXF1YXRlbHkgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzA3IC0gVW5leHBsYWluZWQgY2hyb25pYyBkaWFycmhvZWEgZm9yIGxvbmdlciB0aGFuIDEgbW9udGgKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIHVuZXhwbGFpbmVkIGNocm9uaWMgZGlhcnJob2VhIGZvciBsb25nZXIgdGhhbiAxIG1vbnRoCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJVbmV4cGxhaW5lZCBjaHJvbmljIGRpYXJyaG9lYSBmb3IgbG9uZ2VyIHRoYW4gMSBtb250aCI6CiAgZXhpc3RzICJVbmV4cGxhaW5lZCBjaHJvbmljIGRpYXJyaG9lYSBmb3IgbG9uZ2VyIHRoYW4gMSBtb250aCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlVuZXhwbGFpbmVkIGNocm9uaWMgZGlhcnJob2VhIGZvciBsb25nZXIgdGhhbiAxIG1vbnRoIE9ic2VydmF0aW9uIgpkZWZpbmUgIlVuZXhwbGFpbmVkIGNocm9uaWMgZGlhcnJob2VhIGZvciBsb25nZXIgdGhhbiAxIG1vbnRoIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlVuZXhwbGFpbmVkIGNocm9uaWMgZGlhcnJob2VhIGZvciBsb25nZXIgdGhhbiAxIG1vbnRoIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVW5leHBsYWluZWQgY2hyb25pYyBkaWFycmhvZWEgZm9yIGxvbmdlciB0aGFuIDEgbW9udGggT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJVbmV4cGxhaW5lZCBjaHJvbmljIGRpYXJyaG9lYSBmb3IgbG9uZ2VyIHRoYW4gMSBtb250aCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFVuZXhwbGFpbmVkIGNocm9uaWMgZGlhcnJob2VhIGZvciBsb25nZXIgdGhhbiAxIG1vbnRoICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzA4IC0gVW5leHBsYWluZWQgcGVyc2lzdGVudCBkaWFycmhvZWEgMTQgZGF5cyBvciBtb3JlCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSB1bmV4cGxhaW5lZCBwZXJzaXN0ZW50IGRpYXJyaG9lYSAoMTQgZGF5cyBvciBtb3JlKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVW5leHBsYWluZWQgcGVyc2lzdGVudCBkaWFycmhvZWEgMTQgZGF5cyBvciBtb3JlIjoKICBleGlzdHMgIlVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgZGlhcnJob2VhIDE0IGRheXMgb3IgbW9yZSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgZGlhcnJob2VhIDE0IGRheXMgb3IgbW9yZSBPYnNlcnZhdGlvbiIKZGVmaW5lICJVbmV4cGxhaW5lZCBwZXJzaXN0ZW50IGRpYXJyaG9lYSAxNCBkYXlzIG9yIG1vcmUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVW5leHBsYWluZWQgcGVyc2lzdGVudCBkaWFycmhvZWEgMTQgZGF5cyBvciBtb3JlIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVW5leHBsYWluZWQgcGVyc2lzdGVudCBkaWFycmhvZWEgMTQgZGF5cyBvciBtb3JlIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVW5leHBsYWluZWQgcGVyc2lzdGVudCBkaWFycmhvZWEgMTQgZGF5cyBvciBtb3JlIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVW5leHBsYWluZWQgcGVyc2lzdGVudCBkaWFycmhvZWEgMTQgZGF5cyBvciBtb3JlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzA5IC0gVW5leHBsYWluZWQgcGVyc2lzdGVudCBmZXZlciBhYm92ZSAzNy41IEMsIGludGVybWl0dGVudCBvciBjb25zdGFudCwgZm9yIGxvbmdlciB0aGFuIG9uZSAxIG1vbnRoCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSB1bmV4cGxhaW5lZCBwZXJzaXN0ZW50IGZldmVyIChhYm92ZSAzNy41IEMsIGludGVybWl0dGVudCBvciBjb25zdGFudCwgZm9yIGxvbmdlciB0aGFuIG9uZSAxIG1vbnRoKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVW5leHBsYWluZWQgcGVyc2lzdGVudCBmZXZlciBhYm92ZSAzNy41IEMsIGludGVybWl0dGVudCBvciBjb25zdGFudCwgZm9yIGxvbmdlciB0aGFuIG9uZSAxIG1vbnRoIjoKICBleGlzdHMgIlVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgZmV2ZXIgYWJvdmUgMzcuNSBDLCBpbnRlcm1pdHRlbnQgb3IgY29uc3RhbnQsIGZvciBsb25nZXIgdGhhbiBvbmUgMSBtb250aCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlVuZXhwbGFpbmVkIHBlcnNpc3RlbnQgZmV2ZXIgYWJvdmUgMzcuNSBDLCBpbnRlcm1pdHRlbnQgb3IgY29uc3RhbnQsIGZvciBsb25nZXIgdGhhbiBvbmUgMSBtb250aCBPYnNlcnZhdGlvbiIKZGVmaW5lICJVbmV4cGxhaW5lZCBwZXJzaXN0ZW50IGZldmVyIGFib3ZlIDM3LjUgQywgaW50ZXJtaXR0ZW50IG9yIGNvbnN0YW50LCBmb3IgbG9uZ2VyIHRoYW4gb25lIDEgbW9udGggQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVW5leHBsYWluZWQgcGVyc2lzdGVudCBmZXZlciBhYm92ZSAzNy41IEMsIGludGVybWl0dGVudCBvciBjb25zdGFudCwgZm9yIGxvbmdlciB0aGFuIG9uZSAxIG1vbnRoIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVW5leHBsYWluZWQgcGVyc2lzdGVudCBmZXZlciBhYm92ZSAzNy41IEMsIGludGVybWl0dGVudCBvciBjb25zdGFudCwgZm9yIGxvbmdlciB0aGFuIG9uZSAxIG1vbnRoIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVW5leHBsYWluZWQgcGVyc2lzdGVudCBmZXZlciBhYm92ZSAzNy41IEMsIGludGVybWl0dGVudCBvciBjb25zdGFudCwgZm9yIGxvbmdlciB0aGFuIG9uZSAxIG1vbnRoIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVW5leHBsYWluZWQgcGVyc2lzdGVudCBmZXZlciBhYm92ZSAzNy41IEMsIGludGVybWl0dGVudCBvciBjb25zdGFudCwgZm9yIGxvbmdlciB0aGFuIG9uZSAxIG1vbnRoICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzEwIC0gUGVyc2lzdGVudCBvcmFsIGNhbmRpZGlhc2lzCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBwZXJzaXN0ZW50IG9yYWwgY2FuZGlkaWFzaXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBlcnNpc3RlbnQgb3JhbCBjYW5kaWRpYXNpcyI6CiAgZXhpc3RzICJQZXJzaXN0ZW50IG9yYWwgY2FuZGlkaWFzaXMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQZXJzaXN0ZW50IG9yYWwgY2FuZGlkaWFzaXMgT2JzZXJ2YXRpb24iCmRlZmluZSAiUGVyc2lzdGVudCBvcmFsIGNhbmRpZGlhc2lzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlBlcnNpc3RlbnQgb3JhbCBjYW5kaWRpYXNpcyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlBlcnNpc3RlbnQgb3JhbCBjYW5kaWRpYXNpcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBlcnNpc3RlbnQgb3JhbCBjYW5kaWRpYXNpcyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFBlcnNpc3RlbnQgb3JhbCBjYW5kaWRpYXNpcyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMxMSAtIE9yYWwgaGFpcnkgbGV1a29wbGFraWEKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQgaGFzIGZpbmUgd2hpdGUgc21hbGwgbGluZWFyIG9yIGNvcnJ1Z2F0ZWQgbGVzaW9ucyBvbiBsYXRlcmFsIGJvcmRlcnMgb2YgdGhlIHRvbmd1ZSB0aGF0IGRvIG5vdCBzY3JhcGUgb2ZmCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJPcmFsIGhhaXJ5IGxldWtvcGxha2lhIjoKICBleGlzdHMgIk9yYWwgaGFpcnkgbGV1a29wbGFraWEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJPcmFsIGhhaXJ5IGxldWtvcGxha2lhIE9ic2VydmF0aW9uIgpkZWZpbmUgIk9yYWwgaGFpcnkgbGV1a29wbGFraWEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iT3JhbCBoYWlyeSBsZXVrb3BsYWtpYSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk9yYWwgaGFpcnkgbGV1a29wbGFraWEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJPcmFsIGhhaXJ5IGxldWtvcGxha2lhIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT3JhbCBoYWlyeSBsZXVrb3BsYWtpYSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMxMiAtIFB1bG1vbmFyeSBUQgpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgcHVsbW9uYXJ5IFRCCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQdWxtb25hcnkgVEIgRC5ERTMxMiI6CiAgZXhpc3RzICJQdWxtb25hcnkgVEIgRC5ERTMxMiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlB1bG1vbmFyeSBUQiBELkRFMzEyIE9ic2VydmF0aW9uIgpkZWZpbmUgIlB1bG1vbmFyeSBUQiBELkRFMzEyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlB1bG1vbmFyeSBUQiBELkRFMzEyIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUHVsbW9uYXJ5IFRCIEQuREUzMTIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQdWxtb25hcnkgVEIgRC5ERTMxMiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFB1bG1vbmFyeSBUQiBELkRFMzEyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzEzIC0gTHltcGggbm9kZSBUQgpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgbHltcGggbm9kZSBUQgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTHltcGggbm9kZSBUQiBELkRFMzEzIjoKICBleGlzdHMgIkx5bXBoIG5vZGUgVEIgRC5ERTMxMyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkx5bXBoIG5vZGUgVEIgRC5ERTMxMyBPYnNlcnZhdGlvbiIKZGVmaW5lICJMeW1waCBub2RlIFRCIEQuREUzMTMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTHltcGggbm9kZSBUQiBELkRFMzEzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTHltcGggbm9kZSBUQiBELkRFMzEzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTHltcGggbm9kZSBUQiBELkRFMzEzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTHltcGggbm9kZSBUQiBELkRFMzEzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzE0IC0gU2V2ZXJlIGJhY3RlcmlhbCBpbmZlY3Rpb25zIHN1Y2ggYXMgcG5ldW1vbmlhLCBlbXB5ZW1hLCBweW9teW9zaXRpcywgYm9uZSBvciBqb2ludCBpbmZlY3Rpb24sIG1lbmluZ2l0aXMsIGJhY3RlcmFlbWlhCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBzZXZlcmUgYmFjdGVyaWFsIGluZmVjdGlvbnMgKHN1Y2ggYXMgcG5ldW1vbmlhLCBlbXB5ZW1hLCBweW9teW9zaXRpcywgYm9uZSBvciBqb2ludCBpbmZlY3Rpb24sIG1lbmluZ2l0aXMsIGJhY3RlcmFlbWlhKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2V2ZXJlIGJhY3RlcmlhbCBpbmZlY3Rpb25zIHN1Y2ggYXMgcG5ldW1vbmlhLCBlbXB5ZW1hLCBweW9teW9zaXRpcywgYm9uZSBvciBqb2ludCBpbmZlY3Rpb24sIG1lbmluZ2l0aXMsIGJhY3RlcmFlbWlhIjoKICBleGlzdHMgIlNldmVyZSBiYWN0ZXJpYWwgaW5mZWN0aW9ucyBzdWNoIGFzIHBuZXVtb25pYSwgZW1weWVtYSwgcHlvbXlvc2l0aXMsIGJvbmUgb3Igam9pbnQgaW5mZWN0aW9uLCBtZW5pbmdpdGlzLCBiYWN0ZXJhZW1pYSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlNldmVyZSBiYWN0ZXJpYWwgaW5mZWN0aW9ucyBzdWNoIGFzIHBuZXVtb25pYSwgZW1weWVtYSwgcHlvbXlvc2l0aXMsIGJvbmUgb3Igam9pbnQgaW5mZWN0aW9uLCBtZW5pbmdpdGlzLCBiYWN0ZXJhZW1pYSBPYnNlcnZhdGlvbiIKZGVmaW5lICJTZXZlcmUgYmFjdGVyaWFsIGluZmVjdGlvbnMgc3VjaCBhcyBwbmV1bW9uaWEsIGVtcHllbWEsIHB5b215b3NpdGlzLCBib25lIG9yIGpvaW50IGluZmVjdGlvbiwgbWVuaW5naXRpcywgYmFjdGVyYWVtaWEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iU2V2ZXJlIGJhY3RlcmlhbCBpbmZlY3Rpb25zIHN1Y2ggYXMgcG5ldW1vbmlhLCBlbXB5ZW1hLCBweW9teW9zaXRpcywgYm9uZSBvciBqb2ludCBpbmZlY3Rpb24sIG1lbmluZ2l0aXMsIGJhY3RlcmFlbWlhIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU2V2ZXJlIGJhY3RlcmlhbCBpbmZlY3Rpb25zIHN1Y2ggYXMgcG5ldW1vbmlhLCBlbXB5ZW1hLCBweW9teW9zaXRpcywgYm9uZSBvciBqb2ludCBpbmZlY3Rpb24sIG1lbmluZ2l0aXMsIGJhY3RlcmFlbWlhIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU2V2ZXJlIGJhY3RlcmlhbCBpbmZlY3Rpb25zIHN1Y2ggYXMgcG5ldW1vbmlhLCBlbXB5ZW1hLCBweW9teW9zaXRpcywgYm9uZSBvciBqb2ludCBpbmZlY3Rpb24sIG1lbmluZ2l0aXMsIGJhY3RlcmFlbWlhIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU2V2ZXJlIGJhY3RlcmlhbCBpbmZlY3Rpb25zIHN1Y2ggYXMgcG5ldW1vbmlhLCBlbXB5ZW1hLCBweW9teW9zaXRpcywgYm9uZSBvciBqb2ludCBpbmZlY3Rpb24sIG1lbmluZ2l0aXMsIGJhY3RlcmFlbWlhICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzE1IC0gU2V2ZXJlIHJlY3VycmVudCBiYWN0ZXJpYWwgcG5ldW1vbmlhCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBzZXZlcmUgcmVjdXJyZW50IGJhY3RlcmlhbCBwbmV1bW9uaWEKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlNldmVyZSByZWN1cnJlbnQgYmFjdGVyaWFsIHBuZXVtb25pYSI6CiAgZXhpc3RzICJTZXZlcmUgcmVjdXJyZW50IGJhY3RlcmlhbCBwbmV1bW9uaWEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJTZXZlcmUgcmVjdXJyZW50IGJhY3RlcmlhbCBwbmV1bW9uaWEgT2JzZXJ2YXRpb24iCmRlZmluZSAiU2V2ZXJlIHJlY3VycmVudCBiYWN0ZXJpYWwgcG5ldW1vbmlhIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNldmVyZSByZWN1cnJlbnQgYmFjdGVyaWFsIHBuZXVtb25pYSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlNldmVyZSByZWN1cnJlbnQgYmFjdGVyaWFsIHBuZXVtb25pYSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNldmVyZSByZWN1cnJlbnQgYmFjdGVyaWFsIHBuZXVtb25pYSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNldmVyZSByZWN1cnJlbnQgYmFjdGVyaWFsIHBuZXVtb25pYSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMxNiAtIEFjdXRlIG5lY3JvdGl6aW5nIHVsY2VyYXRpdmUgc3RvbWF0aXRpcwpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgYWN1dGUgbmVjcm90aXppbmcgdWxjZXJhdGl2ZSBzdG9tYXRpdGlzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBY3V0ZSBuZWNyb3RpemluZyB1bGNlcmF0aXZlIHN0b21hdGl0aXMiOgogIGV4aXN0cyAiQWN1dGUgbmVjcm90aXppbmcgdWxjZXJhdGl2ZSBzdG9tYXRpdGlzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQWN1dGUgbmVjcm90aXppbmcgdWxjZXJhdGl2ZSBzdG9tYXRpdGlzIE9ic2VydmF0aW9uIgpkZWZpbmUgIkFjdXRlIG5lY3JvdGl6aW5nIHVsY2VyYXRpdmUgc3RvbWF0aXRpcyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBY3V0ZSBuZWNyb3RpemluZyB1bGNlcmF0aXZlIHN0b21hdGl0aXMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBY3V0ZSBuZWNyb3RpemluZyB1bGNlcmF0aXZlIHN0b21hdGl0aXMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBY3V0ZSBuZWNyb3RpemluZyB1bGNlcmF0aXZlIHN0b21hdGl0aXMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBY3V0ZSBuZWNyb3RpemluZyB1bGNlcmF0aXZlIHN0b21hdGl0aXMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMTcgLSBBY3V0ZSBuZWNyb3RpemluZyB1bGNlcmF0aXZlIGdpbmdpdml0aXMKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGFjdXRlIG5lY3JvdGl6aW5nIHVsY2VyYXRpdmUgZ2luZ2l2aXRpcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQWN1dGUgbmVjcm90aXppbmcgdWxjZXJhdGl2ZSBnaW5naXZpdGlzIjoKICBleGlzdHMgIkFjdXRlIG5lY3JvdGl6aW5nIHVsY2VyYXRpdmUgZ2luZ2l2aXRpcyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFjdXRlIG5lY3JvdGl6aW5nIHVsY2VyYXRpdmUgZ2luZ2l2aXRpcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJBY3V0ZSBuZWNyb3RpemluZyB1bGNlcmF0aXZlIGdpbmdpdml0aXMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQWN1dGUgbmVjcm90aXppbmcgdWxjZXJhdGl2ZSBnaW5naXZpdGlzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQWN1dGUgbmVjcm90aXppbmcgdWxjZXJhdGl2ZSBnaW5naXZpdGlzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQWN1dGUgbmVjcm90aXppbmcgdWxjZXJhdGl2ZSBnaW5naXZpdGlzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQWN1dGUgbmVjcm90aXppbmcgdWxjZXJhdGl2ZSBnaW5naXZpdGlzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzE4IC0gQWN1dGUgbmVjcm90aXppbmcgdWxjZXJhdGl2ZSBwZXJpb2RvbnRpdGlzCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBhY3V0ZSBuZWNyb3RpemluZyB1bGNlcmF0aXZlIHBlcmlvZG9udGl0aXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFjdXRlIG5lY3JvdGl6aW5nIHVsY2VyYXRpdmUgcGVyaW9kb250aXRpcyI6CiAgZXhpc3RzICJBY3V0ZSBuZWNyb3RpemluZyB1bGNlcmF0aXZlIHBlcmlvZG9udGl0aXMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBY3V0ZSBuZWNyb3RpemluZyB1bGNlcmF0aXZlIHBlcmlvZG9udGl0aXMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQWN1dGUgbmVjcm90aXppbmcgdWxjZXJhdGl2ZSBwZXJpb2RvbnRpdGlzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFjdXRlIG5lY3JvdGl6aW5nIHVsY2VyYXRpdmUgcGVyaW9kb250aXRpcyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFjdXRlIG5lY3JvdGl6aW5nIHVsY2VyYXRpdmUgcGVyaW9kb250aXRpcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFjdXRlIG5lY3JvdGl6aW5nIHVsY2VyYXRpdmUgcGVyaW9kb250aXRpcyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFjdXRlIG5lY3JvdGl6aW5nIHVsY2VyYXRpdmUgcGVyaW9kb250aXRpcyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMxOSAtIFVuZXhwbGFpbmVkIGFuYWVtaWEgPDggZy9kTApAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgdW5leHBsYWluZWQgYW5hZW1pYSAoPDggZy9kTCkKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlVuZXhwbGFpbmVkIGFuYWVtaWEgPDggZy9kTCI6CiAgZXhpc3RzICJVbmV4cGxhaW5lZCBhbmFlbWlhIDw4IGcvZEwgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJVbmV4cGxhaW5lZCBhbmFlbWlhIDw4IGcvZEwgT2JzZXJ2YXRpb24iCmRlZmluZSAiVW5leHBsYWluZWQgYW5hZW1pYSA8OCBnL2RMIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlVuZXhwbGFpbmVkIGFuYWVtaWEgPDggZy9kTCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlVuZXhwbGFpbmVkIGFuYWVtaWEgPDggZy9kTCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlVuZXhwbGFpbmVkIGFuYWVtaWEgPDggZy9kTCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFVuZXhwbGFpbmVkIGFuYWVtaWEgPDggZy9kTCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMyMCAtIE5ldXRyb3BhZW5pYSA8MC41IHggMTBeOS9MCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBuZXV0cm9wYWVuaWEgKDwwLjUgeCAxMF45L0wpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJOZXV0cm9wYWVuaWEgPDAuNSB4IDEwXjkvTCI6CiAgZXhpc3RzICJOZXV0cm9wYWVuaWEgPDAuNSB4IDEwXjkvTCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk5ldXRyb3BhZW5pYSA8MC41IHggMTBeOS9MIE9ic2VydmF0aW9uIgpkZWZpbmUgIk5ldXRyb3BhZW5pYSA8MC41IHggMTBeOS9MIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk5ldXRyb3BhZW5pYSA8MC41IHggMTBeOS9MIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTmV1dHJvcGFlbmlhIDwwLjUgeCAxMF45L0wgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJOZXV0cm9wYWVuaWEgPDAuNSB4IDEwXjkvTCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5ldXRyb3BhZW5pYSA8MC41IHggMTBeOS9MICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzIxIC0gQ2hyb25pYyB0aHJvbWJvY3l0b3BhZW5pYSA8NTAgeCAxMF45L0wKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGNocm9uaWMgdGhyb21ib2N5dG9wYWVuaWEgKDw1MCB4IDEwXjkvTCkKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNocm9uaWMgdGhyb21ib2N5dG9wYWVuaWEgPDUwIHggMTBeOS9MIjoKICBleGlzdHMgIkNocm9uaWMgdGhyb21ib2N5dG9wYWVuaWEgPDUwIHggMTBeOS9MIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ2hyb25pYyB0aHJvbWJvY3l0b3BhZW5pYSA8NTAgeCAxMF45L0wgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ2hyb25pYyB0aHJvbWJvY3l0b3BhZW5pYSA8NTAgeCAxMF45L0wgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ2hyb25pYyB0aHJvbWJvY3l0b3BhZW5pYSA8NTAgeCAxMF45L0wgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDaHJvbmljIHRocm9tYm9jeXRvcGFlbmlhIDw1MCB4IDEwXjkvTCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNocm9uaWMgdGhyb21ib2N5dG9wYWVuaWEgPDUwIHggMTBeOS9MIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ2hyb25pYyB0aHJvbWJvY3l0b3BhZW5pYSA8NTAgeCAxMF45L0wgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMjIgLSBTeW1wdG9tYXRpYyBseW1waG9pZCBpbnRlcnN0aXRpYWwgcG5ldW1vbml0aXMKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIHN5bXB0b21hdGljIGx5bXBob2lkIGludGVyc3RpdGlhbCBwbmV1bW9uaXRpcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU3ltcHRvbWF0aWMgbHltcGhvaWQgaW50ZXJzdGl0aWFsIHBuZXVtb25pdGlzIjoKICBleGlzdHMgIlN5bXB0b21hdGljIGx5bXBob2lkIGludGVyc3RpdGlhbCBwbmV1bW9uaXRpcyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlN5bXB0b21hdGljIGx5bXBob2lkIGludGVyc3RpdGlhbCBwbmV1bW9uaXRpcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJTeW1wdG9tYXRpYyBseW1waG9pZCBpbnRlcnN0aXRpYWwgcG5ldW1vbml0aXMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iU3ltcHRvbWF0aWMgbHltcGhvaWQgaW50ZXJzdGl0aWFsIHBuZXVtb25pdGlzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU3ltcHRvbWF0aWMgbHltcGhvaWQgaW50ZXJzdGl0aWFsIHBuZXVtb25pdGlzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU3ltcHRvbWF0aWMgbHltcGhvaWQgaW50ZXJzdGl0aWFsIHBuZXVtb25pdGlzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU3ltcHRvbWF0aWMgbHltcGhvaWQgaW50ZXJzdGl0aWFsIHBuZXVtb25pdGlzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzIzIC0gQ2hyb25pYyBISVYtYXNzb2NpYXRlZCBsdW5nIGRpc2Vhc2UsIGluY2x1ZGluZyBicm9uY2hpZWN0YXNpcwpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgY2hyb25pYyBISVYtYXNzb2NpYXRlZCBsdW5nIGRpc2Vhc2UsIGluY2x1ZGluZyBicm9uY2hpZWN0YXNpcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ2hyb25pYyBISVYtYXNzb2NpYXRlZCBsdW5nIGRpc2Vhc2UsIGluY2x1ZGluZyBicm9uY2hpZWN0YXNpcyI6CiAgZXhpc3RzICJDaHJvbmljIEhJVi1hc3NvY2lhdGVkIGx1bmcgZGlzZWFzZSwgaW5jbHVkaW5nIGJyb25jaGllY3Rhc2lzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ2hyb25pYyBISVYtYXNzb2NpYXRlZCBsdW5nIGRpc2Vhc2UsIGluY2x1ZGluZyBicm9uY2hpZWN0YXNpcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJDaHJvbmljIEhJVi1hc3NvY2lhdGVkIGx1bmcgZGlzZWFzZSwgaW5jbHVkaW5nIGJyb25jaGllY3Rhc2lzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNocm9uaWMgSElWLWFzc29jaWF0ZWQgbHVuZyBkaXNlYXNlLCBpbmNsdWRpbmcgYnJvbmNoaWVjdGFzaXMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDaHJvbmljIEhJVi1hc3NvY2lhdGVkIGx1bmcgZGlzZWFzZSwgaW5jbHVkaW5nIGJyb25jaGllY3Rhc2lzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ2hyb25pYyBISVYtYXNzb2NpYXRlZCBsdW5nIGRpc2Vhc2UsIGluY2x1ZGluZyBicm9uY2hpZWN0YXNpcyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENocm9uaWMgSElWLWFzc29jaWF0ZWQgbHVuZyBkaXNlYXNlLCBpbmNsdWRpbmcgYnJvbmNoaWVjdGFzaXMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMjQgLSBISVYgd2FzdGluZyBzeW5kcm9tZQpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IFVuZXhwbGFpbmVkIGludm9sdW50YXJ5IHdlaWdodCBsb3NzICg+MTAlIGJhc2VsaW5lIGJvZHkgd2VpZ2h0KSwgd2l0aCBvYnZpb3VzIHdhc3Rpbmcgb3IgYm9keSBtYXNzIGluZGV4IDwxOC41OyBQTFVTIEVJVEhFUiB1bmV4cGxhaW5lZCBjaHJvbmljIHJlcG9ydGVkIGZvciBsb25nZXIgdGhhbiBvbmUgbW9udGg7IE9SIHJlcG9ydHMgb2YgZmV2ZXIgb3IgbmlnaHQgc3dlYXRzIGZvciBtb3JlIHRoYW4gb25lIG1vbnRoIHdpdGhvdXQgb3RoZXIgY2F1c2UgYW5kIGxhY2sgb2YgcmVzcG9uc2UgdG8gYW50aWJpb3RpY3Mgb3IgYW50aW1hbGFyaWFsIGFnZW50czsgbWFsYXJpYSBtdXN0IGJlIGV4Y2x1ZGVkIGluIG1hbGFyaW91cyBhcmVhcy4KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhJViB3YXN0aW5nIHN5bmRyb21lIjoKICBleGlzdHMgIkhJViB3YXN0aW5nIHN5bmRyb21lIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSElWIHdhc3Rpbmcgc3luZHJvbWUgT2JzZXJ2YXRpb24iCmRlZmluZSAiSElWIHdhc3Rpbmcgc3luZHJvbWUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSElWIHdhc3Rpbmcgc3luZHJvbWUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJISVYgd2FzdGluZyBzeW5kcm9tZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJViB3YXN0aW5nIHN5bmRyb21lIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSElWIHdhc3Rpbmcgc3luZHJvbWUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMjUgLSBVbmV4cGxhaW5lZCBzZXZlcmUgd2FzdGluZyBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5CkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50IGhhcyB1bmV4cGxhaW5lZCBzZXZlcmUgd2FzdGluZyBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5IC4gRm9yIHVuZGVyIDUgeWVhcnMgb2xkLCBkZWZpbmVkIGFzIHdlaWdodC1mb3ItaGVpZ2h0IDwgLTMgei1zY29yZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVW5leHBsYWluZWQgc2V2ZXJlIHdhc3Rpbmcgbm90IHJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgdGhlcmFweSI6CiAgZXhpc3RzICJVbmV4cGxhaW5lZCBzZXZlcmUgd2FzdGluZyBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVW5leHBsYWluZWQgc2V2ZXJlIHdhc3Rpbmcgbm90IHJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgdGhlcmFweSBPYnNlcnZhdGlvbiIKZGVmaW5lICJVbmV4cGxhaW5lZCBzZXZlcmUgd2FzdGluZyBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlVuZXhwbGFpbmVkIHNldmVyZSB3YXN0aW5nIG5vdCByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJVbmV4cGxhaW5lZCBzZXZlcmUgd2FzdGluZyBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVW5leHBsYWluZWQgc2V2ZXJlIHdhc3Rpbmcgbm90IHJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgdGhlcmFweSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFVuZXhwbGFpbmVkIHNldmVyZSB3YXN0aW5nIG5vdCByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMjYgLSBVbmV4cGxhaW5lZCBzdHVudGluZyBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5CkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50IGhhcyB1bmV4cGxhaW5lZCBzdHVudGluZyBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5IC4gRm9yIHVuZGVyIDUgeWVhcnMgb2xkLCBkZWZpbmVkIGFzIGxlbmd0aC1mb3ItIGFnZS9oZWlnaHQtZm9yLWFnZSA8IC0yIHotc2NvcmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlVuZXhwbGFpbmVkIHN0dW50aW5nIG5vdCByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkiOgogIGV4aXN0cyAiVW5leHBsYWluZWQgc3R1bnRpbmcgbm90IHJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgdGhlcmFweSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlVuZXhwbGFpbmVkIHN0dW50aW5nIG5vdCByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkgT2JzZXJ2YXRpb24iCmRlZmluZSAiVW5leHBsYWluZWQgc3R1bnRpbmcgbm90IHJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgdGhlcmFweSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJVbmV4cGxhaW5lZCBzdHVudGluZyBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVW5leHBsYWluZWQgc3R1bnRpbmcgbm90IHJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgdGhlcmFweSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlVuZXhwbGFpbmVkIHN0dW50aW5nIG5vdCByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBVbmV4cGxhaW5lZCBzdHVudGluZyBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzI3IC0gVW5leHBsYWluZWQgc2V2ZXJlIG1hbG51dHJpdGlvbiBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5CkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50IGhhcyB1bmV4cGxhaW5lZCBzZXZlcmUgbWFsbnV0cml0aW9uIG5vdCByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkgLiBGb3IgdW5kZXIgNSB5ZWFycyBvbGQsIHdlaWdodCBmb3IgaGVpZ2h0IDwgLTMgei1zY29yZSBvciBtaWQtdXBwZXIgYXJtIGNpcmN1bWZlcmVuY2UgPDExNSBtbSBvciB0aGUgcHJlc2VuY2Ugb2Ygb2VkZW1hCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJVbmV4cGxhaW5lZCBzZXZlcmUgbWFsbnV0cml0aW9uIG5vdCByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkiOgogIGV4aXN0cyAiVW5leHBsYWluZWQgc2V2ZXJlIG1hbG51dHJpdGlvbiBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVW5leHBsYWluZWQgc2V2ZXJlIG1hbG51dHJpdGlvbiBub3QgcmVzcG9uZGluZyB0byBzdGFuZGFyZCB0aGVyYXB5IE9ic2VydmF0aW9uIgpkZWZpbmUgIlVuZXhwbGFpbmVkIHNldmVyZSBtYWxudXRyaXRpb24gbm90IHJlc3BvbmRpbmcgdG8gc3RhbmRhcmQgdGhlcmFweSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJVbmV4cGxhaW5lZCBzZXZlcmUgbWFsbnV0cml0aW9uIG5vdCByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJVbmV4cGxhaW5lZCBzZXZlcmUgbWFsbnV0cml0aW9uIG5vdCByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJVbmV4cGxhaW5lZCBzZXZlcmUgbWFsbnV0cml0aW9uIG5vdCByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBVbmV4cGxhaW5lZCBzZXZlcmUgbWFsbnV0cml0aW9uIG5vdCByZXNwb25kaW5nIHRvIHN0YW5kYXJkIHRoZXJhcHkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMjggLSBQbmV1bW9jeXN0aXMgamlyb3ZlY2lpIHBuZXVtb25pYQpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgcG5ldW1vY3lzdGlzIChqaXJvdmVjaWkpIHBuZXVtb25pYQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUG5ldW1vY3lzdGlzIGppcm92ZWNpaSBwbmV1bW9uaWEiOgogIGV4aXN0cyAiUG5ldW1vY3lzdGlzIGppcm92ZWNpaSBwbmV1bW9uaWEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQbmV1bW9jeXN0aXMgamlyb3ZlY2lpIHBuZXVtb25pYSBPYnNlcnZhdGlvbiIKZGVmaW5lICJQbmV1bW9jeXN0aXMgamlyb3ZlY2lpIHBuZXVtb25pYSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQbmV1bW9jeXN0aXMgamlyb3ZlY2lpIHBuZXVtb25pYSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlBuZXVtb2N5c3RpcyBqaXJvdmVjaWkgcG5ldW1vbmlhIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUG5ldW1vY3lzdGlzIGppcm92ZWNpaSBwbmV1bW9uaWEgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQbmV1bW9jeXN0aXMgamlyb3ZlY2lpIHBuZXVtb25pYSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMyOSAtIFJlY3VycmVudCBzZXZlcmUgYmFjdGVyaWFsIHBuZXVtb25pYQpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgcmVjdXJyZW50IHNldmVyZSBiYWN0ZXJpYWwgcG5ldW1vbmlhCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSZWN1cnJlbnQgc2V2ZXJlIGJhY3RlcmlhbCBwbmV1bW9uaWEiOgogIGV4aXN0cyAiUmVjdXJyZW50IHNldmVyZSBiYWN0ZXJpYWwgcG5ldW1vbmlhIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmVjdXJyZW50IHNldmVyZSBiYWN0ZXJpYWwgcG5ldW1vbmlhIE9ic2VydmF0aW9uIgpkZWZpbmUgIlJlY3VycmVudCBzZXZlcmUgYmFjdGVyaWFsIHBuZXVtb25pYSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJSZWN1cnJlbnQgc2V2ZXJlIGJhY3RlcmlhbCBwbmV1bW9uaWEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSZWN1cnJlbnQgc2V2ZXJlIGJhY3RlcmlhbCBwbmV1bW9uaWEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSZWN1cnJlbnQgc2V2ZXJlIGJhY3RlcmlhbCBwbmV1bW9uaWEgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBSZWN1cnJlbnQgc2V2ZXJlIGJhY3RlcmlhbCBwbmV1bW9uaWEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMzAgLSBSZWN1cnJlbnQgc2V2ZXJlIGJhY3RlcmlhbCBpbmZlY3Rpb25zIHN1Y2ggYXMgZW1weWVtYSwgcHlvbXlvc2l0aXMsIGJvbmUgb3Igam9pbnQgaW5mZWN0aW9uLCBtZW5pbmdpdGlzLCBidXQgZXhjbHVkaW5nIHBuZXVtb25pYQpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgcmVjdXJyZW50IHNldmVyZSBiYWN0ZXJpYWwgaW5mZWN0aW9ucyAoc3VjaCBhcyBlbXB5ZW1hLCBweW9teW9zaXRpcywgYm9uZSBvciBqb2ludCBpbmZlY3Rpb24sIG1lbmluZ2l0aXMsIGJ1dCBleGNsdWRpbmcgcG5ldW1vbmlhKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmVjdXJyZW50IHNldmVyZSBiYWN0ZXJpYWwgaW5mZWN0aW9ucyBzdWNoIGFzIGVtcHllbWEsIHB5b215b3NpdGlzLCBib25lIG9yIGpvaW50IGluZmVjdGlvbiwgbWVuaW5naXRpcywgYnV0IGV4Y2x1ZGluZyBwbmV1bW9uaWEiOgogIGV4aXN0cyAiUmVjdXJyZW50IHNldmVyZSBiYWN0ZXJpYWwgaW5mZWN0aW9ucyBzdWNoIGFzIGVtcHllbWEsIHB5b215b3NpdGlzLCBib25lIG9yIGpvaW50IGluZmVjdGlvbiwgbWVuaW5naXRpcywgYnV0IGV4Y2x1ZGluZyBwbmV1bW9uaWEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJSZWN1cnJlbnQgc2V2ZXJlIGJhY3RlcmlhbCBpbmZlY3Rpb25zIHN1Y2ggYXMgZW1weWVtYSwgcHlvbXlvc2l0aXMsIGJvbmUgb3Igam9pbnQgaW5mZWN0aW9uLCBtZW5pbmdpdGlzLCBidXQgZXhjbHVkaW5nIHBuZXVtb25pYSBPYnNlcnZhdGlvbiIKZGVmaW5lICJSZWN1cnJlbnQgc2V2ZXJlIGJhY3RlcmlhbCBpbmZlY3Rpb25zIHN1Y2ggYXMgZW1weWVtYSwgcHlvbXlvc2l0aXMsIGJvbmUgb3Igam9pbnQgaW5mZWN0aW9uLCBtZW5pbmdpdGlzLCBidXQgZXhjbHVkaW5nIHBuZXVtb25pYSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJSZWN1cnJlbnQgc2V2ZXJlIGJhY3RlcmlhbCBpbmZlY3Rpb25zIHN1Y2ggYXMgZW1weWVtYSwgcHlvbXlvc2l0aXMsIGJvbmUgb3Igam9pbnQgaW5mZWN0aW9uLCBtZW5pbmdpdGlzLCBidXQgZXhjbHVkaW5nIHBuZXVtb25pYSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlJlY3VycmVudCBzZXZlcmUgYmFjdGVyaWFsIGluZmVjdGlvbnMgc3VjaCBhcyBlbXB5ZW1hLCBweW9teW9zaXRpcywgYm9uZSBvciBqb2ludCBpbmZlY3Rpb24sIG1lbmluZ2l0aXMsIGJ1dCBleGNsdWRpbmcgcG5ldW1vbmlhIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmVjdXJyZW50IHNldmVyZSBiYWN0ZXJpYWwgaW5mZWN0aW9ucyBzdWNoIGFzIGVtcHllbWEsIHB5b215b3NpdGlzLCBib25lIG9yIGpvaW50IGluZmVjdGlvbiwgbWVuaW5naXRpcywgYnV0IGV4Y2x1ZGluZyBwbmV1bW9uaWEgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBSZWN1cnJlbnQgc2V2ZXJlIGJhY3RlcmlhbCBpbmZlY3Rpb25zIHN1Y2ggYXMgZW1weWVtYSwgcHlvbXlvc2l0aXMsIGJvbmUgb3Igam9pbnQgaW5mZWN0aW9uLCBtZW5pbmdpdGlzLCBidXQgZXhjbHVkaW5nIHBuZXVtb25pYSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMzMSAtIEVtcHllbWEKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIHJlY3VycmVudCBlbXB5ZW1hCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJFbXB5ZW1hIjoKICBleGlzdHMgIkVtcHllbWEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJFbXB5ZW1hIE9ic2VydmF0aW9uIgpkZWZpbmUgIkVtcHllbWEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRW1weWVtYSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkVtcHllbWEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJFbXB5ZW1hIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRW1weWVtYSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMzMiAtIFB5b215b3NpdGlzCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSByZWN1cnJlbnQgcHlvbXlvc2l0aXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlB5b215b3NpdGlzIjoKICBleGlzdHMgIlB5b215b3NpdGlzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUHlvbXlvc2l0aXMgT2JzZXJ2YXRpb24iCmRlZmluZSAiUHlvbXlvc2l0aXMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUHlvbXlvc2l0aXMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQeW9teW9zaXRpcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlB5b215b3NpdGlzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUHlvbXlvc2l0aXMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMzMgLSBCb25lIG9yIGpvaW50IGluZmVjdGlvbgpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgcmVjdXJyZW50IGJvbmUgb3Igam9pbnQgaW5mZWN0aW9ucwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQm9uZSBvciBqb2ludCBpbmZlY3Rpb24iOgogIGV4aXN0cyAiQm9uZSBvciBqb2ludCBpbmZlY3Rpb24gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJCb25lIG9yIGpvaW50IGluZmVjdGlvbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJCb25lIG9yIGpvaW50IGluZmVjdGlvbiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJCb25lIG9yIGpvaW50IGluZmVjdGlvbiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkJvbmUgb3Igam9pbnQgaW5mZWN0aW9uIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQm9uZSBvciBqb2ludCBpbmZlY3Rpb24gT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBCb25lIG9yIGpvaW50IGluZmVjdGlvbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMzNCAtIE1lbmluZ2l0aXMKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIHJlY3VycmVudCBtZW5pbmdpdGlzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJNZW5pbmdpdGlzIjoKICBleGlzdHMgIk1lbmluZ2l0aXMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJNZW5pbmdpdGlzIE9ic2VydmF0aW9uIgpkZWZpbmUgIk1lbmluZ2l0aXMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTWVuaW5naXRpcyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk1lbmluZ2l0aXMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJNZW5pbmdpdGlzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTWVuaW5naXRpcyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTMzNSAtIENocm9uaWMgaGVycGVzIHNpbXBsZXggaW5mZWN0aW9uIG9yb2xhYmlhbCBvciBjdXRhbmVvdXMgb2YgbW9yZSB0aGFuIDEgbW9udGggZHVyYXRpb24gb3IgdmlzY2VyYWwgYXQgYW55IHNpdGUKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGNocm9uaWMgaGVycGVzIHNpbXBsZXggaW5mZWN0aW9uIChvcm9sYWJpYWwgb3IgY3V0YW5lb3VzIG9mIG1vcmUgdGhhbiAxIG1vbnRoIGR1cmF0aW9uIG9yIHZpc2NlcmFsIGF0IGFueSBzaXRlKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ2hyb25pYyBoZXJwZXMgc2ltcGxleCBpbmZlY3Rpb24gb3JvbGFiaWFsIG9yIGN1dGFuZW91cyBvZiBtb3JlIHRoYW4gMSBtb250aCBkdXJhdGlvbiBvciB2aXNjZXJhbCBhdCBhbnkgc2l0ZSI6CiAgZXhpc3RzICJDaHJvbmljIGhlcnBlcyBzaW1wbGV4IGluZmVjdGlvbiBvcm9sYWJpYWwgb3IgY3V0YW5lb3VzIG9mIG1vcmUgdGhhbiAxIG1vbnRoIGR1cmF0aW9uIG9yIHZpc2NlcmFsIGF0IGFueSBzaXRlIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ2hyb25pYyBoZXJwZXMgc2ltcGxleCBpbmZlY3Rpb24gb3JvbGFiaWFsIG9yIGN1dGFuZW91cyBvZiBtb3JlIHRoYW4gMSBtb250aCBkdXJhdGlvbiBvciB2aXNjZXJhbCBhdCBhbnkgc2l0ZSBPYnNlcnZhdGlvbiIKZGVmaW5lICJDaHJvbmljIGhlcnBlcyBzaW1wbGV4IGluZmVjdGlvbiBvcm9sYWJpYWwgb3IgY3V0YW5lb3VzIG9mIG1vcmUgdGhhbiAxIG1vbnRoIGR1cmF0aW9uIG9yIHZpc2NlcmFsIGF0IGFueSBzaXRlIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNocm9uaWMgaGVycGVzIHNpbXBsZXggaW5mZWN0aW9uIG9yb2xhYmlhbCBvciBjdXRhbmVvdXMgb2YgbW9yZSB0aGFuIDEgbW9udGggZHVyYXRpb24gb3IgdmlzY2VyYWwgYXQgYW55IHNpdGUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDaHJvbmljIGhlcnBlcyBzaW1wbGV4IGluZmVjdGlvbiBvcm9sYWJpYWwgb3IgY3V0YW5lb3VzIG9mIG1vcmUgdGhhbiAxIG1vbnRoIGR1cmF0aW9uIG9yIHZpc2NlcmFsIGF0IGFueSBzaXRlIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ2hyb25pYyBoZXJwZXMgc2ltcGxleCBpbmZlY3Rpb24gb3JvbGFiaWFsIG9yIGN1dGFuZW91cyBvZiBtb3JlIHRoYW4gMSBtb250aCBkdXJhdGlvbiBvciB2aXNjZXJhbCBhdCBhbnkgc2l0ZSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENocm9uaWMgaGVycGVzIHNpbXBsZXggaW5mZWN0aW9uIG9yb2xhYmlhbCBvciBjdXRhbmVvdXMgb2YgbW9yZSB0aGFuIDEgbW9udGggZHVyYXRpb24gb3IgdmlzY2VyYWwgYXQgYW55IHNpdGUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMzYgLSBDaHJvbmljIGhlcnBlcyBzaW1wbGV4IGluZmVjdGlvbiBvcm9sYWJpYWwsIGdlbml0YWwgb3IgYW5vcmVjdGFsIG9mIG1vcmUgdGhhbiAxIG1vbnRoIGluIGR1cmF0aW9uIG9yIHZpc2NlcmFsIGF0IGFueSBzaXRlCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBjaHJvbmljIGhlcnBlcyBzaW1wbGV4IGluZmVjdGlvbiAob3JvbGFiaWFsLCBnZW5pdGFsIG9yIGFub3JlY3RhbCBvZiBtb3JlIHRoYW4gb25lIG1vbnRoIGluIGR1cmF0aW9uIG9yIHZpc2NlcmFsIGF0IGFueSBzaXRlKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ2hyb25pYyBoZXJwZXMgc2ltcGxleCBpbmZlY3Rpb24gb3JvbGFiaWFsLCBnZW5pdGFsIG9yIGFub3JlY3RhbCBvZiBtb3JlIHRoYW4gMSBtb250aCBpbiBkdXJhdGlvbiBvciB2aXNjZXJhbCBhdCBhbnkgc2l0ZSI6CiAgZXhpc3RzICJDaHJvbmljIGhlcnBlcyBzaW1wbGV4IGluZmVjdGlvbiBvcm9sYWJpYWwsIGdlbml0YWwgb3IgYW5vcmVjdGFsIG9mIG1vcmUgdGhhbiAxIG1vbnRoIGluIGR1cmF0aW9uIG9yIHZpc2NlcmFsIGF0IGFueSBzaXRlIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ2hyb25pYyBoZXJwZXMgc2ltcGxleCBpbmZlY3Rpb24gb3JvbGFiaWFsLCBnZW5pdGFsIG9yIGFub3JlY3RhbCBvZiBtb3JlIHRoYW4gMSBtb250aCBpbiBkdXJhdGlvbiBvciB2aXNjZXJhbCBhdCBhbnkgc2l0ZSBPYnNlcnZhdGlvbiIKZGVmaW5lICJDaHJvbmljIGhlcnBlcyBzaW1wbGV4IGluZmVjdGlvbiBvcm9sYWJpYWwsIGdlbml0YWwgb3IgYW5vcmVjdGFsIG9mIG1vcmUgdGhhbiAxIG1vbnRoIGluIGR1cmF0aW9uIG9yIHZpc2NlcmFsIGF0IGFueSBzaXRlIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNocm9uaWMgaGVycGVzIHNpbXBsZXggaW5mZWN0aW9uIG9yb2xhYmlhbCwgZ2VuaXRhbCBvciBhbm9yZWN0YWwgb2YgbW9yZSB0aGFuIDEgbW9udGggaW4gZHVyYXRpb24gb3IgdmlzY2VyYWwgYXQgYW55IHNpdGUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDaHJvbmljIGhlcnBlcyBzaW1wbGV4IGluZmVjdGlvbiBvcm9sYWJpYWwsIGdlbml0YWwgb3IgYW5vcmVjdGFsIG9mIG1vcmUgdGhhbiAxIG1vbnRoIGluIGR1cmF0aW9uIG9yIHZpc2NlcmFsIGF0IGFueSBzaXRlIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ2hyb25pYyBoZXJwZXMgc2ltcGxleCBpbmZlY3Rpb24gb3JvbGFiaWFsLCBnZW5pdGFsIG9yIGFub3JlY3RhbCBvZiBtb3JlIHRoYW4gMSBtb250aCBpbiBkdXJhdGlvbiBvciB2aXNjZXJhbCBhdCBhbnkgc2l0ZSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENocm9uaWMgaGVycGVzIHNpbXBsZXggaW5mZWN0aW9uIG9yb2xhYmlhbCwgZ2VuaXRhbCBvciBhbm9yZWN0YWwgb2YgbW9yZSB0aGFuIDEgbW9udGggaW4gZHVyYXRpb24gb3IgdmlzY2VyYWwgYXQgYW55IHNpdGUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMzcgLSBPZXNvcGhhZ2VhbCBjYW5kaWRpYXNpcyBvciBjYW5kaWRpYXNpcyBvZiB0cmFjaGVhLCBicm9uY2hpIG9yIGx1bmdzCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBvZXNvcGhhZ2VhbCBjYW5kaWRpYXNpcyAob3IgY2FuZGlkaWFzaXMgb2YgdHJhY2hlYSwgYnJvbmNoaSBvciBsdW5ncykKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk9lc29waGFnZWFsIGNhbmRpZGlhc2lzIG9yIGNhbmRpZGlhc2lzIG9mIHRyYWNoZWEsIGJyb25jaGkgb3IgbHVuZ3MiOgogIGV4aXN0cyAiT2Vzb3BoYWdlYWwgY2FuZGlkaWFzaXMgb3IgY2FuZGlkaWFzaXMgb2YgdHJhY2hlYSwgYnJvbmNoaSBvciBsdW5ncyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk9lc29waGFnZWFsIGNhbmRpZGlhc2lzIG9yIGNhbmRpZGlhc2lzIG9mIHRyYWNoZWEsIGJyb25jaGkgb3IgbHVuZ3MgT2JzZXJ2YXRpb24iCmRlZmluZSAiT2Vzb3BoYWdlYWwgY2FuZGlkaWFzaXMgb3IgY2FuZGlkaWFzaXMgb2YgdHJhY2hlYSwgYnJvbmNoaSBvciBsdW5ncyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJPZXNvcGhhZ2VhbCBjYW5kaWRpYXNpcyBvciBjYW5kaWRpYXNpcyBvZiB0cmFjaGVhLCBicm9uY2hpIG9yIGx1bmdzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiT2Vzb3BoYWdlYWwgY2FuZGlkaWFzaXMgb3IgY2FuZGlkaWFzaXMgb2YgdHJhY2hlYSwgYnJvbmNoaSBvciBsdW5ncyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk9lc29waGFnZWFsIGNhbmRpZGlhc2lzIG9yIGNhbmRpZGlhc2lzIG9mIHRyYWNoZWEsIGJyb25jaGkgb3IgbHVuZ3MgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBPZXNvcGhhZ2VhbCBjYW5kaWRpYXNpcyBvciBjYW5kaWRpYXNpcyBvZiB0cmFjaGVhLCBicm9uY2hpIG9yIGx1bmdzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzM4IC0gRXh0cmFwdWxtb25hcnkgVEIKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGV4dHJhcHVsbW9uYXJ5IHR1YmVyY3Vsb3NpcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRXh0cmFwdWxtb25hcnkgVEIgRC5ERTMzOCI6CiAgZXhpc3RzICJFeHRyYXB1bG1vbmFyeSBUQiBELkRFMzM4IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRXh0cmFwdWxtb25hcnkgVEIgRC5ERTMzOCBPYnNlcnZhdGlvbiIKZGVmaW5lICJFeHRyYXB1bG1vbmFyeSBUQiBELkRFMzM4IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkV4dHJhcHVsbW9uYXJ5IFRCIEQuREUzMzggQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJFeHRyYXB1bG1vbmFyeSBUQiBELkRFMzM4IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRXh0cmFwdWxtb25hcnkgVEIgRC5ERTMzOCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEV4dHJhcHVsbW9uYXJ5IFRCIEQuREUzMzggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzMzkgLSBLYXBvc2kgc2FyY29tYQpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgS2Fwb3NpIHNhcmNvbWEKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkthcG9zaSBzYXJjb21hIjoKICBleGlzdHMgIkthcG9zaSBzYXJjb21hIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiS2Fwb3NpIHNhcmNvbWEgT2JzZXJ2YXRpb24iCmRlZmluZSAiS2Fwb3NpIHNhcmNvbWEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iS2Fwb3NpIHNhcmNvbWEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJLYXBvc2kgc2FyY29tYSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkthcG9zaSBzYXJjb21hIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgS2Fwb3NpIHNhcmNvbWEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzNDAgLSBDeXRvbWVnYWxvdmlydXMgaW5mZWN0aW9uIHJldGluaXRpcyBvciBpbmZlY3Rpb24gb2Ygb3RoZXIgb3JnYW5zCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBjeXRvbWVnYWxvdmlydXMgaW5mZWN0aW9uIChyZXRpbml0aXMgb3IgaW5mZWN0aW9uIG9mIG90aGVyIG9yZ2FucykKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkN5dG9tZWdhbG92aXJ1cyBpbmZlY3Rpb24gcmV0aW5pdGlzIG9yIGluZmVjdGlvbiBvZiBvdGhlciBvcmdhbnMiOgogIGV4aXN0cyAiQ3l0b21lZ2Fsb3ZpcnVzIGluZmVjdGlvbiByZXRpbml0aXMgb3IgaW5mZWN0aW9uIG9mIG90aGVyIG9yZ2FucyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkN5dG9tZWdhbG92aXJ1cyBpbmZlY3Rpb24gcmV0aW5pdGlzIG9yIGluZmVjdGlvbiBvZiBvdGhlciBvcmdhbnMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ3l0b21lZ2Fsb3ZpcnVzIGluZmVjdGlvbiByZXRpbml0aXMgb3IgaW5mZWN0aW9uIG9mIG90aGVyIG9yZ2FucyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJDeXRvbWVnYWxvdmlydXMgaW5mZWN0aW9uIHJldGluaXRpcyBvciBpbmZlY3Rpb24gb2Ygb3RoZXIgb3JnYW5zIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ3l0b21lZ2Fsb3ZpcnVzIGluZmVjdGlvbiByZXRpbml0aXMgb3IgaW5mZWN0aW9uIG9mIG90aGVyIG9yZ2FucyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkN5dG9tZWdhbG92aXJ1cyBpbmZlY3Rpb24gcmV0aW5pdGlzIG9yIGluZmVjdGlvbiBvZiBvdGhlciBvcmdhbnMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDeXRvbWVnYWxvdmlydXMgaW5mZWN0aW9uIHJldGluaXRpcyBvciBpbmZlY3Rpb24gb2Ygb3RoZXIgb3JnYW5zICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzQxIC0gQ2VudHJhbCBuZXJ2b3VzIHN5c3RlbSB0b3hvcGxhc21vc2lzCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBjZW50cmFsIG5lcnZvdXMgc3lzdGVtIHRveG9wbGFzbW9zaXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNlbnRyYWwgbmVydm91cyBzeXN0ZW0gdG94b3BsYXNtb3NpcyI6CiAgZXhpc3RzICJDZW50cmFsIG5lcnZvdXMgc3lzdGVtIHRveG9wbGFzbW9zaXMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDZW50cmFsIG5lcnZvdXMgc3lzdGVtIHRveG9wbGFzbW9zaXMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ2VudHJhbCBuZXJ2b3VzIHN5c3RlbSB0b3hvcGxhc21vc2lzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNlbnRyYWwgbmVydm91cyBzeXN0ZW0gdG94b3BsYXNtb3NpcyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNlbnRyYWwgbmVydm91cyBzeXN0ZW0gdG94b3BsYXNtb3NpcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNlbnRyYWwgbmVydm91cyBzeXN0ZW0gdG94b3BsYXNtb3NpcyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENlbnRyYWwgbmVydm91cyBzeXN0ZW0gdG94b3BsYXNtb3NpcyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTM0MiAtIEhJViBlbmNlcGhhbG9wYXRoeQpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgSElWIGVuY2VwaGFsb3BhdGh5CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJISVYgZW5jZXBoYWxvcGF0aHkiOgogIGV4aXN0cyAiSElWIGVuY2VwaGFsb3BhdGh5IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSElWIGVuY2VwaGFsb3BhdGh5IE9ic2VydmF0aW9uIgpkZWZpbmUgIkhJViBlbmNlcGhhbG9wYXRoeSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJISVYgZW5jZXBoYWxvcGF0aHkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJISVYgZW5jZXBoYWxvcGF0aHkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJISVYgZW5jZXBoYWxvcGF0aHkgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBISVYgZW5jZXBoYWxvcGF0aHkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzNDMgLSBFeHRyYXB1bG1vbmFyeSBjcnlwdG9jb2Njb3NpcywgaW5jbHVkaW5nIG1lbmluZ2l0aXMKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGV4dHJhcHVsbW9uYXJ5IGNyeXB0b2NvY2Nvc2lzLCBpbmNsdWRpbmcgbWVuaW5naXRpcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRXh0cmFwdWxtb25hcnkgY3J5cHRvY29jY29zaXMsIGluY2x1ZGluZyBtZW5pbmdpdGlzIjoKICBleGlzdHMgIkV4dHJhcHVsbW9uYXJ5IGNyeXB0b2NvY2Nvc2lzLCBpbmNsdWRpbmcgbWVuaW5naXRpcyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkV4dHJhcHVsbW9uYXJ5IGNyeXB0b2NvY2Nvc2lzLCBpbmNsdWRpbmcgbWVuaW5naXRpcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJFeHRyYXB1bG1vbmFyeSBjcnlwdG9jb2Njb3NpcywgaW5jbHVkaW5nIG1lbmluZ2l0aXMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRXh0cmFwdWxtb25hcnkgY3J5cHRvY29jY29zaXMsIGluY2x1ZGluZyBtZW5pbmdpdGlzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRXh0cmFwdWxtb25hcnkgY3J5cHRvY29jY29zaXMsIGluY2x1ZGluZyBtZW5pbmdpdGlzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRXh0cmFwdWxtb25hcnkgY3J5cHRvY29jY29zaXMsIGluY2x1ZGluZyBtZW5pbmdpdGlzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRXh0cmFwdWxtb25hcnkgY3J5cHRvY29jY29zaXMsIGluY2x1ZGluZyBtZW5pbmdpdGlzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzQ0IC0gRGlzc2VtaW5hdGVkIG5vbnR1YmVyY3Vsb3VzIG15Y29iYWN0ZXJpYWwgaW5mZWN0aW9uCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBkaXNzZW1pbmF0ZWQgbm9udHViZXJjdWxvdXMgbXljb2JhY3RlcmlhbCBpbmZlY3Rpb24KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkRpc3NlbWluYXRlZCBub250dWJlcmN1bG91cyBteWNvYmFjdGVyaWFsIGluZmVjdGlvbiI6CiAgZXhpc3RzICJEaXNzZW1pbmF0ZWQgbm9udHViZXJjdWxvdXMgbXljb2JhY3RlcmlhbCBpbmZlY3Rpb24gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJEaXNzZW1pbmF0ZWQgbm9udHViZXJjdWxvdXMgbXljb2JhY3RlcmlhbCBpbmZlY3Rpb24gT2JzZXJ2YXRpb24iCmRlZmluZSAiRGlzc2VtaW5hdGVkIG5vbnR1YmVyY3Vsb3VzIG15Y29iYWN0ZXJpYWwgaW5mZWN0aW9uIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkRpc3NlbWluYXRlZCBub250dWJlcmN1bG91cyBteWNvYmFjdGVyaWFsIGluZmVjdGlvbiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkRpc3NlbWluYXRlZCBub250dWJlcmN1bG91cyBteWNvYmFjdGVyaWFsIGluZmVjdGlvbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkRpc3NlbWluYXRlZCBub250dWJlcmN1bG91cyBteWNvYmFjdGVyaWFsIGluZmVjdGlvbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIERpc3NlbWluYXRlZCBub250dWJlcmN1bG91cyBteWNvYmFjdGVyaWFsIGluZmVjdGlvbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTM0NSAtIFByb2dyZXNzaXZlIG11bHRpZm9jYWwgbGV1a29lbmNlcGhhbG9wYXRoeQpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgcHJvZ3Jlc3NpdmUgbXVsdGlmb2NhbCBsZXVrb2VuY2VwaGFsb3BhdGh5CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQcm9ncmVzc2l2ZSBtdWx0aWZvY2FsIGxldWtvZW5jZXBoYWxvcGF0aHkiOgogIGV4aXN0cyAiUHJvZ3Jlc3NpdmUgbXVsdGlmb2NhbCBsZXVrb2VuY2VwaGFsb3BhdGh5IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUHJvZ3Jlc3NpdmUgbXVsdGlmb2NhbCBsZXVrb2VuY2VwaGFsb3BhdGh5IE9ic2VydmF0aW9uIgpkZWZpbmUgIlByb2dyZXNzaXZlIG11bHRpZm9jYWwgbGV1a29lbmNlcGhhbG9wYXRoeSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQcm9ncmVzc2l2ZSBtdWx0aWZvY2FsIGxldWtvZW5jZXBoYWxvcGF0aHkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQcm9ncmVzc2l2ZSBtdWx0aWZvY2FsIGxldWtvZW5jZXBoYWxvcGF0aHkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQcm9ncmVzc2l2ZSBtdWx0aWZvY2FsIGxldWtvZW5jZXBoYWxvcGF0aHkgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQcm9ncmVzc2l2ZSBtdWx0aWZvY2FsIGxldWtvZW5jZXBoYWxvcGF0aHkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzNDYgLSBDaHJvbmljIGNyeXB0b3Nwb3JpZGlvc2lzCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBjaHJvbmljIGNyeXB0b3Nwb3JpZGlvc2lzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDaHJvbmljIGNyeXB0b3Nwb3JpZGlvc2lzIjoKICBleGlzdHMgIkNocm9uaWMgY3J5cHRvc3BvcmlkaW9zaXMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDaHJvbmljIGNyeXB0b3Nwb3JpZGlvc2lzIE9ic2VydmF0aW9uIgpkZWZpbmUgIkNocm9uaWMgY3J5cHRvc3BvcmlkaW9zaXMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ2hyb25pYyBjcnlwdG9zcG9yaWRpb3NpcyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNocm9uaWMgY3J5cHRvc3BvcmlkaW9zaXMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDaHJvbmljIGNyeXB0b3Nwb3JpZGlvc2lzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ2hyb25pYyBjcnlwdG9zcG9yaWRpb3NpcyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTM0NyAtIENocm9uaWMgY3J5cHRvc3BvcmlkaW9zaXMgd2l0aCBkaWFycmhvZWEKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGNocm9uaWMgY3J5cHRvc3BvcmlkaW9zaXMgKHdpdGggZGlhcnJob2VhKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ2hyb25pYyBjcnlwdG9zcG9yaWRpb3NpcyB3aXRoIGRpYXJyaG9lYSI6CiAgZXhpc3RzICJDaHJvbmljIGNyeXB0b3Nwb3JpZGlvc2lzIHdpdGggZGlhcnJob2VhIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ2hyb25pYyBjcnlwdG9zcG9yaWRpb3NpcyB3aXRoIGRpYXJyaG9lYSBPYnNlcnZhdGlvbiIKZGVmaW5lICJDaHJvbmljIGNyeXB0b3Nwb3JpZGlvc2lzIHdpdGggZGlhcnJob2VhIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNocm9uaWMgY3J5cHRvc3BvcmlkaW9zaXMgd2l0aCBkaWFycmhvZWEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDaHJvbmljIGNyeXB0b3Nwb3JpZGlvc2lzIHdpdGggZGlhcnJob2VhIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ2hyb25pYyBjcnlwdG9zcG9yaWRpb3NpcyB3aXRoIGRpYXJyaG9lYSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENocm9uaWMgY3J5cHRvc3BvcmlkaW9zaXMgd2l0aCBkaWFycmhvZWEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzNDggLSBDaHJvbmljIGlzb3Nwb3JpYXNpcwpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgY2hyb25pYyBpc29zcG9yaWFzaXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNocm9uaWMgaXNvc3Bvcmlhc2lzIjoKICBleGlzdHMgIkNocm9uaWMgaXNvc3Bvcmlhc2lzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ2hyb25pYyBpc29zcG9yaWFzaXMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ2hyb25pYyBpc29zcG9yaWFzaXMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ2hyb25pYyBpc29zcG9yaWFzaXMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDaHJvbmljIGlzb3Nwb3JpYXNpcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNocm9uaWMgaXNvc3Bvcmlhc2lzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ2hyb25pYyBpc29zcG9yaWFzaXMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzNDkgLSBEaXNzZW1pbmF0ZWQgbXljb3NpcyBleHRyYXB1bG1vbmFyeSBoaXN0b3BsYXNtb3NpcywgY29jY2lkaW9pZG9teWNvc2lzCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBkaXNzZW1pbmF0ZWQgbXljb3NpcyAoZXh0cmFwdWxtb25hcnkgaGlzdG9wbGFzbW9zaXMsIGNvY2NpZGlvaWRvbXljb3NpcykKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkRpc3NlbWluYXRlZCBteWNvc2lzIGV4dHJhcHVsbW9uYXJ5IGhpc3RvcGxhc21vc2lzLCBjb2NjaWRpb2lkb215Y29zaXMiOgogIGV4aXN0cyAiRGlzc2VtaW5hdGVkIG15Y29zaXMgZXh0cmFwdWxtb25hcnkgaGlzdG9wbGFzbW9zaXMsIGNvY2NpZGlvaWRvbXljb3NpcyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkRpc3NlbWluYXRlZCBteWNvc2lzIGV4dHJhcHVsbW9uYXJ5IGhpc3RvcGxhc21vc2lzLCBjb2NjaWRpb2lkb215Y29zaXMgT2JzZXJ2YXRpb24iCmRlZmluZSAiRGlzc2VtaW5hdGVkIG15Y29zaXMgZXh0cmFwdWxtb25hcnkgaGlzdG9wbGFzbW9zaXMsIGNvY2NpZGlvaWRvbXljb3NpcyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJEaXNzZW1pbmF0ZWQgbXljb3NpcyBleHRyYXB1bG1vbmFyeSBoaXN0b3BsYXNtb3NpcywgY29jY2lkaW9pZG9teWNvc2lzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRGlzc2VtaW5hdGVkIG15Y29zaXMgZXh0cmFwdWxtb25hcnkgaGlzdG9wbGFzbW9zaXMsIGNvY2NpZGlvaWRvbXljb3NpcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkRpc3NlbWluYXRlZCBteWNvc2lzIGV4dHJhcHVsbW9uYXJ5IGhpc3RvcGxhc21vc2lzLCBjb2NjaWRpb2lkb215Y29zaXMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBEaXNzZW1pbmF0ZWQgbXljb3NpcyBleHRyYXB1bG1vbmFyeSBoaXN0b3BsYXNtb3NpcywgY29jY2lkaW9pZG9teWNvc2lzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzUwIC0gRGlzc2VtaW5hdGVkIGVuZGVtaWMgbXljb3NpcyBleHRyYXB1bG1vbmFyeSBoaXN0b3BsYXNtb3NpcywgY29jY2lkaW9pZG9teWNvc2lzLCBwZW5pY2lsbGlvc2lzCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBkaXNzZW1pbmF0ZWQgZW5kZW1pYyBteWNvc2lzIChleHRyYXB1bG1vbmFyeSBoaXN0b3BsYXNtb3NpcywgY29jY2lkaW9pZG9teWNvc2lzLCBwZW5pY2lsbGlvc2lzKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRGlzc2VtaW5hdGVkIGVuZGVtaWMgbXljb3NpcyBleHRyYXB1bG1vbmFyeSBoaXN0b3BsYXNtb3NpcywgY29jY2lkaW9pZG9teWNvc2lzLCBwZW5pY2lsbGlvc2lzIjoKICBleGlzdHMgIkRpc3NlbWluYXRlZCBlbmRlbWljIG15Y29zaXMgZXh0cmFwdWxtb25hcnkgaGlzdG9wbGFzbW9zaXMsIGNvY2NpZGlvaWRvbXljb3NpcywgcGVuaWNpbGxpb3NpcyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkRpc3NlbWluYXRlZCBlbmRlbWljIG15Y29zaXMgZXh0cmFwdWxtb25hcnkgaGlzdG9wbGFzbW9zaXMsIGNvY2NpZGlvaWRvbXljb3NpcywgcGVuaWNpbGxpb3NpcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJEaXNzZW1pbmF0ZWQgZW5kZW1pYyBteWNvc2lzIGV4dHJhcHVsbW9uYXJ5IGhpc3RvcGxhc21vc2lzLCBjb2NjaWRpb2lkb215Y29zaXMsIHBlbmljaWxsaW9zaXMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRGlzc2VtaW5hdGVkIGVuZGVtaWMgbXljb3NpcyBleHRyYXB1bG1vbmFyeSBoaXN0b3BsYXNtb3NpcywgY29jY2lkaW9pZG9teWNvc2lzLCBwZW5pY2lsbGlvc2lzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRGlzc2VtaW5hdGVkIGVuZGVtaWMgbXljb3NpcyBleHRyYXB1bG1vbmFyeSBoaXN0b3BsYXNtb3NpcywgY29jY2lkaW9pZG9teWNvc2lzLCBwZW5pY2lsbGlvc2lzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRGlzc2VtaW5hdGVkIGVuZGVtaWMgbXljb3NpcyBleHRyYXB1bG1vbmFyeSBoaXN0b3BsYXNtb3NpcywgY29jY2lkaW9pZG9teWNvc2lzLCBwZW5pY2lsbGlvc2lzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRGlzc2VtaW5hdGVkIGVuZGVtaWMgbXljb3NpcyBleHRyYXB1bG1vbmFyeSBoaXN0b3BsYXNtb3NpcywgY29jY2lkaW9pZG9teWNvc2lzLCBwZW5pY2lsbGlvc2lzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzUxIC0gQ2VyZWJyYWwgbHltcGhvbWEKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGNlcmVicmFsIGx5bXBob21hCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDZXJlYnJhbCBseW1waG9tYSI6CiAgZXhpc3RzICJDZXJlYnJhbCBseW1waG9tYSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkNlcmVicmFsIGx5bXBob21hIE9ic2VydmF0aW9uIgpkZWZpbmUgIkNlcmVicmFsIGx5bXBob21hIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNlcmVicmFsIGx5bXBob21hIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ2VyZWJyYWwgbHltcGhvbWEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDZXJlYnJhbCBseW1waG9tYSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENlcmVicmFsIGx5bXBob21hICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzUyIC0gQi1jZWxsIG5vbi1Ib2Rna2luIGx5bXBob21hCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBiLWNlbGwgbm9uLUhvZGdraW4gbHltcGhvbWEKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkItY2VsbCBub24tSG9kZ2tpbiBseW1waG9tYSI6CiAgZXhpc3RzICJCLWNlbGwgbm9uLUhvZGdraW4gbHltcGhvbWEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJCLWNlbGwgbm9uLUhvZGdraW4gbHltcGhvbWEgT2JzZXJ2YXRpb24iCmRlZmluZSAiQi1jZWxsIG5vbi1Ib2Rna2luIGx5bXBob21hIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkItY2VsbCBub24tSG9kZ2tpbiBseW1waG9tYSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkItY2VsbCBub24tSG9kZ2tpbiBseW1waG9tYSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkItY2VsbCBub24tSG9kZ2tpbiBseW1waG9tYSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEItY2VsbCBub24tSG9kZ2tpbiBseW1waG9tYSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTM1MyAtIEhJVi1hc3NvY2lhdGVkIG5lcGhyb3BhdGh5IG9yIGNhcmRpb215b3BhdGh5CkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSBISVYtIGFzc29jaWF0ZWQgbmVwaHJvcGF0aHkgb3IgY2FyZGlvbXlvcGF0aHkKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhJVi1hc3NvY2lhdGVkIG5lcGhyb3BhdGh5IG9yIGNhcmRpb215b3BhdGh5IjoKICBleGlzdHMgIkhJVi1hc3NvY2lhdGVkIG5lcGhyb3BhdGh5IG9yIGNhcmRpb215b3BhdGh5IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSElWLWFzc29jaWF0ZWQgbmVwaHJvcGF0aHkgb3IgY2FyZGlvbXlvcGF0aHkgT2JzZXJ2YXRpb24iCmRlZmluZSAiSElWLWFzc29jaWF0ZWQgbmVwaHJvcGF0aHkgb3IgY2FyZGlvbXlvcGF0aHkgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSElWLWFzc29jaWF0ZWQgbmVwaHJvcGF0aHkgb3IgY2FyZGlvbXlvcGF0aHkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJISVYtYXNzb2NpYXRlZCBuZXBocm9wYXRoeSBvciBjYXJkaW9teW9wYXRoeSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJVi1hc3NvY2lhdGVkIG5lcGhyb3BhdGh5IG9yIGNhcmRpb215b3BhdGh5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSElWLWFzc29jaWF0ZWQgbmVwaHJvcGF0aHkgb3IgY2FyZGlvbXlvcGF0aHkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzNTQgLSBSZWN1cnJlbnQgc2VwdGljYWVtaWEgaW5jbHVkaW5nIG5vbnR5cGhvaWRhbCBTYWxtb25lbGxhCkBhY3Rpdml0eTogSElWLkQxNSBEZXRlcm1pbmUgY2xpbmljYWwgc3RhZ2Ugb2YgSElWCkBkZXNjcmlwdGlvbjogQ2xpZW50J3Mgc3ltcHRvbXMgaW5jbHVkZSByZWN1cnJlbnQgYmFjdGVyYWVtaWEgKHNlcHRpY2FlbWlhKSAoaW5jbHVkaW5nIG5vbnR5cGhvaWRhbCBzYWxtb25lbGxhKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmVjdXJyZW50IHNlcHRpY2FlbWlhIGluY2x1ZGluZyBub250eXBob2lkYWwgU2FsbW9uZWxsYSI6CiAgZXhpc3RzICJSZWN1cnJlbnQgc2VwdGljYWVtaWEgaW5jbHVkaW5nIG5vbnR5cGhvaWRhbCBTYWxtb25lbGxhIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmVjdXJyZW50IHNlcHRpY2FlbWlhIGluY2x1ZGluZyBub250eXBob2lkYWwgU2FsbW9uZWxsYSBPYnNlcnZhdGlvbiIKZGVmaW5lICJSZWN1cnJlbnQgc2VwdGljYWVtaWEgaW5jbHVkaW5nIG5vbnR5cGhvaWRhbCBTYWxtb25lbGxhIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJlY3VycmVudCBzZXB0aWNhZW1pYSBpbmNsdWRpbmcgbm9udHlwaG9pZGFsIFNhbG1vbmVsbGEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSZWN1cnJlbnQgc2VwdGljYWVtaWEgaW5jbHVkaW5nIG5vbnR5cGhvaWRhbCBTYWxtb25lbGxhIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmVjdXJyZW50IHNlcHRpY2FlbWlhIGluY2x1ZGluZyBub250eXBob2lkYWwgU2FsbW9uZWxsYSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJlY3VycmVudCBzZXB0aWNhZW1pYSBpbmNsdWRpbmcgbm9udHlwaG9pZGFsIFNhbG1vbmVsbGEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzNTUgLSBJbnZhc2l2ZSBjZXJ2aWNhbCBjYXJjaW5vbWEKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGludmFzaXZlIGNlcnZpY2FsIGNhcmNpbm9tYQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW52YXNpdmUgY2VydmljYWwgY2FyY2lub21hIjoKICBleGlzdHMgIkludmFzaXZlIGNlcnZpY2FsIGNhcmNpbm9tYSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkludmFzaXZlIGNlcnZpY2FsIGNhcmNpbm9tYSBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbnZhc2l2ZSBjZXJ2aWNhbCBjYXJjaW5vbWEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW52YXNpdmUgY2VydmljYWwgY2FyY2lub21hIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSW52YXNpdmUgY2VydmljYWwgY2FyY2lub21hIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW52YXNpdmUgY2VydmljYWwgY2FyY2lub21hIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW52YXNpdmUgY2VydmljYWwgY2FyY2lub21hICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzU2IC0gQXR5cGljYWwgZGlzc2VtaW5hdGVkIGxlaXNobWFuaWFzaXMKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGF0eXBpY2FsIGRpc3NlbWluYXRlZCBsZWlzaG1hbmlhc2lzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBdHlwaWNhbCBkaXNzZW1pbmF0ZWQgbGVpc2htYW5pYXNpcyI6CiAgZXhpc3RzICJBdHlwaWNhbCBkaXNzZW1pbmF0ZWQgbGVpc2htYW5pYXNpcyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkF0eXBpY2FsIGRpc3NlbWluYXRlZCBsZWlzaG1hbmlhc2lzIE9ic2VydmF0aW9uIgpkZWZpbmUgIkF0eXBpY2FsIGRpc3NlbWluYXRlZCBsZWlzaG1hbmlhc2lzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkF0eXBpY2FsIGRpc3NlbWluYXRlZCBsZWlzaG1hbmlhc2lzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQXR5cGljYWwgZGlzc2VtaW5hdGVkIGxlaXNobWFuaWFzaXMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBdHlwaWNhbCBkaXNzZW1pbmF0ZWQgbGVpc2htYW5pYXNpcyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEF0eXBpY2FsIGRpc3NlbWluYXRlZCBsZWlzaG1hbmlhc2lzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzU3IC0gTmV1dHJvcGVuaWEKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIG5ldXRyb3BlbmlhLCBhbiBhYm5vcm1hbGx5IGxvdyBjb3VudCBvZiBhIHR5cGUgb2Ygd2hpdGUgYmxvb2QgY2VsbCAobmV1dHJvcGhpbHMpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJOZXV0cm9wZW5pYSI6CiAgZXhpc3RzICJOZXV0cm9wZW5pYSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk5ldXRyb3BlbmlhIE9ic2VydmF0aW9uIgpkZWZpbmUgIk5ldXRyb3BlbmlhIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk5ldXRyb3BlbmlhIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTmV1dHJvcGVuaWEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJOZXV0cm9wZW5pYSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5ldXRyb3BlbmlhICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzY0IC0gQ0Q0IGNvdW50CkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IENENCBjZWxsIGNvdW50IGluIGNlbGxzL21tXjMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNENCBjb3VudCBELkRFMzY0IjoKICBFbGVtZW50cy4iQ0Q0IGNvdW50IEQuREUzNjQiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ0Q0IGNvdW50IEQuREUzNjQgVmFsdWUiOgogICJDRDQgY291bnQgRC5ERTM2NCIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBDRDQgY291bnQgRC5ERTM2NCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTM4NyAtIFZpcmFsIGxvYWQgdGVzdCByZXN1bHQKQGFjdGl2aXR5OiBISVYuRDIwIERpYWdub3N0aWNzCkBkZXNjcmlwdGlvbjogUmVzdWx0IGZyb20gdGhlIHZpcmFsIGxvYWQgdGVzdCBpbiBudW1iZXIgb2YgY29waWVzL21MCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJWaXJhbCBsb2FkIHRlc3QgcmVzdWx0IEQuREUzODciOgogIEVsZW1lbnRzLiJWaXJhbCBsb2FkIHRlc3QgcmVzdWx0IEQuREUzODciIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVmlyYWwgbG9hZCB0ZXN0IHJlc3VsdCBELkRFMzg3IFZhbHVlIjoKICAiVmlyYWwgbG9hZCB0ZXN0IHJlc3VsdCBELkRFMzg3IiBPCiAgcmV0dXJuIE8udmFsdWUKLyogRW5kIG9mIFZpcmFsIGxvYWQgdGVzdCByZXN1bHQgRC5ERTM4NyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTM5MSAtIFJlYXNvbiBmb3IgSElWIHZpcmFsIGxvYWQgdGVzdApAYWN0aXZpdHk6IEhJVi5EMjAgRGlhZ25vc3RpY3MKQGRlc2NyaXB0aW9uOiBXaGV0aGVyIHRoZSB2aXJhbCBsb2FkIGlzIGJlaW5nIHRlc3RlZCBmb3Igcm91dGluZSBtb25pdG9yaW5nIG9uIGEgc2V0IHNjaGVkdWxlIG9yIGZvciB0YXJnZXRlZCBtb25pdG9yaW5nIGZvciBzdXNwZWN0ZWQgdHJlYXRtZW50IGZhaWx1cmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlJlYXNvbiBmb3IgSElWIHZpcmFsIGxvYWQgdGVzdCI6CiAgZXhpc3RzICJSZWFzb24gZm9yIEhJViB2aXJhbCBsb2FkIHRlc3QgT2JzZXJ2YXRpb24iCmRlZmluZSAiUmVhc29uIGZvciBISVYgdmlyYWwgbG9hZCB0ZXN0IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmVhc29uIGZvciBISVYgdmlyYWwgbG9hZCB0ZXN0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUmVhc29uIGZvciBISVYgdmlyYWwgbG9hZCB0ZXN0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzkyIC0gUm91dGluZSB2aXJhbCBsb2FkIHRlc3QKQGFjdGl2aXR5OiBISVYuRDIwIERpYWdub3N0aWNzCkBkZXNjcmlwdGlvbjogUm91dGluZSByZWZlcnMgdG8gdmlyYWwgbG9hZCB0ZXN0cyBvYnRhaW5lZCBhdCBzdGFuZGFyZCBpbnRlcnZhbHMgZm9sbG93aW5nIEFSVCBpbml0aWF0aW9uIHRvIG1vbml0b3IgdmlyYWwgbG9hZCByZXNwb25zZSB0byBBUlQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlJvdXRpbmUgdmlyYWwgbG9hZCB0ZXN0IjoKICBleGlzdHMgIlJvdXRpbmUgdmlyYWwgbG9hZCB0ZXN0IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUm91dGluZSB2aXJhbCBsb2FkIHRlc3QgT2JzZXJ2YXRpb24iCmRlZmluZSAiUm91dGluZSB2aXJhbCBsb2FkIHRlc3QgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUm91dGluZSB2aXJhbCBsb2FkIHRlc3QgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSb3V0aW5lIHZpcmFsIGxvYWQgdGVzdCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlJvdXRpbmUgdmlyYWwgbG9hZCB0ZXN0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUm91dGluZSB2aXJhbCBsb2FkIHRlc3QgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzOTMgLSBUYXJnZXRlZCB2aXJhbCBsb2FkIG1vbml0b3JpbmcKQGFjdGl2aXR5OiBISVYuRDIwIERpYWdub3N0aWNzCkBkZXNjcmlwdGlvbjogVGFyZ2V0ZWQgcmVmZXJzIHRvIHZpcmFsIGxvYWQgdGVzdHMgb2J0YWluZWQgYmFzZWQgb24gYSBzcGVjaWZpYyBjbGluaWNhbCBpbmRpY2F0aW9uIChzdWNoIGFzIGNvbmNlcm4gYWJvdXQgZGlzZWFzZSBwcm9ncmVzc2lvbiBvciBmYWlsdXJlIHRvIHJlc3BvbmQgdG8gQVJUKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVGFyZ2V0ZWQgdmlyYWwgbG9hZCBtb25pdG9yaW5nIjoKICBleGlzdHMgIlRhcmdldGVkIHZpcmFsIGxvYWQgbW9uaXRvcmluZyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlRhcmdldGVkIHZpcmFsIGxvYWQgbW9uaXRvcmluZyBPYnNlcnZhdGlvbiIKZGVmaW5lICJUYXJnZXRlZCB2aXJhbCBsb2FkIG1vbml0b3JpbmcgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVGFyZ2V0ZWQgdmlyYWwgbG9hZCBtb25pdG9yaW5nIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVGFyZ2V0ZWQgdmlyYWwgbG9hZCBtb25pdG9yaW5nIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVGFyZ2V0ZWQgdmlyYWwgbG9hZCBtb25pdG9yaW5nIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVGFyZ2V0ZWQgdmlyYWwgbG9hZCBtb25pdG9yaW5nICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzk0IC0gSW5pdGlhbCB2aXJhbCBsb2FkIHRlc3QKQGFjdGl2aXR5OiBISVYuRDIwIERpYWdub3N0aWNzCkBkZXNjcmlwdGlvbjogVGhlIGZpcnN0IHZpcmFsIGxvYWQgdGVzdCBvZiB0aGUgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJJbml0aWFsIHZpcmFsIGxvYWQgdGVzdCI6CiAgZXhpc3RzICJJbml0aWFsIHZpcmFsIGxvYWQgdGVzdCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkluaXRpYWwgdmlyYWwgbG9hZCB0ZXN0IE9ic2VydmF0aW9uIgpkZWZpbmUgIkluaXRpYWwgdmlyYWwgbG9hZCB0ZXN0IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkluaXRpYWwgdmlyYWwgbG9hZCB0ZXN0IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSW5pdGlhbCB2aXJhbCBsb2FkIHRlc3QgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJJbml0aWFsIHZpcmFsIGxvYWQgdGVzdCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEluaXRpYWwgdmlyYWwgbG9hZCB0ZXN0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMzk1IC0gRm9sbG93LXVwIHZpcmFsIGxvYWQgdGVzdCBhZnRlciByZWNlaXZpbmcgZW5oYW5jZWQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nCkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IEEgZm9sbG93LXVwIHZpcmFsIGxvYWQgdGVzdCB3aXRoaW4gMy02IG1vbnRocyBhZnRlciBlbmhhbmNlZCBhZGhlcmVuY2UgY291bnNlbGxpbmcgYWZ0ZXIgY2xpZW50IHJlY2VpdmVkIGEgaGlnaCB2aXJhbCBsb2FkIHRlc3QgcmVzdWx0CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJGb2xsb3ctdXAgdmlyYWwgbG9hZCB0ZXN0IGFmdGVyIHJlY2VpdmluZyBlbmhhbmNlZCBhZGhlcmVuY2UgY291bnNlbGxpbmciOgogIGV4aXN0cyAiRm9sbG93LXVwIHZpcmFsIGxvYWQgdGVzdCBhZnRlciByZWNlaXZpbmcgZW5oYW5jZWQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRm9sbG93LXVwIHZpcmFsIGxvYWQgdGVzdCBhZnRlciByZWNlaXZpbmcgZW5oYW5jZWQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIE9ic2VydmF0aW9uIgpkZWZpbmUgIkZvbGxvdy11cCB2aXJhbCBsb2FkIHRlc3QgYWZ0ZXIgcmVjZWl2aW5nIGVuaGFuY2VkIGFkaGVyZW5jZSBjb3Vuc2VsbGluZyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJGb2xsb3ctdXAgdmlyYWwgbG9hZCB0ZXN0IGFmdGVyIHJlY2VpdmluZyBlbmhhbmNlZCBhZGhlcmVuY2UgY291bnNlbGxpbmcgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJGb2xsb3ctdXAgdmlyYWwgbG9hZCB0ZXN0IGFmdGVyIHJlY2VpdmluZyBlbmhhbmNlZCBhZGhlcmVuY2UgY291bnNlbGxpbmcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJGb2xsb3ctdXAgdmlyYWwgbG9hZCB0ZXN0IGFmdGVyIHJlY2VpdmluZyBlbmhhbmNlZCBhZGhlcmVuY2UgY291bnNlbGxpbmcgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBGb2xsb3ctdXAgdmlyYWwgbG9hZCB0ZXN0IGFmdGVyIHJlY2VpdmluZyBlbmhhbmNlZCBhZGhlcmVuY2UgY291bnNlbGxpbmcgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUzOTkgLSBNb25pdG9yaW5nIGV4YW1pbmF0aW9ucwpAYWN0aXZpdHk6IEhJVi5EMjAgRGlhZ25vc3RpY3MKQGRlc2NyaXB0aW9uOiBOYW1lIG9mIGV4YW1pbmF0aW9ucywgdGVzdCBhbmQgcmVzdWx0cyBmb3IgYW55IHJlbGV2YW50IGludmVzdGlnYXRpb25zIGNhcnJpZWQgb3V0IGZvciBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk1vbml0b3JpbmcgZXhhbWluYXRpb25zIjoKICBleGlzdHMgIk1vbml0b3JpbmcgZXhhbWluYXRpb25zIE9ic2VydmF0aW9uIgpkZWZpbmUgIk1vbml0b3JpbmcgZXhhbWluYXRpb25zIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTW9uaXRvcmluZyBleGFtaW5hdGlvbnMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBNb25pdG9yaW5nIGV4YW1pbmF0aW9ucyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTQwMCAtIEhhZW1vZ2xvYmluIEhiCkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IFByb3ZpZGVyIG9yZGVyZWQgYSBIYWVtb2dsb2JpbiAoSGIpIHRlc3QsIG51bWJlciBpbiBnL2RMIHRlc3QKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhhZW1vZ2xvYmluIEhiIjoKICBleGlzdHMgIkhhZW1vZ2xvYmluIEhiIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSGFlbW9nbG9iaW4gSGIgT2JzZXJ2YXRpb24iCmRlZmluZSAiSGFlbW9nbG9iaW4gSGIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSGFlbW9nbG9iaW4gSGIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJIYWVtb2dsb2JpbiBIYiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhhZW1vZ2xvYmluIEhiIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSGFlbW9nbG9iaW4gSGIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU0MDEgLSBQcmVnbmFuY3kgdGVzdApAYWN0aXZpdHk6IEhJVi5EMjAgRGlhZ25vc3RpY3MKQGRlc2NyaXB0aW9uOiBQcm92aWRlciBvcmRlcmVkIGEgcHJlZ25hbmN5IHRlc3QgZm9yIGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUHJlZ25hbmN5IHRlc3QiOgogIGV4aXN0cyAiUHJlZ25hbmN5IHRlc3QgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQcmVnbmFuY3kgdGVzdCBPYnNlcnZhdGlvbiIKZGVmaW5lICJQcmVnbmFuY3kgdGVzdCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQcmVnbmFuY3kgdGVzdCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlByZWduYW5jeSB0ZXN0IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUHJlZ25hbmN5IHRlc3QgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQcmVnbmFuY3kgdGVzdCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTQwMiAtIFN5cGhpbGlzIHRlc3QKQGFjdGl2aXR5OiBISVYuRDIwIERpYWdub3N0aWNzCkBkZXNjcmlwdGlvbjogUHJvdmlkZXIgb3JkZXJlZCBhIHN5cGhpbGlzIHRlc3QKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlN5cGhpbGlzIHRlc3QiOgogIGV4aXN0cyAiU3lwaGlsaXMgdGVzdCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlN5cGhpbGlzIHRlc3QgT2JzZXJ2YXRpb24iCmRlZmluZSAiU3lwaGlsaXMgdGVzdCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJTeXBoaWxpcyB0ZXN0IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU3lwaGlsaXMgdGVzdCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlN5cGhpbGlzIHRlc3QgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTeXBoaWxpcyB0ZXN0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNDAzIC0gQ2hlc3QgWC1yYXkgQ1hSCkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IFByb3ZpZGVyIG9yZGVyZWQgYSBjaGVzdCBYLXJheSAoQ1hSKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ2hlc3QgWC1yYXkgQ1hSIjoKICBleGlzdHMgIkNoZXN0IFgtcmF5IENYUiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkNoZXN0IFgtcmF5IENYUiBPYnNlcnZhdGlvbiIKZGVmaW5lICJDaGVzdCBYLXJheSBDWFIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ2hlc3QgWC1yYXkgQ1hSIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ2hlc3QgWC1yYXkgQ1hSIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ2hlc3QgWC1yYXkgQ1hSIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ2hlc3QgWC1yYXkgQ1hSICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNDA0IC0gU3B1dHVtIG9yIGN1bHR1cmUgZm9yIFRCCkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IFByb3ZpZGVyIG9yZGVyZWQgc3B1dHVtIG9yIGN1bHR1cmUgZm9yIFRCCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTcHV0dW0gb3IgY3VsdHVyZSBmb3IgVEIiOgogIGV4aXN0cyAiU3B1dHVtIG9yIGN1bHR1cmUgZm9yIFRCIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU3B1dHVtIG9yIGN1bHR1cmUgZm9yIFRCIE9ic2VydmF0aW9uIgpkZWZpbmUgIlNwdXR1bSBvciBjdWx0dXJlIGZvciBUQiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJTcHV0dW0gb3IgY3VsdHVyZSBmb3IgVEIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTcHV0dW0gb3IgY3VsdHVyZSBmb3IgVEIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTcHV0dW0gb3IgY3VsdHVyZSBmb3IgVEIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTcHV0dW0gb3IgY3VsdHVyZSBmb3IgVEIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU0MDUgLSBIQnNBZyB0ZXN0IEhCVgpAYWN0aXZpdHk6IEhJVi5EMjAgRGlhZ25vc3RpY3MKQGRlc2NyaXB0aW9uOiBQcm92aWRlciBvcmRlcmVkIGFuIEhCc0FnIHRlc3QgKEhCVikgdGVzdAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSEJzQWcgdGVzdCBIQlYiOgogIGV4aXN0cyAiSEJzQWcgdGVzdCBIQlYgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJIQnNBZyB0ZXN0IEhCViBPYnNlcnZhdGlvbiIKZGVmaW5lICJIQnNBZyB0ZXN0IEhCViBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJIQnNBZyB0ZXN0IEhCViBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkhCc0FnIHRlc3QgSEJWIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSEJzQWcgdGVzdCBIQlYgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBIQnNBZyB0ZXN0IEhCViAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTQwNiAtIEhJViB2aXJhbCBsb2FkIHRlc3Qgb3JkZXJlZApAYWN0aXZpdHk6IEhJVi5EMjAgRGlhZ25vc3RpY3MKQGRlc2NyaXB0aW9uOiBQcm92aWRlciBvcmRlcmVkIGFuIEhJViB2aXJhbCBsb2FkIHRlc3QKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhJViB2aXJhbCBsb2FkIHRlc3Qgb3JkZXJlZCI6CiAgZXhpc3RzICJISVYgdmlyYWwgbG9hZCB0ZXN0IG9yZGVyZWQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJISVYgdmlyYWwgbG9hZCB0ZXN0IG9yZGVyZWQgT2JzZXJ2YXRpb24iCmRlZmluZSAiSElWIHZpcmFsIGxvYWQgdGVzdCBvcmRlcmVkIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhJViB2aXJhbCBsb2FkIHRlc3Qgb3JkZXJlZCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkhJViB2aXJhbCBsb2FkIHRlc3Qgb3JkZXJlZCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJViB2aXJhbCBsb2FkIHRlc3Qgb3JkZXJlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhJViB2aXJhbCBsb2FkIHRlc3Qgb3JkZXJlZCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTQwNyAtIEhJViB2aXJhbCBsb2FkIHRlc3Qgc2NoZWR1bGVkCkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IFNjaGVkdWxlZCBhbiBISVYgdmlyYWwgbG9hZCB0ZXN0IHdpdGggY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJISVYgdmlyYWwgbG9hZCB0ZXN0IHNjaGVkdWxlZCI6CiAgZXhpc3RzICJISVYgdmlyYWwgbG9hZCB0ZXN0IHNjaGVkdWxlZCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkhJViB2aXJhbCBsb2FkIHRlc3Qgc2NoZWR1bGVkIE9ic2VydmF0aW9uIgpkZWZpbmUgIkhJViB2aXJhbCBsb2FkIHRlc3Qgc2NoZWR1bGVkIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhJViB2aXJhbCBsb2FkIHRlc3Qgc2NoZWR1bGVkIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSElWIHZpcmFsIGxvYWQgdGVzdCBzY2hlZHVsZWQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJISVYgdmlyYWwgbG9hZCB0ZXN0IHNjaGVkdWxlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhJViB2aXJhbCBsb2FkIHRlc3Qgc2NoZWR1bGVkICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNDA4IC0gQ0Q0IGNvdW50IG9yZGVyZWQKQGFjdGl2aXR5OiBISVYuRDIwIERpYWdub3N0aWNzCkBkZXNjcmlwdGlvbjogUHJvdmlkZXIgb3JkZXJlZCBhIENENCBjZWxsIGNvdW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDRDQgY291bnQgb3JkZXJlZCI6CiAgZXhpc3RzICJDRDQgY291bnQgb3JkZXJlZCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkNENCBjb3VudCBvcmRlcmVkIE9ic2VydmF0aW9uIgpkZWZpbmUgIkNENCBjb3VudCBvcmRlcmVkIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNENCBjb3VudCBvcmRlcmVkIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ0Q0IGNvdW50IG9yZGVyZWQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDRDQgY291bnQgb3JkZXJlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENENCBjb3VudCBvcmRlcmVkICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNDA5IC0gQ0Q0IGNvdW50IHRlc3Qgc2NoZWR1bGVkCkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IFNjaGVkdWxlZCBhIENENCB0ZXN0IHdpdGggY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDRDQgY291bnQgdGVzdCBzY2hlZHVsZWQiOgogIGV4aXN0cyAiQ0Q0IGNvdW50IHRlc3Qgc2NoZWR1bGVkIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQ0Q0IGNvdW50IHRlc3Qgc2NoZWR1bGVkIE9ic2VydmF0aW9uIgpkZWZpbmUgIkNENCBjb3VudCB0ZXN0IHNjaGVkdWxlZCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJDRDQgY291bnQgdGVzdCBzY2hlZHVsZWQgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDRDQgY291bnQgdGVzdCBzY2hlZHVsZWQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDRDQgY291bnQgdGVzdCBzY2hlZHVsZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDRDQgY291bnQgdGVzdCBzY2hlZHVsZWQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU0MTAgLSBDcnlwdG9jb2NjYWwgYW50aWdlbiB0ZXN0CkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IFByb3ZpZGVyIG9yZGVyZWQgYSBjcnlwdG9jb2NjYWwgYW50aWdlbiB0ZXN0CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDcnlwdG9jb2NjYWwgYW50aWdlbiB0ZXN0IjoKICBleGlzdHMgIkNyeXB0b2NvY2NhbCBhbnRpZ2VuIHRlc3QgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDcnlwdG9jb2NjYWwgYW50aWdlbiB0ZXN0IE9ic2VydmF0aW9uIgpkZWZpbmUgIkNyeXB0b2NvY2NhbCBhbnRpZ2VuIHRlc3QgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ3J5cHRvY29jY2FsIGFudGlnZW4gdGVzdCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNyeXB0b2NvY2NhbCBhbnRpZ2VuIHRlc3QgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDcnlwdG9jb2NjYWwgYW50aWdlbiB0ZXN0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ3J5cHRvY29jY2FsIGFudGlnZW4gdGVzdCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTQxMSAtIEhpc3RvcGxhc21vc2lzIGFudGlnZW4gdGVzdApAYWN0aXZpdHk6IEhJVi5EMjAgRGlhZ25vc3RpY3MKQGRlc2NyaXB0aW9uOiBQcm92aWRlciBvcmRlcmVkIGEgaGlzdG9wbGFzbW9zaXMgYW50aWdlbiB0ZXN0CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJIaXN0b3BsYXNtb3NpcyBhbnRpZ2VuIHRlc3QiOgogIGV4aXN0cyAiSGlzdG9wbGFzbW9zaXMgYW50aWdlbiB0ZXN0IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSGlzdG9wbGFzbW9zaXMgYW50aWdlbiB0ZXN0IE9ic2VydmF0aW9uIgpkZWZpbmUgIkhpc3RvcGxhc21vc2lzIGFudGlnZW4gdGVzdCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJIaXN0b3BsYXNtb3NpcyBhbnRpZ2VuIHRlc3QgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJIaXN0b3BsYXNtb3NpcyBhbnRpZ2VuIHRlc3QgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJIaXN0b3BsYXNtb3NpcyBhbnRpZ2VuIHRlc3QgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBIaXN0b3BsYXNtb3NpcyBhbnRpZ2VuIHRlc3QgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU0MTIgLSBDZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIHNjaGVkdWxlZApAYWN0aXZpdHk6IEhJVi5EMjggT2ZmZXIgb3RoZXIgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBTY2hlZHVsZWQgY2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyB3aXRoIGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBzY2hlZHVsZWQiOgogIGV4aXN0cyAiQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBzY2hlZHVsZWQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIHNjaGVkdWxlZCBPYnNlcnZhdGlvbiIKZGVmaW5lICJDZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIHNjaGVkdWxlZCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJDZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIHNjaGVkdWxlZCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgc2NoZWR1bGVkIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBzY2hlZHVsZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIHNjaGVkdWxlZCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTQxMyAtIERhdGUgb2Ygc2NoZWR1bGVkIG1vbml0b3JpbmcgZXhhbWluYXRpb24KQGFjdGl2aXR5OiBISVYuRDI4IE9mZmVyIG90aGVyIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogRGF0ZSBvZiBzY2hlZHVsZWQgbW9uaXRvcmluZyBleGFtaW5hdGlvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRGF0ZSBvZiBzY2hlZHVsZWQgbW9uaXRvcmluZyBleGFtaW5hdGlvbiI6CiAgRWxlbWVudHMuIkRhdGUgb2Ygc2NoZWR1bGVkIG1vbml0b3JpbmcgZXhhbWluYXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRGF0ZSBvZiBzY2hlZHVsZWQgbW9uaXRvcmluZyBleGFtaW5hdGlvbiBWYWx1ZSI6CiAgIkRhdGUgb2Ygc2NoZWR1bGVkIG1vbml0b3JpbmcgZXhhbWluYXRpb24iIE8KICByZXR1cm4gTy52YWx1ZQovKiBFbmQgb2YgRGF0ZSBvZiBzY2hlZHVsZWQgbW9uaXRvcmluZyBleGFtaW5hdGlvbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTQyNyAtIFN3aXRjaCB0byBzZWNvbmQtbGluZSBBUlQgcmVnaW1lbiByZWNvbW1lbmRlZApAYWN0aXZpdHk6IEhJVi5EMjEgRGV0ZXJtaW5lIHJlZ2ltZW4gYW5kIHRyZWF0bWVudCBvcHRpb25zCkBkZXNjcmlwdGlvbjogQSBzd2l0Y2ggdG8gc2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gaXMgcmVjb21tZW5kZWQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlN3aXRjaCB0byBzZWNvbmQtbGluZSBBUlQgcmVnaW1lbiByZWNvbW1lbmRlZCI6CiAgZXhpc3RzICJTd2l0Y2ggdG8gc2Vjb25kLWxpbmUgQVJUIHJlZ2ltZW4gcmVjb21tZW5kZWQgT2JzZXJ2YXRpb24iCmRlZmluZSAiU3dpdGNoIHRvIHNlY29uZC1saW5lIEFSVCByZWdpbWVuIHJlY29tbWVuZGVkIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU3dpdGNoIHRvIHNlY29uZC1saW5lIEFSVCByZWdpbWVuIHJlY29tbWVuZGVkIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU3dpdGNoIHRvIHNlY29uZC1saW5lIEFSVCByZWdpbWVuIHJlY29tbWVuZGVkICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNDM2IC0gUmVnaW1lbiBzdWJzdGl0dXRpb24gcmVjb21tZW5kZWQKQGFjdGl2aXR5OiBISVYuRDIzIFByZXNjcmliZQpAZGVzY3JpcHRpb246IEEgZHJ1ZyBzdWJzdGl0dXRpb24gaXMgcmVjb21tZW5kZWQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlJlZ2ltZW4gc3Vic3RpdHV0aW9uIHJlY29tbWVuZGVkIjoKICBleGlzdHMgIlJlZ2ltZW4gc3Vic3RpdHV0aW9uIHJlY29tbWVuZGVkIE9ic2VydmF0aW9uIgpkZWZpbmUgIlJlZ2ltZW4gc3Vic3RpdHV0aW9uIHJlY29tbWVuZGVkIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmVnaW1lbiBzdWJzdGl0dXRpb24gcmVjb21tZW5kZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBSZWdpbWVuIHN1YnN0aXR1dGlvbiByZWNvbW1lbmRlZCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTQzNyAtIERvc2UgYWRqdXN0bWVudCByZWNvbW1lbmRlZApAYWN0aXZpdHk6IEhJVi5EMjMgUHJlc2NyaWJlCkBkZXNjcmlwdGlvbjogQSBkb3NhZ2UgY2hhbmdlIGlzIHJlY29tbWVuZGVkCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJEb3NlIGFkanVzdG1lbnQgcmVjb21tZW5kZWQiOgogIGV4aXN0cyAiRG9zZSBhZGp1c3RtZW50IHJlY29tbWVuZGVkIE9ic2VydmF0aW9uIgpkZWZpbmUgIkRvc2UgYWRqdXN0bWVudCByZWNvbW1lbmRlZCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkRvc2UgYWRqdXN0bWVudCByZWNvbW1lbmRlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIERvc2UgYWRqdXN0bWVudCByZWNvbW1lbmRlZCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTQ0MyAtIFN1c3BpY2lvbiBvZiB0cmVhdG1lbnQgZmFpbHVyZSBvciBpbnRlcnJ1cHRpb24KQGFjdGl2aXR5OiBISVYuRDIzIFByZXNjcmliZQpAZGVzY3JpcHRpb246IENsaWVudCBoYXMgYmVlbiBvbiBBUlQsIGJ1dCBoYXMgc3RvcHBlZCB0YWtpbmcgaXQgb3IgYSB0cmVhdG1lbnQgZmFpbHVyZSBpcyBzdXNwZWN0ZWQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlN1c3BpY2lvbiBvZiB0cmVhdG1lbnQgZmFpbHVyZSBvciBpbnRlcnJ1cHRpb24iOgogIGV4aXN0cyAiU3VzcGljaW9uIG9mIHRyZWF0bWVudCBmYWlsdXJlIG9yIGludGVycnVwdGlvbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJTdXNwaWNpb24gb2YgdHJlYXRtZW50IGZhaWx1cmUgb3IgaW50ZXJydXB0aW9uIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU3VzcGljaW9uIG9mIHRyZWF0bWVudCBmYWlsdXJlIG9yIGludGVycnVwdGlvbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFN1c3BpY2lvbiBvZiB0cmVhdG1lbnQgZmFpbHVyZSBvciBpbnRlcnJ1cHRpb24gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU0NjUgLSBBZGhlcmVuY2UgY291bnNlbGxpbmcgcHJvdmlkZWQKQGFjdGl2aXR5OiBISVYuRDI0IENvdW5zZWwKQGRlc2NyaXB0aW9uOiBDb3Vuc2VsbGluZyB3YXMgY2FycmllZCBvdXQgZHVyaW5nIHZpc2l0CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBZGhlcmVuY2UgY291bnNlbGxpbmcgcHJvdmlkZWQgRC5ERTQ2NSI6CiAgZXhpc3RzICJBZGhlcmVuY2UgY291bnNlbGxpbmcgcHJvdmlkZWQgRC5ERTQ2NSBPYnNlcnZhdGlvbiIKZGVmaW5lICJBZGhlcmVuY2UgY291bnNlbGxpbmcgcHJvdmlkZWQgRC5ERTQ2NSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFkaGVyZW5jZSBjb3Vuc2VsbGluZyBwcm92aWRlZCBELkRFNDY1IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQWRoZXJlbmNlIGNvdW5zZWxsaW5nIHByb3ZpZGVkIEQuREU0NjUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU0OTYgLSBFbmhhbmNlZCBhZGhlcmVuY2UgY291bnNlbGxpbmcgcHJvdmlkZWQKQGFjdGl2aXR5OiBISVYuRDI0IENvdW5zZWwKQGRlc2NyaXB0aW9uOiBFbmhhbmNlZCBhZGhlcmVuY2UgY291bnNlbGxpbmcgd2FzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgZHVyaW5nIHRoZSB2aXNpdAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRW5oYW5jZWQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIHByb3ZpZGVkIjoKICBleGlzdHMgIkVuaGFuY2VkIGFkaGVyZW5jZSBjb3Vuc2VsbGluZyBwcm92aWRlZCBPYnNlcnZhdGlvbiIKZGVmaW5lICJFbmhhbmNlZCBhZGhlcmVuY2UgY291bnNlbGxpbmcgcHJvdmlkZWQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJFbmhhbmNlZCBhZGhlcmVuY2UgY291bnNlbGxpbmcgcHJvdmlkZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBFbmhhbmNlZCBhZGhlcmVuY2UgY291bnNlbGxpbmcgcHJvdmlkZWQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1MDcgLSBDb3Vuc2VsbGluZyBwcm92aWRlZCBvbiBkaWFnbm9zZXMKQGFjdGl2aXR5OiBISVYuRDI0IENvdW5zZWwKQGRlc2NyaXB0aW9uOiBDb3Vuc2VsbGluZyBwcm92aWRlZCBvbiBkaWFnbm9zZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNvdW5zZWxsaW5nIHByb3ZpZGVkIG9uIGRpYWdub3NlcyI6CiAgZXhpc3RzICJDb3Vuc2VsbGluZyBwcm92aWRlZCBvbiBkaWFnbm9zZXMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ291bnNlbGxpbmcgcHJvdmlkZWQgb24gZGlhZ25vc2VzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQ291bnNlbGxpbmcgcHJvdmlkZWQgb24gZGlhZ25vc2VzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ291bnNlbGxpbmcgcHJvdmlkZWQgb24gZGlhZ25vc2VzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTEwIC0gU3lwaGlsaXMgY291bnNlbGxpbmcgYW5kIHRyZWF0bWVudApAYWN0aXZpdHk6IEhJVi5EMjQgQ291bnNlbApAZGVzY3JpcHRpb246IFdoZXRoZXIgY291bnNlbGxpbmcgYW5kIHRyZWF0bWVudCB3YXMgcHJvdmlkZWQgdG8gYSBjbGllbnQgd2hvIGhhcyBiZWVuIGRpYWdub3NlZCB3aXRoIHN5cGhpbGlzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTeXBoaWxpcyBjb3Vuc2VsbGluZyBhbmQgdHJlYXRtZW50IjoKICBleGlzdHMgIlN5cGhpbGlzIGNvdW5zZWxsaW5nIGFuZCB0cmVhdG1lbnQgT2JzZXJ2YXRpb24iCmRlZmluZSAiU3lwaGlsaXMgY291bnNlbGxpbmcgYW5kIHRyZWF0bWVudCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlN5cGhpbGlzIGNvdW5zZWxsaW5nIGFuZCB0cmVhdG1lbnQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTeXBoaWxpcyBjb3Vuc2VsbGluZyBhbmQgdHJlYXRtZW50ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTE5IC0gT3RoZXIgc3VwcG9ydCBzZXJ2aWNlcwpAYWN0aXZpdHk6IEhJVi5EMjggT2ZmZXIgb3RoZXIgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBPZmZlciBvciByZWZlciBmb3Igb3RoZXIgc3VwcG9ydCBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiT3RoZXIgc3VwcG9ydCBzZXJ2aWNlcyBELkRFNTE5IjoKICBleGlzdHMgIk90aGVyIHN1cHBvcnQgc2VydmljZXMgRC5ERTUxOSBPYnNlcnZhdGlvbiIKZGVmaW5lICJPdGhlciBzdXBwb3J0IHNlcnZpY2VzIEQuREU1MTkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJPdGhlciBzdXBwb3J0IHNlcnZpY2VzIEQuREU1MTkgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBPdGhlciBzdXBwb3J0IHNlcnZpY2VzIEQuREU1MTkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1MjAgLSBNZW50YWwgaGVhbHRoIHNlcnZpY2VzCkBhY3Rpdml0eTogSElWLkQyOCBPZmZlciBvdGhlciBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBtZW50YWwgaGVhbHRoIHNlcnZpY2VzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJNZW50YWwgaGVhbHRoIHNlcnZpY2VzIEQuREU1MjAiOgogIGV4aXN0cyAiTWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBELkRFNTIwIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTWVudGFsIGhlYWx0aCBzZXJ2aWNlcyBELkRFNTIwIE9ic2VydmF0aW9uIgpkZWZpbmUgIk1lbnRhbCBoZWFsdGggc2VydmljZXMgRC5ERTUyMCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJNZW50YWwgaGVhbHRoIHNlcnZpY2VzIEQuREU1MjAgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJNZW50YWwgaGVhbHRoIHNlcnZpY2VzIEQuREU1MjAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJNZW50YWwgaGVhbHRoIHNlcnZpY2VzIEQuREU1MjAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBNZW50YWwgaGVhbHRoIHNlcnZpY2VzIEQuREU1MjAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1MjEgLSBQc3ljaG9zb2NpYWwgY291bnNlbGxpbmcsIHN1cHBvcnQgYW5kIHRyZWF0bWVudCBhZGhlcmVuY2UgY291bnNlbGxpbmcKQGFjdGl2aXR5OiBISVYuRDI4IE9mZmVyIG90aGVyIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgZm9yIHBzeWNob3NvY2lhbCBjb3Vuc2VsbGluZywgc3VwcG9ydCBhbmQgdHJlYXRtZW50IGFkaGVyZW5jZSBjb3Vuc2VsbGluZwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIEQuREU1MjEiOgogIGV4aXN0cyAiUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIEQuREU1MjEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQc3ljaG9zb2NpYWwgY291bnNlbGxpbmcsIHN1cHBvcnQgYW5kIHRyZWF0bWVudCBhZGhlcmVuY2UgY291bnNlbGxpbmcgRC5ERTUyMSBPYnNlcnZhdGlvbiIKZGVmaW5lICJQc3ljaG9zb2NpYWwgY291bnNlbGxpbmcsIHN1cHBvcnQgYW5kIHRyZWF0bWVudCBhZGhlcmVuY2UgY291bnNlbGxpbmcgRC5ERTUyMSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQc3ljaG9zb2NpYWwgY291bnNlbGxpbmcsIHN1cHBvcnQgYW5kIHRyZWF0bWVudCBhZGhlcmVuY2UgY291bnNlbGxpbmcgRC5ERTUyMSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlBzeWNob3NvY2lhbCBjb3Vuc2VsbGluZywgc3VwcG9ydCBhbmQgdHJlYXRtZW50IGFkaGVyZW5jZSBjb3Vuc2VsbGluZyBELkRFNTIxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUHN5Y2hvc29jaWFsIGNvdW5zZWxsaW5nLCBzdXBwb3J0IGFuZCB0cmVhdG1lbnQgYWRoZXJlbmNlIGNvdW5zZWxsaW5nIEQuREU1MjEgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQc3ljaG9zb2NpYWwgY291bnNlbGxpbmcsIHN1cHBvcnQgYW5kIHRyZWF0bWVudCBhZGhlcmVuY2UgY291bnNlbGxpbmcgRC5ERTUyMSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTUyMiAtIExlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMKQGFjdGl2aXR5OiBISVYuRDI4IE9mZmVyIG90aGVyIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgZm9yIGxlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkxlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMgRC5ERTUyMiI6CiAgZXhpc3RzICJMZWdhbCBhbmQgc29jaWFsIHNlcnZpY2VzIEQuREU1MjIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJMZWdhbCBhbmQgc29jaWFsIHNlcnZpY2VzIEQuREU1MjIgT2JzZXJ2YXRpb24iCmRlZmluZSAiTGVnYWwgYW5kIHNvY2lhbCBzZXJ2aWNlcyBELkRFNTIyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkxlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMgRC5ERTUyMiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkxlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMgRC5ERTUyMiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkxlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMgRC5ERTUyMiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIExlZ2FsIGFuZCBzb2NpYWwgc2VydmljZXMgRC5ERTUyMiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTUyMyAtIFNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4KQGFjdGl2aXR5OiBISVYuRDI4IE9mZmVyIG90aGVyIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgZm9yIHNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4sIGluY2x1ZGluZyBmaXJzdC1saW5lIHN1cHBvcnQgYW5kIHBzeWNob3NvY2lhbCBzdXBwb3J0LCBwb3N0LXJhcGUgY2FyZSBhbmQgb3RoZXIgc3VwcG9ydCBzZXJ2aWNlcyBpbmNsdWRpbmcgc2hlbHRlcnMsIGxlZ2FsIHNlcnZpY2VzIGFuZCB3b21lbiBhbmQgY2hpbGQgcHJvdGVjdGlvbiBzZXJ2aWNlcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2VydmljZXMgZm9yIHJlc3BvbmRpbmcgdG8gdmlvbGVuY2UgYWdhaW5zdCB3b21lbiBELkRFNTIzIjoKICBleGlzdHMgIlNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gRC5ERTUyMyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlNlcnZpY2VzIGZvciByZXNwb25kaW5nIHRvIHZpb2xlbmNlIGFnYWluc3Qgd29tZW4gRC5ERTUyMyBPYnNlcnZhdGlvbiIKZGVmaW5lICJTZXJ2aWNlcyBmb3IgcmVzcG9uZGluZyB0byB2aW9sZW5jZSBhZ2FpbnN0IHdvbWVuIEQuREU1MjMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iU2VydmljZXMgZm9yIHJlc3BvbmRpbmcgdG8gdmlvbGVuY2UgYWdhaW5zdCB3b21lbiBELkRFNTIzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU2VydmljZXMgZm9yIHJlc3BvbmRpbmcgdG8gdmlvbGVuY2UgYWdhaW5zdCB3b21lbiBELkRFNTIzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU2VydmljZXMgZm9yIHJlc3BvbmRpbmcgdG8gdmlvbGVuY2UgYWdhaW5zdCB3b21lbiBELkRFNTIzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU2VydmljZXMgZm9yIHJlc3BvbmRpbmcgdG8gdmlvbGVuY2UgYWdhaW5zdCB3b21lbiBELkRFNTIzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTI0IC0gRGF0ZS90aW1lIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudApAYWN0aXZpdHk6IEhJVi5EMjkgU2NoZWR1bGUgZm9sbG93LXVwCkBkZXNjcmlwdGlvbjogRGF0ZSB0aGUgY2xpZW50IGlzIHRvIHJldHVybiBmb3IgbW9uaXRvcmluZywgcmUtc3VwcGx5IG9yIGFueSBvdGhlciByZWFzb24KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkRhdGUvdGltZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgRC5ERTUyNCI6CiAgRWxlbWVudHMuIkRhdGUvdGltZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgRC5ERTUyNCIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEYXRlL3RpbWUgb2YgZm9sbG93LXVwIGFwcG9pbnRtZW50IEQuREU1MjQgVmFsdWUiOgogICJEYXRlL3RpbWUgb2YgZm9sbG93LXVwIGFwcG9pbnRtZW50IEQuREU1MjQiIE8KICByZXR1cm4gTy52YWx1ZQovKiBFbmQgb2YgRGF0ZS90aW1lIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudCBELkRFNTI0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTI1IC0gVHlwZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQKQGFjdGl2aXR5OiBISVYuRDI5IFNjaGVkdWxlIGZvbGxvdy11cApAZGVzY3JpcHRpb246IFdoZXRoZXIgdGhlIHZpc2l0IHdpbGwgYmUgY2xpbmljYWwgb25seSwgQVJWIGRydWcgcGljay11cCBvciBvdGhlci4gQ2xpZW50IG1heSBoYXZlIG11bHRpcGxlIGZvbGxvdy11cHMgc2NoZWR1bGVkLgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVHlwZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgRC5ERTUyNSI6CiAgZXhpc3RzICJUeXBlIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudCBELkRFNTI1IE9ic2VydmF0aW9uIgpkZWZpbmUgIlR5cGUgb2YgZm9sbG93LXVwIGFwcG9pbnRtZW50IEQuREU1MjUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUeXBlIG9mIGZvbGxvdy11cCBhcHBvaW50bWVudCBELkRFNTI1IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVHlwZSBvZiBmb2xsb3ctdXAgYXBwb2ludG1lbnQgRC5ERTUyNSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTUyNiAtIENsaW5pY2FsIHZpc2l0CkBhY3Rpdml0eTogSElWLkQyOSBTY2hlZHVsZSBmb2xsb3ctdXAKQGRlc2NyaXB0aW9uOiBBcHBvaW50bWVudCBmb3IgY2xpbmljYWwgY2FyZSBieSBhIHByb3ZpZGVyCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDbGluaWNhbCB2aXNpdCBELkRFNTI2IjoKICBleGlzdHMgIkNsaW5pY2FsIHZpc2l0IEQuREU1MjYgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDbGluaWNhbCB2aXNpdCBELkRFNTI2IE9ic2VydmF0aW9uIgpkZWZpbmUgIkNsaW5pY2FsIHZpc2l0IEQuREU1MjYgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ2xpbmljYWwgdmlzaXQgRC5ERTUyNiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNsaW5pY2FsIHZpc2l0IEQuREU1MjYgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDbGluaWNhbCB2aXNpdCBELkRFNTI2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ2xpbmljYWwgdmlzaXQgRC5ERTUyNiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTUyNyAtIEFudGlyZXRyb3ZpcmFsIGRydWcgcGljayB1cApAYWN0aXZpdHk6IEhJVi5EMjkgU2NoZWR1bGUgZm9sbG93LXVwCkBkZXNjcmlwdGlvbjogQXBwb2ludG1lbnQgZm9yIGEgZHJ1ZyBwaWNrIHVwCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBbnRpcmV0cm92aXJhbCBkcnVnIHBpY2sgdXAiOgogIGV4aXN0cyAiQW50aXJldHJvdmlyYWwgZHJ1ZyBwaWNrIHVwIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQW50aXJldHJvdmlyYWwgZHJ1ZyBwaWNrIHVwIE9ic2VydmF0aW9uIgpkZWZpbmUgIkFudGlyZXRyb3ZpcmFsIGRydWcgcGljayB1cCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBbnRpcmV0cm92aXJhbCBkcnVnIHBpY2sgdXAgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBbnRpcmV0cm92aXJhbCBkcnVnIHBpY2sgdXAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBbnRpcmV0cm92aXJhbCBkcnVnIHBpY2sgdXAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBbnRpcmV0cm92aXJhbCBkcnVnIHBpY2sgdXAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1MjggLSBQb3N0LXRyZWF0bWVudCBmb2xsb3ctdXAgdmlzaXQgZm9yIGNlcnZpY2FsIHByZWNhbmNlciBsZXNpb25zIG9yIGludmFzaXZlIGNlcnZpY2FsIGNhbmNlcgpAYWN0aXZpdHk6IEhJVi5EMjkgU2NoZWR1bGUgZm9sbG93LXVwCkBkZXNjcmlwdGlvbjogQXBwb2ludG1lbnQgZm9yIGEgcG9zdC10cmVhdG1lbnQgZm9sbG93LXVwIHZpc2l0IGZvciBjZXJ2aWNhbCBwcmVjYW5jZXIgbGVzaW9ucyBvciBpbnZhc2l2ZSBjZXJ2aWNhbCBjYW5jZXIKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBvc3QtdHJlYXRtZW50IGZvbGxvdy11cCB2aXNpdCBmb3IgY2VydmljYWwgcHJlY2FuY2VyIGxlc2lvbnMgb3IgaW52YXNpdmUgY2VydmljYWwgY2FuY2VyIEQuREU1MjgiOgogIGV4aXN0cyAiUG9zdC10cmVhdG1lbnQgZm9sbG93LXVwIHZpc2l0IGZvciBjZXJ2aWNhbCBwcmVjYW5jZXIgbGVzaW9ucyBvciBpbnZhc2l2ZSBjZXJ2aWNhbCBjYW5jZXIgRC5ERTUyOCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlBvc3QtdHJlYXRtZW50IGZvbGxvdy11cCB2aXNpdCBmb3IgY2VydmljYWwgcHJlY2FuY2VyIGxlc2lvbnMgb3IgaW52YXNpdmUgY2VydmljYWwgY2FuY2VyIEQuREU1MjggT2JzZXJ2YXRpb24iCmRlZmluZSAiUG9zdC10cmVhdG1lbnQgZm9sbG93LXVwIHZpc2l0IGZvciBjZXJ2aWNhbCBwcmVjYW5jZXIgbGVzaW9ucyBvciBpbnZhc2l2ZSBjZXJ2aWNhbCBjYW5jZXIgRC5ERTUyOCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQb3N0LXRyZWF0bWVudCBmb2xsb3ctdXAgdmlzaXQgZm9yIGNlcnZpY2FsIHByZWNhbmNlciBsZXNpb25zIG9yIGludmFzaXZlIGNlcnZpY2FsIGNhbmNlciBELkRFNTI4IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUG9zdC10cmVhdG1lbnQgZm9sbG93LXVwIHZpc2l0IGZvciBjZXJ2aWNhbCBwcmVjYW5jZXIgbGVzaW9ucyBvciBpbnZhc2l2ZSBjZXJ2aWNhbCBjYW5jZXIgRC5ERTUyOCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBvc3QtdHJlYXRtZW50IGZvbGxvdy11cCB2aXNpdCBmb3IgY2VydmljYWwgcHJlY2FuY2VyIGxlc2lvbnMgb3IgaW52YXNpdmUgY2VydmljYWwgY2FuY2VyIEQuREU1MjggT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQb3N0LXRyZWF0bWVudCBmb2xsb3ctdXAgdmlzaXQgZm9yIGNlcnZpY2FsIHByZWNhbmNlciBsZXNpb25zIG9yIGludmFzaXZlIGNlcnZpY2FsIGNhbmNlciBELkRFNTI4ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTI5IC0gT3RoZXIKQGFjdGl2aXR5OiBISVYuRDI5IFNjaGVkdWxlIGZvbGxvdy11cApAZGVzY3JpcHRpb246IE90aGVyIHJlYXNvbiBmb3IgdGhlIGZvbGxvdy11cCBhcHBvaW50bWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiT3RoZXIgRC5ERTUyOSI6CiAgZXhpc3RzICJPdGhlciBELkRFNTI5IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiT3RoZXIgRC5ERTUyOSBPYnNlcnZhdGlvbiIKZGVmaW5lICJPdGhlciBELkRFNTI5IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk90aGVyIEQuREU1MjkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJPdGhlciBELkRFNTI5IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iT3RoZXIgRC5ERTUyOSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE90aGVyIEQuREU1MjkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1MzEgLSBGb2xsb3ctdXAgdGVzdCByZWNvbW1lbmRlZCBkYXRlCkBhY3Rpdml0eTogSElWLkQyOSBTY2hlZHVsZSBmb2xsb3ctdXAKQGRlc2NyaXB0aW9uOiBBIHRlc3Qgb3Igc2NyZWVuaW5nIHJlY29tbWVuZGVkIGZvciB0aGUgY2xpZW50J3MgY2FyZSBwbGFuIGF0IGEgZnV0dXJlIGRhdGUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkZvbGxvdy11cCB0ZXN0IHJlY29tbWVuZGVkIGRhdGUiOgogIEVsZW1lbnRzLiJGb2xsb3ctdXAgdGVzdCByZWNvbW1lbmRlZCBkYXRlIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkZvbGxvdy11cCB0ZXN0IHJlY29tbWVuZGVkIGRhdGUgVmFsdWUiOgogICJGb2xsb3ctdXAgdGVzdCByZWNvbW1lbmRlZCBkYXRlIiBPCiAgcmV0dXJuIE8udmFsdWUKLyogRW5kIG9mIEZvbGxvdy11cCB0ZXN0IHJlY29tbWVuZGVkIGRhdGUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1MzcgLSBDdXJyZW50IG1lZGljYXRpb25zCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogTGlzdCBvZiBhbGwgb2YgdGhlIG1lZGljYXRpb25zIHRoZSBjbGllbnQgaXMgY3VycmVudGx5IHRha2luZwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ3VycmVudCBtZWRpY2F0aW9ucyI6CiAgZXhpc3RzICJDdXJyZW50IG1lZGljYXRpb25zIE9ic2VydmF0aW9uIgpkZWZpbmUgIkN1cnJlbnQgbWVkaWNhdGlvbnMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDdXJyZW50IG1lZGljYXRpb25zIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ3VycmVudCBtZWRpY2F0aW9ucyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTUzOCAtIE5vIG1lZGljYXRpb25zCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVGhlIGNsaWVudCBpcyBjdXJyZW50bHkgbm90IG9uIGFueSBtZWRpY2F0aW9ucwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTm8gbWVkaWNhdGlvbnMiOgogIGV4aXN0cyAiTm8gbWVkaWNhdGlvbnMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJObyBtZWRpY2F0aW9ucyBPYnNlcnZhdGlvbiIKZGVmaW5lICJObyBtZWRpY2F0aW9ucyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJObyBtZWRpY2F0aW9ucyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk5vIG1lZGljYXRpb25zIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTm8gbWVkaWNhdGlvbnMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBObyBtZWRpY2F0aW9ucyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTUzOSAtIERvbnQga25vdyBvZiBhbnkgY3VycmVudCBtZWRpY2F0aW9ucwpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoZSBjbGllbnQgZG9lcyBub3Qga25vdyBpZiBzaGUgaXMgb24gYW55IG1lZGljYXRpb25zCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJEb250IGtub3cgb2YgYW55IGN1cnJlbnQgbWVkaWNhdGlvbnMiOgogIGV4aXN0cyAiRG9udCBrbm93IG9mIGFueSBjdXJyZW50IG1lZGljYXRpb25zIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRG9udCBrbm93IG9mIGFueSBjdXJyZW50IG1lZGljYXRpb25zIE9ic2VydmF0aW9uIgpkZWZpbmUgIkRvbnQga25vdyBvZiBhbnkgY3VycmVudCBtZWRpY2F0aW9ucyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJEb250IGtub3cgb2YgYW55IGN1cnJlbnQgbWVkaWNhdGlvbnMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEb250IGtub3cgb2YgYW55IGN1cnJlbnQgbWVkaWNhdGlvbnMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJEb250IGtub3cgb2YgYW55IGN1cnJlbnQgbWVkaWNhdGlvbnMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBEb250IGtub3cgb2YgYW55IGN1cnJlbnQgbWVkaWNhdGlvbnMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1NDAgLSBBbmFsZ2VzaWMKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBbmFsZ2VzaWMgbWVkaWNhdGlvbiAocGFpbmtpbGxlcikKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFuYWxnZXNpYyI6CiAgZXhpc3RzICJBbmFsZ2VzaWMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBbmFsZ2VzaWMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQW5hbGdlc2ljIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFuYWxnZXNpYyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFuYWxnZXNpYyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFuYWxnZXNpYyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFuYWxnZXNpYyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTU0MSAtIEFudGFjaWRzCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQW50YWNpZHMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFudGFjaWRzIjoKICBleGlzdHMgIkFudGFjaWRzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQW50YWNpZHMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQW50YWNpZHMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQW50YWNpZHMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBbnRhY2lkcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFudGFjaWRzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQW50YWNpZHMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1NDIgLSBBbnRpYmlvdGljcyBicm9hZC1zcGVjdHJ1bQpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IENsaWVudCBpcyBjdXJyZW50bHkgdGFraW5nIGJyb2FkLXNwZWN0cnVtIGFudGliaW90aWNzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBbnRpYmlvdGljcyBicm9hZC1zcGVjdHJ1bSI6CiAgZXhpc3RzICJBbnRpYmlvdGljcyBicm9hZC1zcGVjdHJ1bSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFudGliaW90aWNzIGJyb2FkLXNwZWN0cnVtIE9ic2VydmF0aW9uIgpkZWZpbmUgIkFudGliaW90aWNzIGJyb2FkLXNwZWN0cnVtIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFudGliaW90aWNzIGJyb2FkLXNwZWN0cnVtIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQW50aWJpb3RpY3MgYnJvYWQtc3BlY3RydW0gT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBbnRpYmlvdGljcyBicm9hZC1zcGVjdHJ1bSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFudGliaW90aWNzIGJyb2FkLXNwZWN0cnVtICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTQzIC0gQW50aWNvbnZ1bHNpdmUKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBbnRpY29udnVsc2l2ZSBtZWRpY2F0aW9uCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBbnRpY29udnVsc2l2ZSI6CiAgZXhpc3RzICJBbnRpY29udnVsc2l2ZSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFudGljb252dWxzaXZlIE9ic2VydmF0aW9uIgpkZWZpbmUgIkFudGljb252dWxzaXZlIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFudGljb252dWxzaXZlIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQW50aWNvbnZ1bHNpdmUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBbnRpY29udnVsc2l2ZSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFudGljb252dWxzaXZlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTQ0IC0gQW50aWRpYWJldGljCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQW50aWRpYWJldGljIG1lZGljYXRpb24KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFudGlkaWFiZXRpYyI6CiAgZXhpc3RzICJBbnRpZGlhYmV0aWMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBbnRpZGlhYmV0aWMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQW50aWRpYWJldGljIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFudGlkaWFiZXRpYyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFudGlkaWFiZXRpYyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFudGlkaWFiZXRpYyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFudGlkaWFiZXRpYyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTU0NSAtIEFudGlmdW5nYWxzCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIGN1cnJlbnRseSB0YWtpbmcgYW50aWZ1bmdhbHMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFudGlmdW5nYWxzIjoKICBleGlzdHMgIkFudGlmdW5nYWxzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQW50aWZ1bmdhbHMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQW50aWZ1bmdhbHMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQW50aWZ1bmdhbHMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBbnRpZnVuZ2FscyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFudGlmdW5nYWxzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQW50aWZ1bmdhbHMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1NDYgLSBBbnRpaGVsbWludGljCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQW50aWhlbG1pbnRpYyBvciBhbnRpcGFyYXNpdGljIG1lZGljYXRpb24KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFudGloZWxtaW50aWMiOgogIGV4aXN0cyAiQW50aWhlbG1pbnRpYyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFudGloZWxtaW50aWMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQW50aWhlbG1pbnRpYyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBbnRpaGVsbWludGljIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQW50aWhlbG1pbnRpYyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFudGloZWxtaW50aWMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBbnRpaGVsbWludGljICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTQ3IC0gQW50aWh5cGVydGVuc2l2ZQpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IEFudGloeXBlcnRlbnNpdmUgbWVkaWNhdGlvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQW50aWh5cGVydGVuc2l2ZSI6CiAgZXhpc3RzICJBbnRpaHlwZXJ0ZW5zaXZlIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQW50aWh5cGVydGVuc2l2ZSBPYnNlcnZhdGlvbiIKZGVmaW5lICJBbnRpaHlwZXJ0ZW5zaXZlIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFudGloeXBlcnRlbnNpdmUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBbnRpaHlwZXJ0ZW5zaXZlIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQW50aWh5cGVydGVuc2l2ZSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFudGloeXBlcnRlbnNpdmUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1NDggLSBBbnRpbWFsYXJpYWxzCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQW50aW1hbGFyaWFsIG1lZGljYXRpb24KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFudGltYWxhcmlhbHMiOgogIGV4aXN0cyAiQW50aW1hbGFyaWFscyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFudGltYWxhcmlhbHMgT2JzZXJ2YXRpb24iCmRlZmluZSAiQW50aW1hbGFyaWFscyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBbnRpbWFsYXJpYWxzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQW50aW1hbGFyaWFscyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFudGltYWxhcmlhbHMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBbnRpbWFsYXJpYWxzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTQ5IC0gQW50aXJldHJvdmlyYWxzIEFSVnMKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBbnRpcmV0cm92aXJhbHMgKEFSVnMpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBbnRpcmV0cm92aXJhbHMgQVJWcyI6CiAgZXhpc3RzICJBbnRpcmV0cm92aXJhbHMgQVJWcyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFudGlyZXRyb3ZpcmFscyBBUlZzIE9ic2VydmF0aW9uIgpkZWZpbmUgIkFudGlyZXRyb3ZpcmFscyBBUlZzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFudGlyZXRyb3ZpcmFscyBBUlZzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQW50aXJldHJvdmlyYWxzIEFSVnMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBbnRpcmV0cm92aXJhbHMgQVJWcyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFudGlyZXRyb3ZpcmFscyBBUlZzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTUwIC0gQW50aXBhcmFzaXRpY3MKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBDbGllbnQgaXMgY3VycmVudGx5IHRha2luZyBhbnRpcGFyYXNpdGljcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQW50aXBhcmFzaXRpY3MiOgogIGV4aXN0cyAiQW50aXBhcmFzaXRpY3MgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBbnRpcGFyYXNpdGljcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJBbnRpcGFyYXNpdGljcyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBbnRpcGFyYXNpdGljcyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFudGlwYXJhc2l0aWNzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQW50aXBhcmFzaXRpY3MgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBbnRpcGFyYXNpdGljcyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTU1MSAtIEFudGl2aXJhbHMKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBbnRpdmlyYWwgbWVkaWNhdGlvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQW50aXZpcmFscyI6CiAgZXhpc3RzICJBbnRpdmlyYWxzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQW50aXZpcmFscyBPYnNlcnZhdGlvbiIKZGVmaW5lICJBbnRpdmlyYWxzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFudGl2aXJhbHMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBbnRpdmlyYWxzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQW50aXZpcmFscyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFudGl2aXJhbHMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1NTIgLSBCdXByZW5vcnBoaW5lCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogT3Bpb2lkIHN1YnN0aXR1dGlvbiB0byB0cmVhdCBvcGlvaWQgZGVwZW5kZW5jZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQnVwcmVub3JwaGluZSBELkRFNTUyIjoKICBleGlzdHMgIkJ1cHJlbm9ycGhpbmUgRC5ERTU1MiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkJ1cHJlbm9ycGhpbmUgRC5ERTU1MiBPYnNlcnZhdGlvbiIKZGVmaW5lICJCdXByZW5vcnBoaW5lIEQuREU1NTIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQnVwcmVub3JwaGluZSBELkRFNTUyIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQnVwcmVub3JwaGluZSBELkRFNTUyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQnVwcmVub3JwaGluZSBELkRFNTUyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQnVwcmVub3JwaGluZSBELkRFNTUyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTUzIC0gQ28tdHJpbW94YXpvbGUgcHJldmVudGl2ZSB0aGVyYXB5IENQVApAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IENvbWJpbmF0aW9uIG9mIHR3byBhbnRpbWljcm9iaWFsIGRydWdzIChzdWxmYW1ldGhveGF6b2xlIGFuZCB0cmltZXRob3ByaW0pIHRoYXQgY292ZXJzIGEgdmFyaWV0eSBvZiBiYWN0ZXJpYWwsIGZ1bmdhbCBhbmQgcHJvdG96b2FuIGluZmVjdGlvbnMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNvLXRyaW1veGF6b2xlIHByZXZlbnRpdmUgdGhlcmFweSBDUFQiOgogIGV4aXN0cyAiQ28tdHJpbW94YXpvbGUgcHJldmVudGl2ZSB0aGVyYXB5IENQVCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkNvLXRyaW1veGF6b2xlIHByZXZlbnRpdmUgdGhlcmFweSBDUFQgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ28tdHJpbW94YXpvbGUgcHJldmVudGl2ZSB0aGVyYXB5IENQVCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJDby10cmltb3hhem9sZSBwcmV2ZW50aXZlIHRoZXJhcHkgQ1BUIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ28tdHJpbW94YXpvbGUgcHJldmVudGl2ZSB0aGVyYXB5IENQVCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNvLXRyaW1veGF6b2xlIHByZXZlbnRpdmUgdGhlcmFweSBDUFQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDby10cmltb3hhem9sZSBwcmV2ZW50aXZlIHRoZXJhcHkgQ1BUICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTU0IC0gSG9ybW9uYWwgZmFtaWx5IHBsYW5uaW5nIG1ldGhvZApAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IEhvcm1vbmFsIGZhbWlseSBwbGFubmluZyBtZXRob2QKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhvcm1vbmFsIGZhbWlseSBwbGFubmluZyBtZXRob2QiOgogIGV4aXN0cyAiSG9ybW9uYWwgZmFtaWx5IHBsYW5uaW5nIG1ldGhvZCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkhvcm1vbmFsIGZhbWlseSBwbGFubmluZyBtZXRob2QgT2JzZXJ2YXRpb24iCmRlZmluZSAiSG9ybW9uYWwgZmFtaWx5IHBsYW5uaW5nIG1ldGhvZCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJIb3Jtb25hbCBmYW1pbHkgcGxhbm5pbmcgbWV0aG9kIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSG9ybW9uYWwgZmFtaWx5IHBsYW5uaW5nIG1ldGhvZCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhvcm1vbmFsIGZhbWlseSBwbGFubmluZyBtZXRob2QgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBIb3Jtb25hbCBmYW1pbHkgcGxhbm5pbmcgbWV0aG9kICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNTU1IC0gTWV0aGFkb25lCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogT3Bpb2lkIHN1YnN0aXR1dGlvbiB0byB0cmVhdCBvcGlvaWQgZGVwZW5kZW5jZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTWV0aGFkb25lIEQuREU1NTUiOgogIGV4aXN0cyAiTWV0aGFkb25lIEQuREU1NTUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJNZXRoYWRvbmUgRC5ERTU1NSBPYnNlcnZhdGlvbiIKZGVmaW5lICJNZXRoYWRvbmUgRC5ERTU1NSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJNZXRoYWRvbmUgRC5ERTU1NSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk1ldGhhZG9uZSBELkRFNTU1IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTWV0aGFkb25lIEQuREU1NTUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBNZXRoYWRvbmUgRC5ERTU1NSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTU1NiAtIFByRVAgdG8gcHJldmVudCBISVYKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBQcmUtZXhwb3N1cmUgcHJvcGh5bGF4aXMgKFByRVApIG1lZGljYXRpb24gZm9yIHByZXZlbnRpbmcgdGhlIGFjcXVpc2l0aW9uIG9mIEhJVgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUHJFUCB0byBwcmV2ZW50IEhJViI6CiAgZXhpc3RzICJQckVQIHRvIHByZXZlbnQgSElWIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUHJFUCB0byBwcmV2ZW50IEhJViBPYnNlcnZhdGlvbiIKZGVmaW5lICJQckVQIHRvIHByZXZlbnQgSElWIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlByRVAgdG8gcHJldmVudCBISVYgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQckVQIHRvIHByZXZlbnQgSElWIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUHJFUCB0byBwcmV2ZW50IEhJViBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFByRVAgdG8gcHJldmVudCBISVYgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1NTcgLSBPdGhlciBhbnRpYmlvdGljcwpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IE90aGVyIGFudGliaW90aWNzIG5vdCBsaXN0ZWQgYWJvdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk90aGVyIGFudGliaW90aWNzIjoKICBleGlzdHMgIk90aGVyIGFudGliaW90aWNzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiT3RoZXIgYW50aWJpb3RpY3MgT2JzZXJ2YXRpb24iCmRlZmluZSAiT3RoZXIgYW50aWJpb3RpY3MgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iT3RoZXIgYW50aWJpb3RpY3MgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJPdGhlciBhbnRpYmlvdGljcyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk90aGVyIGFudGliaW90aWNzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT3RoZXIgYW50aWJpb3RpY3MgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU1NTggLSBPdGhlciBtZWRpY2F0aW9ucwpAYWN0aXZpdHk6IEhJVi5EOCBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IE90aGVyIG1lZGljYXRpb25zIG9yIHN1cHBsZW1lbnRzIHRoYXQgYXJlIG5vdCBsaXN0ZWQgYWJvdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk90aGVyIG1lZGljYXRpb25zIjoKICBleGlzdHMgIk90aGVyIG1lZGljYXRpb25zIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiT3RoZXIgbWVkaWNhdGlvbnMgT2JzZXJ2YXRpb24iCmRlZmluZSAiT3RoZXIgbWVkaWNhdGlvbnMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iT3RoZXIgbWVkaWNhdGlvbnMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJPdGhlciBtZWRpY2F0aW9ucyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk90aGVyIG1lZGljYXRpb25zIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT3RoZXIgbWVkaWNhdGlvbnMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU2NTYgLSBEYXRlIG9mIGNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgdGVzdApAYWN0aXZpdHk6IEhJVi5EMjggT2ZmZXIgb3RoZXIgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBEYXRlIG9mIGNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgdGVzdAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRGF0ZSBvZiBjZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIHRlc3QiOgogIEVsZW1lbnRzLiJEYXRlIG9mIGNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgdGVzdCIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEYXRlIG9mIGNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgdGVzdCBWYWx1ZSI6CiAgIkRhdGUgb2YgY2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyB0ZXN0IiBPCiAgcmV0dXJuIE8udmFsdWUKLyogRW5kIG9mIERhdGUgb2YgY2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyB0ZXN0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNjU3IC0gTGlmZXRpbWUgc2NyZWVuaW5nIHRlc3QgbnVtYmVyCkBhY3Rpdml0eTogSElWLkQyOCBPZmZlciBvdGhlciBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IENsaWVudCdzIGxpZmV0aW1lIG51bWJlciBvZiBzY3JlZW5pbmdzIGZvciBjZXJ2aWNhbCBjYW5jZXIKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkxpZmV0aW1lIHNjcmVlbmluZyB0ZXN0IG51bWJlciI6CiAgRWxlbWVudHMuIkxpZmV0aW1lIHNjcmVlbmluZyB0ZXN0IG51bWJlciIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJMaWZldGltZSBzY3JlZW5pbmcgdGVzdCBudW1iZXIgVmFsdWUiOgogICJMaWZldGltZSBzY3JlZW5pbmcgdGVzdCBudW1iZXIiIE8KICByZXR1cm4gTy52YWx1ZQovKiBFbmQgb2YgTGlmZXRpbWUgc2NyZWVuaW5nIHRlc3QgbnVtYmVyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNjU4IC0gQ2VydmljYWwgY2FuY2VyIHByaW1hcnkgc2NyZWVuaW5nIHRlc3QgdHlwZQpAYWN0aXZpdHk6IEhJVi5EMjggT2ZmZXIgb3RoZXIgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBUeXBlIG9mIGNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgdGVzdCB1c2VkIGluIHByaW1hcnkgc2NyZWVuaW5nCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDZXJ2aWNhbCBjYW5jZXIgcHJpbWFyeSBzY3JlZW5pbmcgdGVzdCB0eXBlIjoKICBleGlzdHMgIkNlcnZpY2FsIGNhbmNlciBwcmltYXJ5IHNjcmVlbmluZyB0ZXN0IHR5cGUgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ2VydmljYWwgY2FuY2VyIHByaW1hcnkgc2NyZWVuaW5nIHRlc3QgdHlwZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNlcnZpY2FsIGNhbmNlciBwcmltYXJ5IHNjcmVlbmluZyB0ZXN0IHR5cGUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDZXJ2aWNhbCBjYW5jZXIgcHJpbWFyeSBzY3JlZW5pbmcgdGVzdCB0eXBlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNjU5IC0gSFBWLUROQQpAYWN0aXZpdHk6IEhJVi5EMjggT2ZmZXIgb3RoZXIgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBTY3JlZW5lZCBmb3IgY2VydmljYWwgY2FuY2VyIHVzaW5nIEhQVi1ETkEgdGVzdAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSFBWLUROQSI6CiAgZXhpc3RzICJIUFYtRE5BIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSFBWLUROQSBPYnNlcnZhdGlvbiIKZGVmaW5lICJIUFYtRE5BIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhQVi1ETkEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJIUFYtRE5BIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSFBWLUROQSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhQVi1ETkEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU2NjAgLSBWSUEKQGFjdGl2aXR5OiBISVYuRDI4IE9mZmVyIG90aGVyIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogU2NyZWVuZWQgZm9yIGNlcnZpY2FsIGNhbmNlciB1c2luZyB2aXN1YWwgaW5zcGVjdGlvbiB3aXRoIGFjZXRpYyBhY2lkIChWSUEpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJWSUEiOgogIGV4aXN0cyAiVklBIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVklBIE9ic2VydmF0aW9uIgpkZWZpbmUgIlZJQSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJWSUEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJWSUEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJWSUEgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBWSUEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU2NjEgLSBDZXJ2aWNhbCBjeXRvbG9neQpAYWN0aXZpdHk6IEhJVi5EMjggT2ZmZXIgb3RoZXIgc2VydmljZXMKQGRlc2NyaXB0aW9uOiBTY3JlZW5lZCBmb3IgY2VydmljYWwgY2FuY2VyIHVzaW5nIGNlcnZpY2FsIGN5dG9sb2d5CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDZXJ2aWNhbCBjeXRvbG9neSI6CiAgZXhpc3RzICJDZXJ2aWNhbCBjeXRvbG9neSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkNlcnZpY2FsIGN5dG9sb2d5IE9ic2VydmF0aW9uIgpkZWZpbmUgIkNlcnZpY2FsIGN5dG9sb2d5IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNlcnZpY2FsIGN5dG9sb2d5IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ2VydmljYWwgY3l0b2xvZ3kgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDZXJ2aWNhbCBjeXRvbG9neSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENlcnZpY2FsIGN5dG9sb2d5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNjYyIC0gT3RoZXIKQGFjdGl2aXR5OiBISVYuRDI4IE9mZmVyIG90aGVyIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogU2NyZWVuZWQgZm9yIGNlcnZpY2FsIGNhbmNlciB1c2luZyBvdGhlciBtZXRob2QKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk90aGVyIEQuREU2NjIiOgogIGV4aXN0cyAiT3RoZXIgRC5ERTY2MiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk90aGVyIEQuREU2NjIgT2JzZXJ2YXRpb24iCmRlZmluZSAiT3RoZXIgRC5ERTY2MiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJPdGhlciBELkRFNjYyIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiT3RoZXIgRC5ERTY2MiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk90aGVyIEQuREU2NjIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBPdGhlciBELkRFNjYyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNzQ1IC0gQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBpbnRlcnZhbCBhbW9uZ3N0IFdMSElWCkBhY3Rpdml0eTogSElWLkQyOCBPZmZlciBvdGhlciBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IENvdW50cnktc3BlY2lmaWMgaW50ZXJ2YWwgYmV0d2VlbiBjYW5jZXIgc2NyZWVuaW5ncyBhbW9uZ3N0IHdvbWVuIGxpdmluZyB3aXRoIEhJViAodHlwaWNhbGx5IDMgb3IgNSB5ZWFycykKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgaW50ZXJ2YWwgYW1vbmdzdCBXTEhJViI6CiAgRWxlbWVudHMuIkNlcnZpY2FsIGNhbmNlciBzY3JlZW5pbmcgaW50ZXJ2YWwgYW1vbmdzdCBXTEhJViIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIGludGVydmFsIGFtb25nc3QgV0xISVYgVmFsdWUiOgogICJDZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nIGludGVydmFsIGFtb25nc3QgV0xISVYiIE8KICByZXR1cm4gTy52YWx1ZQovKiBFbmQgb2YgQ2VydmljYWwgY2FuY2VyIHNjcmVlbmluZyBpbnRlcnZhbCBhbW9uZ3N0IFdMSElWICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNzUzIC0gT2ZmZXIgb3RoZXIgY2xpbmljYWwgc2VydmljZXMKQGFjdGl2aXR5OiBISVYuRDI4IE9mZmVyIG90aGVyIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT3RoZXIgY2xpbmljYWwgc2VydmljZXMgb2ZmZXJlZCBvciByZWZlcnJhbHMgZ2l2ZW4gdG8gdGhlIGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiT2ZmZXIgb3RoZXIgY2xpbmljYWwgc2VydmljZXMgRC5ERTc1MyI6CiAgZXhpc3RzICJPZmZlciBvdGhlciBjbGluaWNhbCBzZXJ2aWNlcyBELkRFNzUzIE9ic2VydmF0aW9uIgpkZWZpbmUgIk9mZmVyIG90aGVyIGNsaW5pY2FsIHNlcnZpY2VzIEQuREU3NTMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJPZmZlciBvdGhlciBjbGluaWNhbCBzZXJ2aWNlcyBELkRFNzUzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT2ZmZXIgb3RoZXIgY2xpbmljYWwgc2VydmljZXMgRC5ERTc1MyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTc1NCAtIEFzc2Vzc21lbnQgYW5kIHByb3Zpc2lvbiBvZiB2YWNjaW5hdGlvbnMKQGFjdGl2aXR5OiBISVYuRDI4IE9mZmVyIG90aGVyIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucywgc3VjaCBhcyBmb3IgcGVvcGxlIGZyb20gS2V5IHBvcHVsYXRpb24gbWVtYmVyIHR5cGUsIHByZWduYW50IHdvbWVuIGFuZCBpbmZhbnRzOyBhbmQsIHdoZXJlIGFwcHJvcHJpYXRlLCB0ZXRhbnVzIHZhY2NpbmF0aW9uIGZvciBhZG9sZXNjZW50IGJveXMgYW5kIG1lbiByZWNlaXZpbmcgVk1NQwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBELkRFNzU0IjoKICBleGlzdHMgIkFzc2Vzc21lbnQgYW5kIHByb3Zpc2lvbiBvZiB2YWNjaW5hdGlvbnMgRC5ERTc1NCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFzc2Vzc21lbnQgYW5kIHByb3Zpc2lvbiBvZiB2YWNjaW5hdGlvbnMgRC5ERTc1NCBPYnNlcnZhdGlvbiIKZGVmaW5lICJBc3Nlc3NtZW50IGFuZCBwcm92aXNpb24gb2YgdmFjY2luYXRpb25zIEQuREU3NTQgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBELkRFNzU0IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBELkRFNzU0IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBELkRFNzU0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQXNzZXNzbWVudCBhbmQgcHJvdmlzaW9uIG9mIHZhY2NpbmF0aW9ucyBELkRFNzU0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFNzU1IC0gSGVwYXRpdGlzIEIgSEJWIGFuZCBoZXBhdGl0aXMgQyB2aXJ1cyBIQ1YgdGVzdGluZyBhbmQgdHJlYXRtZW50CkBhY3Rpdml0eTogSElWLkQyOCBPZmZlciBvdGhlciBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBIQlYgYW5kL29yIEhDViB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhlcGF0aXRpcyBCIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCI6CiAgZXhpc3RzICJIZXBhdGl0aXMgQiBIQlYgYW5kIGhlcGF0aXRpcyBDIHZpcnVzIEhDViB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJIZXBhdGl0aXMgQiBIQlYgYW5kIGhlcGF0aXRpcyBDIHZpcnVzIEhDViB0ZXN0aW5nIGFuZCB0cmVhdG1lbnQgT2JzZXJ2YXRpb24iCmRlZmluZSAiSGVwYXRpdGlzIEIgSEJWIGFuZCBoZXBhdGl0aXMgQyB2aXJ1cyBIQ1YgdGVzdGluZyBhbmQgdHJlYXRtZW50IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhlcGF0aXRpcyBCIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkhlcGF0aXRpcyBCIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhlcGF0aXRpcyBCIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhlcGF0aXRpcyBCIEhCViBhbmQgaGVwYXRpdGlzIEMgdmlydXMgSENWIHRlc3RpbmcgYW5kIHRyZWF0bWVudCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTc1NiAtIENvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBwbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEKQGFjdGl2aXR5OiBISVYuRDI4IE9mZmVyIG90aGVyIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgZm9yIGNvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBwbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBwbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEgRC5ERTc1NiI6CiAgZXhpc3RzICJDby10cmltb3hhem9sZSBjaGVtb3Byb3BoeWxheGlzIHRvIHByZXZlbnQgcG5ldW1vY3lzdGlzIGNhcmluaWkgcG5ldW1vbmlhIEQuREU3NTYgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDby10cmltb3hhem9sZSBjaGVtb3Byb3BoeWxheGlzIHRvIHByZXZlbnQgcG5ldW1vY3lzdGlzIGNhcmluaWkgcG5ldW1vbmlhIEQuREU3NTYgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ28tdHJpbW94YXpvbGUgY2hlbW9wcm9waHlsYXhpcyB0byBwcmV2ZW50IHBuZXVtb2N5c3RpcyBjYXJpbmlpIHBuZXVtb25pYSBELkRFNzU2IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBwbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEgRC5ERTc1NiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBwbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEgRC5ERTc1NiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBwbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEgRC5ERTc1NiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENvLXRyaW1veGF6b2xlIGNoZW1vcHJvcGh5bGF4aXMgdG8gcHJldmVudCBwbmV1bW9jeXN0aXMgY2FyaW5paSBwbmV1bW9uaWEgRC5ERTc1NiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTc1NyAtIEludGVuc2lmaWVkIFRCIGNhc2UgZmluZGluZyBhbmQgbGlua2FnZSB0byBUQiB0cmVhdG1lbnQKQGFjdGl2aXR5OiBISVYuRDI4IE9mZmVyIG90aGVyIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgZm9yIGludGVuc2lmaWVkIFRCIGNhc2UgZmluZGluZyBhbmQgbGlua2FnZSB0byBUQiB0cmVhdG1lbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkludGVuc2lmaWVkIFRCIGNhc2UgZmluZGluZyBhbmQgbGlua2FnZSB0byBUQiB0cmVhdG1lbnQgRC5ERTc1NyI6CiAgZXhpc3RzICJJbnRlbnNpZmllZCBUQiBjYXNlIGZpbmRpbmcgYW5kIGxpbmthZ2UgdG8gVEIgdHJlYXRtZW50IEQuREU3NTcgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJJbnRlbnNpZmllZCBUQiBjYXNlIGZpbmRpbmcgYW5kIGxpbmthZ2UgdG8gVEIgdHJlYXRtZW50IEQuREU3NTcgT2JzZXJ2YXRpb24iCmRlZmluZSAiSW50ZW5zaWZpZWQgVEIgY2FzZSBmaW5kaW5nIGFuZCBsaW5rYWdlIHRvIFRCIHRyZWF0bWVudCBELkRFNzU3IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkludGVuc2lmaWVkIFRCIGNhc2UgZmluZGluZyBhbmQgbGlua2FnZSB0byBUQiB0cmVhdG1lbnQgRC5ERTc1NyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkludGVuc2lmaWVkIFRCIGNhc2UgZmluZGluZyBhbmQgbGlua2FnZSB0byBUQiB0cmVhdG1lbnQgRC5ERTc1NyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkludGVuc2lmaWVkIFRCIGNhc2UgZmluZGluZyBhbmQgbGlua2FnZSB0byBUQiB0cmVhdG1lbnQgRC5ERTc1NyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEludGVuc2lmaWVkIFRCIGNhc2UgZmluZGluZyBhbmQgbGlua2FnZSB0byBUQiB0cmVhdG1lbnQgRC5ERTc1NyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTc1OCAtIFByb3Zpc2lvbiBvZiBpc29uaWF6aWQgcHJldmVudGl2ZSB0aGVyYXB5IGlmIHBlcnNvbiBkb2VzIG5vdCBoYXZlIFRCCkBhY3Rpdml0eTogSElWLkQyOCBPZmZlciBvdGhlciBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IE9mZmVyIG9yIHJlZmVyIGZvciBwcm92aXNpb24gb2YgaXNvbmlhemlkIHByZXZlbnRpdmUgdGhlcmFweSBpZiBwZXJzb24gZG9lcyBub3QgaGF2ZSBUQgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUHJvdmlzaW9uIG9mIGlzb25pYXppZCBwcmV2ZW50aXZlIHRoZXJhcHkgaWYgcGVyc29uIGRvZXMgbm90IGhhdmUgVEIgRC5ERTc1OCI6CiAgZXhpc3RzICJQcm92aXNpb24gb2YgaXNvbmlhemlkIHByZXZlbnRpdmUgdGhlcmFweSBpZiBwZXJzb24gZG9lcyBub3QgaGF2ZSBUQiBELkRFNzU4IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUHJvdmlzaW9uIG9mIGlzb25pYXppZCBwcmV2ZW50aXZlIHRoZXJhcHkgaWYgcGVyc29uIGRvZXMgbm90IGhhdmUgVEIgRC5ERTc1OCBPYnNlcnZhdGlvbiIKZGVmaW5lICJQcm92aXNpb24gb2YgaXNvbmlhemlkIHByZXZlbnRpdmUgdGhlcmFweSBpZiBwZXJzb24gZG9lcyBub3QgaGF2ZSBUQiBELkRFNzU4IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlByb3Zpc2lvbiBvZiBpc29uaWF6aWQgcHJldmVudGl2ZSB0aGVyYXB5IGlmIHBlcnNvbiBkb2VzIG5vdCBoYXZlIFRCIEQuREU3NTggQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQcm92aXNpb24gb2YgaXNvbmlhemlkIHByZXZlbnRpdmUgdGhlcmFweSBpZiBwZXJzb24gZG9lcyBub3QgaGF2ZSBUQiBELkRFNzU4IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUHJvdmlzaW9uIG9mIGlzb25pYXppZCBwcmV2ZW50aXZlIHRoZXJhcHkgaWYgcGVyc29uIGRvZXMgbm90IGhhdmUgVEIgRC5ERTc1OCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFByb3Zpc2lvbiBvZiBpc29uaWF6aWQgcHJldmVudGl2ZSB0aGVyYXB5IGlmIHBlcnNvbiBkb2VzIG5vdCBoYXZlIFRCIEQuREU3NTggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU3NTkgLSBNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kKQGFjdGl2aXR5OiBISVYuRDI4IE9mZmVyIG90aGVyIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogT2ZmZXIgb3IgcmVmZXIgZm9yIG1hbGFyaWEgcHJldmVudGlvbiAoc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMpLCBkZXBlbmRpbmcgb24gZXBpZGVtaW9sb2d5CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kgRC5ERTc1OSI6CiAgZXhpc3RzICJNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kgRC5ERTc1OSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk1hbGFyaWEgcHJldmVudGlvbiBzdWNoIGFzIGJlZCBuZXRzIGFuZCBwcm9waHlsYXhpcywgZGVwZW5kaW5nIG9uIGVwaWRlbWlvbG9neSBELkRFNzU5IE9ic2VydmF0aW9uIgpkZWZpbmUgIk1hbGFyaWEgcHJldmVudGlvbiBzdWNoIGFzIGJlZCBuZXRzIGFuZCBwcm9waHlsYXhpcywgZGVwZW5kaW5nIG9uIGVwaWRlbWlvbG9neSBELkRFNzU5IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk1hbGFyaWEgcHJldmVudGlvbiBzdWNoIGFzIGJlZCBuZXRzIGFuZCBwcm9waHlsYXhpcywgZGVwZW5kaW5nIG9uIGVwaWRlbWlvbG9neSBELkRFNzU5IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTWFsYXJpYSBwcmV2ZW50aW9uIHN1Y2ggYXMgYmVkIG5ldHMgYW5kIHByb3BoeWxheGlzLCBkZXBlbmRpbmcgb24gZXBpZGVtaW9sb2d5IEQuREU3NTkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJNYWxhcmlhIHByZXZlbnRpb24gc3VjaCBhcyBiZWQgbmV0cyBhbmQgcHJvcGh5bGF4aXMsIGRlcGVuZGluZyBvbiBlcGlkZW1pb2xvZ3kgRC5ERTc1OSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE1hbGFyaWEgcHJldmVudGlvbiBzdWNoIGFzIGJlZCBuZXRzIGFuZCBwcm9waHlsYXhpcywgZGVwZW5kaW5nIG9uIGVwaWRlbWlvbG9neSBELkRFNzU5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFODAyIC0gU3lwaGlsaXMgdGVzdCByZXN1bHQKQGFjdGl2aXR5OiBISVYuRDI2IE9mZmVyIHNleHVhbCBhbmQgcmVwcm9kdWN0aXZlIGhlYWx0aCBzZXJ2aWNlcwpAZGVzY3JpcHRpb246IFJlc3VsdCBmcm9tIHN5cGhpbGlzIHRlc3QKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlN5cGhpbGlzIHRlc3QgcmVzdWx0IEQuREU4MDIiOgogIGV4aXN0cyAiU3lwaGlsaXMgdGVzdCByZXN1bHQgRC5ERTgwMiBPYnNlcnZhdGlvbiIKZGVmaW5lICJTeXBoaWxpcyB0ZXN0IHJlc3VsdCBELkRFODAyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU3lwaGlsaXMgdGVzdCByZXN1bHQgRC5ERTgwMiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFN5cGhpbGlzIHRlc3QgcmVzdWx0IEQuREU4MDIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU4MDMgLSBQb3NpdGl2ZQpAYWN0aXZpdHk6IEhJVi5EMjYgT2ZmZXIgc2V4dWFsIGFuZCByZXByb2R1Y3RpdmUgaGVhbHRoIHNlcnZpY2VzCkBkZXNjcmlwdGlvbjogVGVzdCByZXN1bHQgaXMgcG9zaXRpdmUgZm9yIHN5cGhpbGlzCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQb3NpdGl2ZSBELkRFODAzIjoKICBleGlzdHMgIlBvc2l0aXZlIEQuREU4MDMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQb3NpdGl2ZSBELkRFODAzIE9ic2VydmF0aW9uIgpkZWZpbmUgIlBvc2l0aXZlIEQuREU4MDMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUG9zaXRpdmUgRC5ERTgwMyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlBvc2l0aXZlIEQuREU4MDMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQb3NpdGl2ZSBELkRFODAzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUG9zaXRpdmUgRC5ERTgwMyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTgwNCAtIE5lZ2F0aXZlCkBhY3Rpdml0eTogSElWLkQyNiBPZmZlciBzZXh1YWwgYW5kIHJlcHJvZHVjdGl2ZSBoZWFsdGggc2VydmljZXMKQGRlc2NyaXB0aW9uOiBUZXN0IHJlc3VsdCBpcyBuZWdhdGl2ZSBmb3Igc3lwaGlsaXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk5lZ2F0aXZlIEQuREU4MDQiOgogIGV4aXN0cyAiTmVnYXRpdmUgRC5ERTgwNCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk5lZ2F0aXZlIEQuREU4MDQgT2JzZXJ2YXRpb24iCmRlZmluZSAiTmVnYXRpdmUgRC5ERTgwNCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJOZWdhdGl2ZSBELkRFODA0IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTmVnYXRpdmUgRC5ERTgwNCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk5lZ2F0aXZlIEQuREU4MDQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBOZWdhdGl2ZSBELkRFODA0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFODA1IC0gSW5jb25jbHVzaXZlCkBhY3Rpdml0eTogSElWLkQyNiBPZmZlciBzZXh1YWwgYW5kIHJlcHJvZHVjdGl2ZSBoZWFsdGggc2VydmljZXMKQGRlc2NyaXB0aW9uOiBUZXN0IHJlc3VsdCBpcyBpbmNvbmNsdXNpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkluY29uY2x1c2l2ZSBELkRFODA1IjoKICBleGlzdHMgIkluY29uY2x1c2l2ZSBELkRFODA1IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSW5jb25jbHVzaXZlIEQuREU4MDUgT2JzZXJ2YXRpb24iCmRlZmluZSAiSW5jb25jbHVzaXZlIEQuREU4MDUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW5jb25jbHVzaXZlIEQuREU4MDUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJJbmNvbmNsdXNpdmUgRC5ERTgwNSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkluY29uY2x1c2l2ZSBELkRFODA1IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW5jb25jbHVzaXZlIEQuREU4MDUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MDMgLSBNZWRpY2F0aW9uL2RydWcKQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IEN1cnJlbnQgb3IgY29uc2lkZXJlZCBtZWRpY2F0aW9uL2RydWcsIGZvciB0aGUgcHVycG9zZSBvZiBkZXRlcm1pbmluZyBkcnVnIGludGVyYWN0aW9ucwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTWVkaWNhdGlvbi9kcnVnIjoKICBleGlzdHMgIk1lZGljYXRpb24vZHJ1ZyBPYnNlcnZhdGlvbiIKZGVmaW5lICJNZWRpY2F0aW9uL2RydWcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJNZWRpY2F0aW9uL2RydWcgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBNZWRpY2F0aW9uL2RydWcgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MDQgLSBSaWZhbXBpY2luCkBhY3Rpdml0eTogSElWLkQyMSBEZXRlcm1pbmUgcmVnaW1lbiBhbmQgdHJlYXRtZW50IG9wdGlvbnMKQGRlc2NyaXB0aW9uOiBSaWZhbXBpY2luIGN1cnJlbnRseSBiZWluZyB0YWtlbiBieSwgb3IgY29uc2lkZXJlZCBmb3IsIGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmlmYW1waWNpbiI6CiAgZXhpc3RzICJSaWZhbXBpY2luIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmlmYW1waWNpbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJSaWZhbXBpY2luIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJpZmFtcGljaW4gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSaWZhbXBpY2luIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmlmYW1waWNpbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJpZmFtcGljaW4gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MDUgLSBIYWxvZmFudHJpbmUKQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IEhhbG9mYW50cmluZSBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhhbG9mYW50cmluZSI6CiAgZXhpc3RzICJIYWxvZmFudHJpbmUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJIYWxvZmFudHJpbmUgT2JzZXJ2YXRpb24iCmRlZmluZSAiSGFsb2ZhbnRyaW5lIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhhbG9mYW50cmluZSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkhhbG9mYW50cmluZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhhbG9mYW50cmluZSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhhbG9mYW50cmluZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkwNiAtIExvdmFzdGF0aW4KQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IExvdmFzdGF0aW4gY3VycmVudGx5IGJlaW5nIHRha2VuIGJ5LCBvciBjb25zaWRlcmVkIGZvciwgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJMb3Zhc3RhdGluIjoKICBleGlzdHMgIkxvdmFzdGF0aW4gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJMb3Zhc3RhdGluIE9ic2VydmF0aW9uIgpkZWZpbmUgIkxvdmFzdGF0aW4gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTG92YXN0YXRpbiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkxvdmFzdGF0aW4gT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJMb3Zhc3RhdGluIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTG92YXN0YXRpbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkwNyAtIFNpbXZhc3RhdGluCkBhY3Rpdml0eTogSElWLkQyMSBEZXRlcm1pbmUgcmVnaW1lbiBhbmQgdHJlYXRtZW50IG9wdGlvbnMKQGRlc2NyaXB0aW9uOiBTaW12YXN0YXRpbiBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlNpbXZhc3RhdGluIjoKICBleGlzdHMgIlNpbXZhc3RhdGluIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU2ltdmFzdGF0aW4gT2JzZXJ2YXRpb24iCmRlZmluZSAiU2ltdmFzdGF0aW4gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iU2ltdmFzdGF0aW4gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTaW12YXN0YXRpbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNpbXZhc3RhdGluIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU2ltdmFzdGF0aW4gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MDggLSBIb3Jtb25hbCBjb250cmFjZXB0aW9uCkBhY3Rpdml0eTogSElWLkQyMSBEZXRlcm1pbmUgcmVnaW1lbiBhbmQgdHJlYXRtZW50IG9wdGlvbnMKQGRlc2NyaXB0aW9uOiBIb3Jtb25hbCBjb250cmFjZXB0aW9uIGN1cnJlbnRseSBiZWluZyB0YWtlbiBieSwgb3IgY29uc2lkZXJlZCBmb3IsIGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSG9ybW9uYWwgY29udHJhY2VwdGlvbiI6CiAgZXhpc3RzICJIb3Jtb25hbCBjb250cmFjZXB0aW9uIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSG9ybW9uYWwgY29udHJhY2VwdGlvbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJIb3Jtb25hbCBjb250cmFjZXB0aW9uIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkhvcm1vbmFsIGNvbnRyYWNlcHRpb24gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJIb3Jtb25hbCBjb250cmFjZXB0aW9uIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSG9ybW9uYWwgY29udHJhY2VwdGlvbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhvcm1vbmFsIGNvbnRyYWNlcHRpb24gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MDkgLSBNZXRmb3JtaW4KQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IE1ldGZvcm1pbiBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk1ldGZvcm1pbiI6CiAgZXhpc3RzICJNZXRmb3JtaW4gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJNZXRmb3JtaW4gT2JzZXJ2YXRpb24iCmRlZmluZSAiTWV0Zm9ybWluIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk1ldGZvcm1pbiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk1ldGZvcm1pbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk1ldGZvcm1pbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE1ldGZvcm1pbiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkxMCAtIEFzdGVtaXpvbGUKQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IEFzdGVtaXpvbGUgY3VycmVudGx5IGJlaW5nIHRha2VuIGJ5LCBvciBjb25zaWRlcmVkIGZvciwgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBc3RlbWl6b2xlIjoKICBleGlzdHMgIkFzdGVtaXpvbGUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBc3RlbWl6b2xlIE9ic2VydmF0aW9uIgpkZWZpbmUgIkFzdGVtaXpvbGUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQXN0ZW1pem9sZSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFzdGVtaXpvbGUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBc3RlbWl6b2xlIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQXN0ZW1pem9sZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkxMSAtIFRlcmZlbmFkaW5lCkBhY3Rpdml0eTogSElWLkQyMSBEZXRlcm1pbmUgcmVnaW1lbiBhbmQgdHJlYXRtZW50IG9wdGlvbnMKQGRlc2NyaXB0aW9uOiBUZXJmZW5hZGluZSBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRlcmZlbmFkaW5lIjoKICBleGlzdHMgIlRlcmZlbmFkaW5lIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVGVyZmVuYWRpbmUgT2JzZXJ2YXRpb24iCmRlZmluZSAiVGVyZmVuYWRpbmUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVGVyZmVuYWRpbmUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJUZXJmZW5hZGluZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlRlcmZlbmFkaW5lIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVGVyZmVuYWRpbmUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MTIgLSBUREYKQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IFRERiBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRERiBELkRFOTEyIjoKICBleGlzdHMgIlRERiBELkRFOTEyIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVERGIEQuREU5MTIgT2JzZXJ2YXRpb24iCmRlZmluZSAiVERGIEQuREU5MTIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVERGIEQuREU5MTIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJUREYgRC5ERTkxMiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlRERiBELkRFOTEyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVERGIEQuREU5MTIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MTMgLSBTaW1lcHJldmlyCkBhY3Rpdml0eTogSElWLkQyMSBEZXRlcm1pbmUgcmVnaW1lbiBhbmQgdHJlYXRtZW50IG9wdGlvbnMKQGRlc2NyaXB0aW9uOiBTaW1lcHJldmlyIGN1cnJlbnRseSBiZWluZyB0YWtlbiBieSwgb3IgY29uc2lkZXJlZCBmb3IsIGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2ltZXByZXZpciI6CiAgZXhpc3RzICJTaW1lcHJldmlyIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU2ltZXByZXZpciBPYnNlcnZhdGlvbiIKZGVmaW5lICJTaW1lcHJldmlyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNpbWVwcmV2aXIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTaW1lcHJldmlyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU2ltZXByZXZpciBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNpbWVwcmV2aXIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MTQgLSBPbWJpdGFzdmlyICsgcGFyaXRhcHJldmlyL3JpdG9uYXZpciArIGRhc2FidXZpcgpAYWN0aXZpdHk6IEhJVi5EMjEgRGV0ZXJtaW5lIHJlZ2ltZW4gYW5kIHRyZWF0bWVudCBvcHRpb25zCkBkZXNjcmlwdGlvbjogT21iaXRhc3ZpciArIHBhcml0YXByZXZpci9yaXRvbmF2aXIgKyBkYXNhYnV2aXIgY3VycmVudGx5IGJlaW5nIHRha2VuIGJ5LCBvciBjb25zaWRlcmVkIGZvciwgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJPbWJpdGFzdmlyICsgcGFyaXRhcHJldmlyL3JpdG9uYXZpciArIGRhc2FidXZpciI6CiAgZXhpc3RzICJPbWJpdGFzdmlyICsgcGFyaXRhcHJldmlyL3JpdG9uYXZpciArIGRhc2FidXZpciBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk9tYml0YXN2aXIgKyBwYXJpdGFwcmV2aXIvcml0b25hdmlyICsgZGFzYWJ1dmlyIE9ic2VydmF0aW9uIgpkZWZpbmUgIk9tYml0YXN2aXIgKyBwYXJpdGFwcmV2aXIvcml0b25hdmlyICsgZGFzYWJ1dmlyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk9tYml0YXN2aXIgKyBwYXJpdGFwcmV2aXIvcml0b25hdmlyICsgZGFzYWJ1dmlyIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiT21iaXRhc3ZpciArIHBhcml0YXByZXZpci9yaXRvbmF2aXIgKyBkYXNhYnV2aXIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJPbWJpdGFzdmlyICsgcGFyaXRhcHJldmlyL3JpdG9uYXZpciArIGRhc2FidXZpciBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE9tYml0YXN2aXIgKyBwYXJpdGFwcmV2aXIvcml0b25hdmlyICsgZGFzYWJ1dmlyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTE1IC0gTWV0aGFkb25lCkBhY3Rpdml0eTogSElWLkQyMSBEZXRlcm1pbmUgcmVnaW1lbiBhbmQgdHJlYXRtZW50IG9wdGlvbnMKQGRlc2NyaXB0aW9uOiBNZXRoYWRvbmUgY3VycmVudGx5IGJlaW5nIHRha2VuIGJ5LCBvciBjb25zaWRlcmVkIGZvciwgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJNZXRoYWRvbmUgRC5ERTkxNSI6CiAgZXhpc3RzICJNZXRoYWRvbmUgRC5ERTkxNSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk1ldGhhZG9uZSBELkRFOTE1IE9ic2VydmF0aW9uIgpkZWZpbmUgIk1ldGhhZG9uZSBELkRFOTE1IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk1ldGhhZG9uZSBELkRFOTE1IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTWV0aGFkb25lIEQuREU5MTUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJNZXRoYWRvbmUgRC5ERTkxNSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE1ldGhhZG9uZSBELkRFOTE1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTE2IC0gQnVwcmVub3JwaGluZQpAYWN0aXZpdHk6IEhJVi5EMjEgRGV0ZXJtaW5lIHJlZ2ltZW4gYW5kIHRyZWF0bWVudCBvcHRpb25zCkBkZXNjcmlwdGlvbjogQnVwcmVub3JwaGluZSBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkJ1cHJlbm9ycGhpbmUgRC5ERTkxNiI6CiAgZXhpc3RzICJCdXByZW5vcnBoaW5lIEQuREU5MTYgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJCdXByZW5vcnBoaW5lIEQuREU5MTYgT2JzZXJ2YXRpb24iCmRlZmluZSAiQnVwcmVub3JwaGluZSBELkRFOTE2IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkJ1cHJlbm9ycGhpbmUgRC5ERTkxNiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkJ1cHJlbm9ycGhpbmUgRC5ERTkxNiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkJ1cHJlbm9ycGhpbmUgRC5ERTkxNiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEJ1cHJlbm9ycGhpbmUgRC5ERTkxNiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkxNyAtIERvZmV0aWxpZGUKQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IERvZmV0aWxpZGUgY3VycmVudGx5IGJlaW5nIHRha2VuIGJ5LCBvciBjb25zaWRlcmVkIGZvciwgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJEb2ZldGlsaWRlIjoKICBleGlzdHMgIkRvZmV0aWxpZGUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJEb2ZldGlsaWRlIE9ic2VydmF0aW9uIgpkZWZpbmUgIkRvZmV0aWxpZGUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRG9mZXRpbGlkZSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkRvZmV0aWxpZGUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJEb2ZldGlsaWRlIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRG9mZXRpbGlkZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkxOCAtIENhcmJhbWF6ZXBpbmUKQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IENhcmJhbWF6ZXBpbmUgY3VycmVudGx5IGJlaW5nIHRha2VuIGJ5LCBvciBjb25zaWRlcmVkIGZvciwgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDYXJiYW1hemVwaW5lIjoKICBleGlzdHMgIkNhcmJhbWF6ZXBpbmUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDYXJiYW1hemVwaW5lIE9ic2VydmF0aW9uIgpkZWZpbmUgIkNhcmJhbWF6ZXBpbmUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ2FyYmFtYXplcGluZSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNhcmJhbWF6ZXBpbmUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDYXJiYW1hemVwaW5lIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ2FyYmFtYXplcGluZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkxOSAtIFBoZW5vYmFyYml0YWwKQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IFBoZW5vYmFyYml0YWwgY3VycmVudGx5IGJlaW5nIHRha2VuIGJ5LCBvciBjb25zaWRlcmVkIGZvciwgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQaGVub2JhcmJpdGFsIjoKICBleGlzdHMgIlBoZW5vYmFyYml0YWwgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQaGVub2JhcmJpdGFsIE9ic2VydmF0aW9uIgpkZWZpbmUgIlBoZW5vYmFyYml0YWwgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUGhlbm9iYXJiaXRhbCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlBoZW5vYmFyYml0YWwgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQaGVub2JhcmJpdGFsIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUGhlbm9iYXJiaXRhbCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkyMCAtIFBoZW55dG9pbgpAYWN0aXZpdHk6IEhJVi5EMjEgRGV0ZXJtaW5lIHJlZ2ltZW4gYW5kIHRyZWF0bWVudCBvcHRpb25zCkBkZXNjcmlwdGlvbjogUGhlbnl0b2luIGN1cnJlbnRseSBiZWluZyB0YWtlbiBieSwgb3IgY29uc2lkZXJlZCBmb3IsIGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUGhlbnl0b2luIjoKICBleGlzdHMgIlBoZW55dG9pbiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlBoZW55dG9pbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJQaGVueXRvaW4gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUGhlbnl0b2luIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUGhlbnl0b2luIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUGhlbnl0b2luIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUGhlbnl0b2luICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTIxIC0gUG9seXZhbGVudCBjYXRpb24gcHJvZHVjdHMgY29udGFpbmluZyBNZywgQWwsIEZlLCBDYSBhbmQgWm4KQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IFBvbHl2YWxlbnQgY2F0aW9uIHByb2R1Y3RzIGNvbnRhaW5pbmcgTWcsIEFsLCBGZSwgQ2EgYW5kIFpuIGN1cnJlbnRseSBiZWluZyB0YWtlbiBieSwgb3IgY29uc2lkZXJlZCBmb3IsIGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUG9seXZhbGVudCBjYXRpb24gcHJvZHVjdHMgY29udGFpbmluZyBNZywgQWwsIEZlLCBDYSBhbmQgWm4iOgogIGV4aXN0cyAiUG9seXZhbGVudCBjYXRpb24gcHJvZHVjdHMgY29udGFpbmluZyBNZywgQWwsIEZlLCBDYSBhbmQgWm4gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQb2x5dmFsZW50IGNhdGlvbiBwcm9kdWN0cyBjb250YWluaW5nIE1nLCBBbCwgRmUsIENhIGFuZCBabiBPYnNlcnZhdGlvbiIKZGVmaW5lICJQb2x5dmFsZW50IGNhdGlvbiBwcm9kdWN0cyBjb250YWluaW5nIE1nLCBBbCwgRmUsIENhIGFuZCBabiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQb2x5dmFsZW50IGNhdGlvbiBwcm9kdWN0cyBjb250YWluaW5nIE1nLCBBbCwgRmUsIENhIGFuZCBabiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlBvbHl2YWxlbnQgY2F0aW9uIHByb2R1Y3RzIGNvbnRhaW5pbmcgTWcsIEFsLCBGZSwgQ2EgYW5kIFpuIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUG9seXZhbGVudCBjYXRpb24gcHJvZHVjdHMgY29udGFpbmluZyBNZywgQWwsIEZlLCBDYSBhbmQgWm4gT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQb2x5dmFsZW50IGNhdGlvbiBwcm9kdWN0cyBjb250YWluaW5nIE1nLCBBbCwgRmUsIENhIGFuZCBabiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkyMiAtIEFtb2RpYXF1aW5lCkBhY3Rpdml0eTogSElWLkQyMSBEZXRlcm1pbmUgcmVnaW1lbiBhbmQgdHJlYXRtZW50IG9wdGlvbnMKQGRlc2NyaXB0aW9uOiBBbW9kaWFxdWluZSBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFtb2RpYXF1aW5lIjoKICBleGlzdHMgIkFtb2RpYXF1aW5lIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQW1vZGlhcXVpbmUgT2JzZXJ2YXRpb24iCmRlZmluZSAiQW1vZGlhcXVpbmUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQW1vZGlhcXVpbmUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBbW9kaWFxdWluZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFtb2RpYXF1aW5lIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQW1vZGlhcXVpbmUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MjMgLSBDaXNhcHJpZGUKQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IENpc2FwcmlkZSBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNpc2FwcmlkZSI6CiAgZXhpc3RzICJDaXNhcHJpZGUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDaXNhcHJpZGUgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ2lzYXByaWRlIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNpc2FwcmlkZSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNpc2FwcmlkZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNpc2FwcmlkZSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENpc2FwcmlkZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkyNCAtIEVyZ290YW1pbmUKQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IEVyZ290YW1pbmUgY3VycmVudGx5IGJlaW5nIHRha2VuIGJ5LCBvciBjb25zaWRlcmVkIGZvciwgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJFcmdvdGFtaW5lIjoKICBleGlzdHMgIkVyZ290YW1pbmUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJFcmdvdGFtaW5lIE9ic2VydmF0aW9uIgpkZWZpbmUgIkVyZ290YW1pbmUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRXJnb3RhbWluZSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkVyZ290YW1pbmUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJFcmdvdGFtaW5lIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRXJnb3RhbWluZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkyNSAtIERpaHlkcm9lcmdvdGFtaW5lCkBhY3Rpdml0eTogSElWLkQyMSBEZXRlcm1pbmUgcmVnaW1lbiBhbmQgdHJlYXRtZW50IG9wdGlvbnMKQGRlc2NyaXB0aW9uOiBEaWh5ZHJvZXJnb3RhbWluZSBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkRpaHlkcm9lcmdvdGFtaW5lIjoKICBleGlzdHMgIkRpaHlkcm9lcmdvdGFtaW5lIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRGloeWRyb2VyZ290YW1pbmUgT2JzZXJ2YXRpb24iCmRlZmluZSAiRGloeWRyb2VyZ290YW1pbmUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRGloeWRyb2VyZ290YW1pbmUgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEaWh5ZHJvZXJnb3RhbWluZSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkRpaHlkcm9lcmdvdGFtaW5lIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRGloeWRyb2VyZ290YW1pbmUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MjYgLSBNaWRhem9sYW0KQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IE1pZGF6b2xhbSBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk1pZGF6b2xhbSI6CiAgZXhpc3RzICJNaWRhem9sYW0gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJNaWRhem9sYW0gT2JzZXJ2YXRpb24iCmRlZmluZSAiTWlkYXpvbGFtIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk1pZGF6b2xhbSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk1pZGF6b2xhbSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk1pZGF6b2xhbSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE1pZGF6b2xhbSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkyNyAtIFRyaWF6b2xhbQpAYWN0aXZpdHk6IEhJVi5EMjEgRGV0ZXJtaW5lIHJlZ2ltZW4gYW5kIHRyZWF0bWVudCBvcHRpb25zCkBkZXNjcmlwdGlvbjogVHJpYXpvbGFtIGN1cnJlbnRseSBiZWluZyB0YWtlbiBieSwgb3IgY29uc2lkZXJlZCBmb3IsIGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVHJpYXpvbGFtIjoKICBleGlzdHMgIlRyaWF6b2xhbSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlRyaWF6b2xhbSBPYnNlcnZhdGlvbiIKZGVmaW5lICJUcmlhem9sYW0gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iVHJpYXpvbGFtIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVHJpYXpvbGFtIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVHJpYXpvbGFtIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVHJpYXpvbGFtICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTI4IC0gRXN0cm9nZW4tYmFzZWQgaG9ybW9uYWwgY29udHJhY2VwdGlvbgpAYWN0aXZpdHk6IEhJVi5EMjEgRGV0ZXJtaW5lIHJlZ2ltZW4gYW5kIHRyZWF0bWVudCBvcHRpb25zCkBkZXNjcmlwdGlvbjogRXN0cm9nZW4tYmFzZWQgaG9ybW9uYWwgY29udHJhY2VwdGlvbiBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkVzdHJvZ2VuLWJhc2VkIGhvcm1vbmFsIGNvbnRyYWNlcHRpb24iOgogIGV4aXN0cyAiRXN0cm9nZW4tYmFzZWQgaG9ybW9uYWwgY29udHJhY2VwdGlvbiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkVzdHJvZ2VuLWJhc2VkIGhvcm1vbmFsIGNvbnRyYWNlcHRpb24gT2JzZXJ2YXRpb24iCmRlZmluZSAiRXN0cm9nZW4tYmFzZWQgaG9ybW9uYWwgY29udHJhY2VwdGlvbiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJFc3Ryb2dlbi1iYXNlZCBob3Jtb25hbCBjb250cmFjZXB0aW9uIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRXN0cm9nZW4tYmFzZWQgaG9ybW9uYWwgY29udHJhY2VwdGlvbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkVzdHJvZ2VuLWJhc2VkIGhvcm1vbmFsIGNvbnRyYWNlcHRpb24gT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBFc3Ryb2dlbi1iYXNlZCBob3Jtb25hbCBjb250cmFjZXB0aW9uICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTI5IC0gUmliYXZpcmluCkBhY3Rpdml0eTogSElWLkQyMSBEZXRlcm1pbmUgcmVnaW1lbiBhbmQgdHJlYXRtZW50IG9wdGlvbnMKQGRlc2NyaXB0aW9uOiBSaWJhdmlyaW4gY3VycmVudGx5IGJlaW5nIHRha2VuIGJ5LCBvciBjb25zaWRlcmVkIGZvciwgY2xpZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSaWJhdmlyaW4iOgogIGV4aXN0cyAiUmliYXZpcmluIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmliYXZpcmluIE9ic2VydmF0aW9uIgpkZWZpbmUgIlJpYmF2aXJpbiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJSaWJhdmlyaW4gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSaWJhdmlyaW4gT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSaWJhdmlyaW4gT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBSaWJhdmlyaW4gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MzAgLSBQZWdpbnRlcmZlcm9uIGFsZmEtMmEKQGFjdGl2aXR5OiBISVYuRDIxIERldGVybWluZSByZWdpbWVuIGFuZCB0cmVhdG1lbnQgb3B0aW9ucwpAZGVzY3JpcHRpb246IFBlZ2ludGVyZmVyb24gYWxmYS0yYSBjdXJyZW50bHkgYmVpbmcgdGFrZW4gYnksIG9yIGNvbnNpZGVyZWQgZm9yLCBjbGllbnQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBlZ2ludGVyZmVyb24gYWxmYS0yYSI6CiAgZXhpc3RzICJQZWdpbnRlcmZlcm9uIGFsZmEtMmEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQZWdpbnRlcmZlcm9uIGFsZmEtMmEgT2JzZXJ2YXRpb24iCmRlZmluZSAiUGVnaW50ZXJmZXJvbiBhbGZhLTJhIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlBlZ2ludGVyZmVyb24gYWxmYS0yYSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlBlZ2ludGVyZmVyb24gYWxmYS0yYSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBlZ2ludGVyZmVyb24gYWxmYS0yYSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFBlZ2ludGVyZmVyb24gYWxmYS0yYSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkzMSAtIE90aGVyCkBhY3Rpdml0eTogSElWLkQyMSBEZXRlcm1pbmUgcmVnaW1lbiBhbmQgdHJlYXRtZW50IG9wdGlvbnMKQGRlc2NyaXB0aW9uOiBPdGhlciBtZWRpY2F0aW9uIGN1cnJlbnRseSBiZWluZyB0YWtlbiBieSwgb3IgY29uc2lkZXJlZCBmb3IsIGNsaWVudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiT3RoZXIgRC5ERTkzMSI6CiAgZXhpc3RzICJPdGhlciBELkRFOTMxIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiT3RoZXIgRC5ERTkzMSBPYnNlcnZhdGlvbiIKZGVmaW5lICJPdGhlciBELkRFOTMxIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk90aGVyIEQuREU5MzEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJPdGhlciBELkRFOTMxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iT3RoZXIgRC5ERTkzMSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE90aGVyIEQuREU5MzEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5MzMgLSBNZWRpY2F0aW9uIGNoYW5nZSByZWNvbW1lbmRlZApAYWN0aXZpdHk6IEhJVi5EMjEgRGV0ZXJtaW5lIHJlZ2ltZW4gYW5kIHRyZWF0bWVudCBvcHRpb25zCkBkZXNjcmlwdGlvbjogQSBtZWRpY2F0aW9uIGNoYW5nZSBpcyByZWNvbW1lbmRlZCBmb3IgdGhlIGNsaWVudCBiYXNlZCB1cG9uIGN1cnJlbnQgb3IgY29uc2lkZXJlZCBtZWRpY2F0aW9ucwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTWVkaWNhdGlvbiBjaGFuZ2UgcmVjb21tZW5kZWQiOgogIGV4aXN0cyAiTWVkaWNhdGlvbiBjaGFuZ2UgcmVjb21tZW5kZWQgT2JzZXJ2YXRpb24iCmRlZmluZSAiTWVkaWNhdGlvbiBjaGFuZ2UgcmVjb21tZW5kZWQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJNZWRpY2F0aW9uIGNoYW5nZSByZWNvbW1lbmRlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE1lZGljYXRpb24gY2hhbmdlIHJlY29tbWVuZGVkICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTM0IC0gV0hPIEhJViBjbGluaWNhbCBzdGFnZSBjb25kaXRpb24gb3Igc3ltcHRvbQpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IE5ldyBvciByZWN1cnJlbnQgY2xpbmljYWwgZXZlbnRzIHVzZWQgdG8gY2F0ZWdvcml6ZSBISVYgZGlzZWFzZSBzZXZlcml0eSBiYXNlZCBhdCBiYXNlbGluZSBhbmQgZm9sbG93IHVwCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJXSE8gSElWIGNsaW5pY2FsIHN0YWdlIGNvbmRpdGlvbiBvciBzeW1wdG9tIEQuREU5MzQiOgogIGV4aXN0cyAiV0hPIEhJViBjbGluaWNhbCBzdGFnZSBjb25kaXRpb24gb3Igc3ltcHRvbSBELkRFOTM0IE9ic2VydmF0aW9uIgpkZWZpbmUgIldITyBISVYgY2xpbmljYWwgc3RhZ2UgY29uZGl0aW9uIG9yIHN5bXB0b20gRC5ERTkzNCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIldITyBISVYgY2xpbmljYWwgc3RhZ2UgY29uZGl0aW9uIG9yIHN5bXB0b20gRC5ERTkzNCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFdITyBISVYgY2xpbmljYWwgc3RhZ2UgY29uZGl0aW9uIG9yIHN5bXB0b20gRC5ERTkzNCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkzNSAtIFB1bG1vbmFyeSBUQgpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgcHVsbW9uYXJ5IFRCCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQdWxtb25hcnkgVEIgRC5ERTkzNSI6CiAgZXhpc3RzICJQdWxtb25hcnkgVEIgRC5ERTkzNSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlB1bG1vbmFyeSBUQiBELkRFOTM1IE9ic2VydmF0aW9uIgpkZWZpbmUgIlB1bG1vbmFyeSBUQiBELkRFOTM1IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlB1bG1vbmFyeSBUQiBELkRFOTM1IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUHVsbW9uYXJ5IFRCIEQuREU5MzUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQdWxtb25hcnkgVEIgRC5ERTkzNSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFB1bG1vbmFyeSBUQiBELkRFOTM1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTM2IC0gTHltcGggbm9kZSBUQgpAYWN0aXZpdHk6IEhJVi5EMTUgRGV0ZXJtaW5lIGNsaW5pY2FsIHN0YWdlIG9mIEhJVgpAZGVzY3JpcHRpb246IENsaWVudCdzIHN5bXB0b21zIGluY2x1ZGUgbHltcGggbm9kZSBUQgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTHltcGggbm9kZSBUQiBELkRFOTM2IjoKICBleGlzdHMgIkx5bXBoIG5vZGUgVEIgRC5ERTkzNiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkx5bXBoIG5vZGUgVEIgRC5ERTkzNiBPYnNlcnZhdGlvbiIKZGVmaW5lICJMeW1waCBub2RlIFRCIEQuREU5MzYgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTHltcGggbm9kZSBUQiBELkRFOTM2IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTHltcGggbm9kZSBUQiBELkRFOTM2IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTHltcGggbm9kZSBUQiBELkRFOTM2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTHltcGggbm9kZSBUQiBELkRFOTM2ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTM3IC0gRXh0cmFwdWxtb25hcnkgVEIKQGFjdGl2aXR5OiBISVYuRDE1IERldGVybWluZSBjbGluaWNhbCBzdGFnZSBvZiBISVYKQGRlc2NyaXB0aW9uOiBDbGllbnQncyBzeW1wdG9tcyBpbmNsdWRlIGV4dHJhcHVsbW9uYXJ5IHR1YmVyY3Vsb3NpcyAoVEIpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJFeHRyYXB1bG1vbmFyeSBUQiBELkRFOTM3IjoKICBleGlzdHMgIkV4dHJhcHVsbW9uYXJ5IFRCIEQuREU5MzcgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJFeHRyYXB1bG1vbmFyeSBUQiBELkRFOTM3IE9ic2VydmF0aW9uIgpkZWZpbmUgIkV4dHJhcHVsbW9uYXJ5IFRCIEQuREU5MzcgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRXh0cmFwdWxtb25hcnkgVEIgRC5ERTkzNyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkV4dHJhcHVsbW9uYXJ5IFRCIEQuREU5MzcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJFeHRyYXB1bG1vbmFyeSBUQiBELkRFOTM3IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRXh0cmFwdWxtb25hcnkgVEIgRC5ERTkzNyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTkzOSAtIFRCIGRpYWdub3NpcyByZXN1bHQKQGFjdGl2aXR5OiBISVYuRDggQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBGaW5hbCByZXN1bHQgb2YgdGhlIFRCIGludmVzdGlnYXRpb24gKGJhY3RlcmlvbG9naWNhbCBhbmQvb3IgY2xpbmljYWwpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUQiBkaWFnbm9zaXMgcmVzdWx0IjoKICBleGlzdHMgIlRCIGRpYWdub3NpcyByZXN1bHQgT2JzZXJ2YXRpb24iCmRlZmluZSAiVEIgZGlhZ25vc2lzIHJlc3VsdCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlRCIGRpYWdub3NpcyByZXN1bHQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUQiBkaWFnbm9zaXMgcmVzdWx0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTQwIC0gRGlhZ25vc2VkIFRCCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIGRpYWdub3NlZCB3aXRoIFRCIGRpc2Vhc2UKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkRpYWdub3NlZCBUQiI6CiAgZXhpc3RzICJEaWFnbm9zZWQgVEIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJEaWFnbm9zZWQgVEIgT2JzZXJ2YXRpb24iCmRlZmluZSAiRGlhZ25vc2VkIFRCIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkRpYWdub3NlZCBUQiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkRpYWdub3NlZCBUQiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkRpYWdub3NlZCBUQiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIERpYWdub3NlZCBUQiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk0MSAtIFRCIGV4Y2x1ZGVkCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIG5vdCBkaWFnbm9zZWQgd2l0aCBUQgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVEIgZXhjbHVkZWQiOgogIGV4aXN0cyAiVEIgZXhjbHVkZWQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJUQiBleGNsdWRlZCBPYnNlcnZhdGlvbiIKZGVmaW5lICJUQiBleGNsdWRlZCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJUQiBleGNsdWRlZCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlRCIGV4Y2x1ZGVkIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVEIgZXhjbHVkZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUQiBleGNsdWRlZCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk0NSAtIFByZXN1bXB0aXZlIFRCCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50IGhhcyBzaWducyBvciBzeW1wdG9tcyBvZiB0dWJlcmN1bG9zaXMgKFRCKSB3aXRob3V0IGxhYm9yYXRvcnkgY29uZmlybWF0aW9uCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQcmVzdW1wdGl2ZSBUQiBELkRFOTQ1IjoKICBleGlzdHMgIlByZXN1bXB0aXZlIFRCIEQuREU5NDUgT2JzZXJ2YXRpb24iCmRlZmluZSAiUHJlc3VtcHRpdmUgVEIgRC5ERTk0NSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlByZXN1bXB0aXZlIFRCIEQuREU5NDUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQcmVzdW1wdGl2ZSBUQiBELkRFOTQ1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTU2IC0gVEIgc2NyZWVuaW5nIGFsZ29yaXRobQpAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogU2NyZWVuaW5nIGFsZ29yaXRobSBzZWxlY3RlZCBmb3Igc2NyZWVuaW5nIGFjdGl2aXRpZXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRCIHNjcmVlbmluZyBhbGdvcml0aG0iOgogIGV4aXN0cyAiVEIgc2NyZWVuaW5nIGFsZ29yaXRobSBPYnNlcnZhdGlvbiIKZGVmaW5lICJUQiBzY3JlZW5pbmcgYWxnb3JpdGhtIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVEIgc2NyZWVuaW5nIGFsZ29yaXRobSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFRCIHNjcmVlbmluZyBhbGdvcml0aG0gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5NTcgLSBTY3JlZW5pbmcgd2l0aCBjb3VnaApAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogQ2xpZW50IHNjcmVlbmVkIGZvciBUQiBiYXNlZCBvbiBjb3VnaCBzeW1wdG9tCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTY3JlZW5pbmcgd2l0aCBjb3VnaCI6CiAgZXhpc3RzICJTY3JlZW5pbmcgd2l0aCBjb3VnaCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlNjcmVlbmluZyB3aXRoIGNvdWdoIE9ic2VydmF0aW9uIgpkZWZpbmUgIlNjcmVlbmluZyB3aXRoIGNvdWdoIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNjcmVlbmluZyB3aXRoIGNvdWdoIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU2NyZWVuaW5nIHdpdGggY291Z2ggT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTY3JlZW5pbmcgd2l0aCBjb3VnaCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNjcmVlbmluZyB3aXRoIGNvdWdoICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTU4IC0gU2NyZWVuaW5nIHdpdGggYW55IFRCIHN5bXB0b20KQGFjdGl2aXR5OiBISVYuRDQgU2NyZWVuIGZvciBUQgpAZGVzY3JpcHRpb246IENsaWVudCBzY3JlZW5lZCBmb3IgVEIgYmFzZWQgb24gYW55IFRCIHN5bXB0b20KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlNjcmVlbmluZyB3aXRoIGFueSBUQiBzeW1wdG9tIjoKICBleGlzdHMgIlNjcmVlbmluZyB3aXRoIGFueSBUQiBzeW1wdG9tIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU2NyZWVuaW5nIHdpdGggYW55IFRCIHN5bXB0b20gT2JzZXJ2YXRpb24iCmRlZmluZSAiU2NyZWVuaW5nIHdpdGggYW55IFRCIHN5bXB0b20gQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iU2NyZWVuaW5nIHdpdGggYW55IFRCIHN5bXB0b20gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTY3JlZW5pbmcgd2l0aCBhbnkgVEIgc3ltcHRvbSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNjcmVlbmluZyB3aXRoIGFueSBUQiBzeW1wdG9tIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU2NyZWVuaW5nIHdpdGggYW55IFRCIHN5bXB0b20gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5NTkgLSBXNFNTIHNpbmdsZSBzY3JlZW5pbmcgYWxnb3JpdGhtCkBhY3Rpdml0eTogSElWLkQ0IFNjcmVlbiBmb3IgVEIKQGRlc2NyaXB0aW9uOiBDbGllbnQgc2NyZWVuZWQgZm9yIFRCIGJhc2VkIG9uIHRoZSBXSE8tcmVjb21tZW5kZWQgZm91ci1zeW1wdG9tIHNjcmVlbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVzRTUyBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSI6CiAgZXhpc3RzICJXNFNTIHNpbmdsZSBzY3JlZW5pbmcgYWxnb3JpdGhtIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiVzRTUyBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSBPYnNlcnZhdGlvbiIKZGVmaW5lICJXNFNTIHNpbmdsZSBzY3JlZW5pbmcgYWxnb3JpdGhtIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlc0U1Mgc2luZ2xlIHNjcmVlbmluZyBhbGdvcml0aG0gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJXNFNTIHNpbmdsZSBzY3JlZW5pbmcgYWxnb3JpdGhtIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVzRTUyBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFc0U1Mgc2luZ2xlIHNjcmVlbmluZyBhbGdvcml0aG0gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5NjAgLSBDUlAgc2luZ2xlIHNjcmVlbmluZyBhbGdvcml0aG0KQGFjdGl2aXR5OiBISVYuRDQgU2NyZWVuIGZvciBUQgpAZGVzY3JpcHRpb246IENsaWVudCBzY3JlZW5lZCBmb3IgVEIgYmFzZWQgb24gQy1yZWFjdGl2ZSBwcm90ZWluIChDUlApIHRlc3RpbmcKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNSUCBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSI6CiAgZXhpc3RzICJDUlAgc2luZ2xlIHNjcmVlbmluZyBhbGdvcml0aG0gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDUlAgc2luZ2xlIHNjcmVlbmluZyBhbGdvcml0aG0gT2JzZXJ2YXRpb24iCmRlZmluZSAiQ1JQIHNpbmdsZSBzY3JlZW5pbmcgYWxnb3JpdGhtIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNSUCBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNSUCBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNSUCBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENSUCBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk2MSAtIENYUiBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobQpAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogQ2xpZW50IHNjcmVlbmVkIGZvciBUQiB3aXRoIGEgY2hlc3QgcmFkaW9ncmFwaHkgKENYUikKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNYUiBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSI6CiAgZXhpc3RzICJDWFIgc2luZ2xlIHNjcmVlbmluZyBhbGdvcml0aG0gQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDWFIgc2luZ2xlIHNjcmVlbmluZyBhbGdvcml0aG0gT2JzZXJ2YXRpb24iCmRlZmluZSAiQ1hSIHNpbmdsZSBzY3JlZW5pbmcgYWxnb3JpdGhtIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkNYUiBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkNYUiBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNYUiBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIENYUiBzaW5nbGUgc2NyZWVuaW5nIGFsZ29yaXRobSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk2MiAtIFBhcmFsbGVsIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDUlAKQGFjdGl2aXR5OiBISVYuRDQgU2NyZWVuIGZvciBUQgpAZGVzY3JpcHRpb246IENsaWVudCBzY3JlZW5lZCBmb3IgVEIgdXNpbmcgcGFyYWxsZWwgc2NyZWVuaW5nIHdpdGggV0hPLXJlY29tbWVuZGVkIGZvdXItc3ltcHRvbSBzY3JlZW4gYW5kIEMtcmVhY3RpdmUgcHJvdGVpbiAoQ1JQKSB0ZXN0aW5nCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJQYXJhbGxlbCBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1JQIjoKICBleGlzdHMgIlBhcmFsbGVsIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDUlAgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQYXJhbGxlbCBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1JQIE9ic2VydmF0aW9uIgpkZWZpbmUgIlBhcmFsbGVsIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDUlAgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUGFyYWxsZWwgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENSUCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlBhcmFsbGVsIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDUlAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJQYXJhbGxlbCBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1JQIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUGFyYWxsZWwgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENSUCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk2MyAtIFNlcXVlbnRpYWwgcG9zaXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENSUApAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogQ2xpZW50IHNjcmVlbmVkIGZvciBUQiB1c2luZyBzZXF1ZW50aWFsIHBvc2l0aXZlIHNjcmVlbmluZyB3aXRoIFdITy1yZWNvbW1lbmRlZCBmb3VyLXN5bXB0b20gc2NyZWVuIGFuZCBDLXJlYWN0aXZlIHByb3RlaW4gKENSUCkgdGVzdGluZy4KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlNlcXVlbnRpYWwgcG9zaXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENSUCI6CiAgZXhpc3RzICJTZXF1ZW50aWFsIHBvc2l0aXZlIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDUlAgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJTZXF1ZW50aWFsIHBvc2l0aXZlIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDUlAgT2JzZXJ2YXRpb24iCmRlZmluZSAiU2VxdWVudGlhbCBwb3NpdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1JQIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNlcXVlbnRpYWwgcG9zaXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENSUCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlNlcXVlbnRpYWwgcG9zaXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENSUCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNlcXVlbnRpYWwgcG9zaXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENSUCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNlcXVlbnRpYWwgcG9zaXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENSUCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk2NCAtIFNlcXVlbnRpYWwgbmVnYXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENSUApAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogQ2xpZW50IHNjcmVlbmVkIGZvciBUQiB1c2luZyBzZXF1ZW50aWFsIG5lZ2F0aXZlIHNjcmVlbmluZyB3aXRoIFdITy1yZWNvbW1lbmRlZCBmb3VyLXN5bXB0b20gc2NyZWVuIGFuZCBDLXJlYWN0aXZlIHByb3RlaW4gKENSUCkgdGVzdGluZwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2VxdWVudGlhbCBuZWdhdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1JQIjoKICBleGlzdHMgIlNlcXVlbnRpYWwgbmVnYXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENSUCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlNlcXVlbnRpYWwgbmVnYXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENSUCBPYnNlcnZhdGlvbiIKZGVmaW5lICJTZXF1ZW50aWFsIG5lZ2F0aXZlIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDUlAgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iU2VxdWVudGlhbCBuZWdhdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1JQIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU2VxdWVudGlhbCBuZWdhdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1JQIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU2VxdWVudGlhbCBuZWdhdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1JQIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU2VxdWVudGlhbCBuZWdhdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1JQICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTY1IC0gUGFyYWxsZWwgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUgpAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogQ2xpZW50IHNjcmVlbmVkIGZvciBUQiB1c2luZyB0aGUgcGFyYWxsZWwgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUGFyYWxsZWwgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUiI6CiAgZXhpc3RzICJQYXJhbGxlbCBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1hSIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUGFyYWxsZWwgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUiBPYnNlcnZhdGlvbiIKZGVmaW5lICJQYXJhbGxlbCBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1hSIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlBhcmFsbGVsIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDWFIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQYXJhbGxlbCBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1hSIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUGFyYWxsZWwgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFBhcmFsbGVsIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDWFIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5NjYgLSBTZXF1ZW50aWFsIHBvc2l0aXZlIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDWFIKQGFjdGl2aXR5OiBISVYuRDQgU2NyZWVuIGZvciBUQgpAZGVzY3JpcHRpb246IENsaWVudCBzY3JlZW5lZCBmb3IgVEIgdXNpbmcgc2VxdWVudGlhbCBwb3NpdGl2ZSBzY3JlZW5pbmcgd2l0aCBXSE8tcmVjb21tZW5kZWQgZm91ci1zeW1wdG9tIHNjcmVlbiBhbmQgY2hlc3QgcmFkaW9ncmFwaHkKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlNlcXVlbnRpYWwgcG9zaXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUiI6CiAgZXhpc3RzICJTZXF1ZW50aWFsIHBvc2l0aXZlIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDWFIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJTZXF1ZW50aWFsIHBvc2l0aXZlIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDWFIgT2JzZXJ2YXRpb24iCmRlZmluZSAiU2VxdWVudGlhbCBwb3NpdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1hSIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNlcXVlbnRpYWwgcG9zaXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlNlcXVlbnRpYWwgcG9zaXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNlcXVlbnRpYWwgcG9zaXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNlcXVlbnRpYWwgcG9zaXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk2NyAtIFNlcXVlbnRpYWwgbmVnYXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUgpAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogQ2xpZW50IHNjcmVlbmVkIGZvciBUQiB1c2luZyBzZXF1ZW50aWFsIG5lZ2F0aXZlIHNjcmVlbmluZyB3aXRoIFdITy1yZWNvbW1lbmRlZCBmb3VyLXN5bXB0b20gc2NyZWVuIGFuZCBjaGVzdCByYWRpb2dyYXBoeQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2VxdWVudGlhbCBuZWdhdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1hSIjoKICBleGlzdHMgIlNlcXVlbnRpYWwgbmVnYXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlNlcXVlbnRpYWwgbmVnYXRpdmUgc2NyZWVuaW5nIGFsZ29yaXRobSB3aXRoIFc0U1MgYW5kIENYUiBPYnNlcnZhdGlvbiIKZGVmaW5lICJTZXF1ZW50aWFsIG5lZ2F0aXZlIHNjcmVlbmluZyBhbGdvcml0aG0gd2l0aCBXNFNTIGFuZCBDWFIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iU2VxdWVudGlhbCBuZWdhdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1hSIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU2VxdWVudGlhbCBuZWdhdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1hSIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU2VxdWVudGlhbCBuZWdhdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1hSIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU2VxdWVudGlhbCBuZWdhdGl2ZSBzY3JlZW5pbmcgYWxnb3JpdGhtIHdpdGggVzRTUyBhbmQgQ1hSICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTY4IC0gU2NyZWVuaW5nIHdpdGggbVdSRApAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogQ2xpZW50IHNjcmVlbmVkIGZvciBUQiB3aXRoIGEgbW9sZWN1bGFyIFdITy1yZWNvbW1lbmRlZCByYXBpZCBkaWFnbm9zdGljIHRlc3QgKG1XUkQpLCBzdWNoIGFzIGFuIFhwZXJ0IE1UQi9SSUYgdGVzdCB0byBkZXRlY3QgTXljb2JhY3Rlcml1bSB0dWJlcmN1bG9zaXMgKE1UQikKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlNjcmVlbmluZyB3aXRoIG1XUkQiOgogIGV4aXN0cyAiU2NyZWVuaW5nIHdpdGggbVdSRCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlNjcmVlbmluZyB3aXRoIG1XUkQgT2JzZXJ2YXRpb24iCmRlZmluZSAiU2NyZWVuaW5nIHdpdGggbVdSRCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJTY3JlZW5pbmcgd2l0aCBtV1JEIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU2NyZWVuaW5nIHdpdGggbVdSRCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlNjcmVlbmluZyB3aXRoIG1XUkQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTY3JlZW5pbmcgd2l0aCBtV1JEICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTY5IC0gQ2xpbmljYWwgYXNzZXNzbWVudApAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogQ2xpZW50IHNjcmVlbmVkIGZvciB3aXRoIGEgY2xpbmljYWwgZXZhbHVhdGlvbiBmb3IgdHViZXJjdWxvc2lzIChUQikgYmFzZWQgb24gbmF0aW9uYWwgZ3VpZGVsaW5lcy4gQ2xpbmljYWwgYXNzZXNzbWVudCBtYXkgYmUgdXNlZCBhcyBhbiBlbGlnaWJpbGl0eSBldmFsdWF0aW9uIGZvciB0ZXN0aW5nIHdpdGggTEYtTEFNIG9yIGZvciBlbXBpcmljIFRCIHRyZWF0bWVudC4KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNsaW5pY2FsIGFzc2Vzc21lbnQiOgogIGV4aXN0cyAiQ2xpbmljYWwgYXNzZXNzbWVudCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkNsaW5pY2FsIGFzc2Vzc21lbnQgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ2xpbmljYWwgYXNzZXNzbWVudCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJDbGluaWNhbCBhc3Nlc3NtZW50IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ2xpbmljYWwgYXNzZXNzbWVudCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNsaW5pY2FsIGFzc2Vzc21lbnQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDbGluaWNhbCBhc3Nlc3NtZW50ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTcwIC0gT3RoZXIgVEIgc2NyZWVuaW5nIGFsZ29yaXRobQpAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogQ2xpZW50IHNjcmVlbmVkIGZvciB0dWJlcmN1bG9zaXMgKFRCKSB3aXRoIGEgZGlmZmVyZW50IHNjcmVlbmluZyBtZXRob2Qgbm90IGxpc3RlZAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiT3RoZXIgVEIgc2NyZWVuaW5nIGFsZ29yaXRobSI6CiAgZXhpc3RzICJPdGhlciBUQiBzY3JlZW5pbmcgYWxnb3JpdGhtIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiT3RoZXIgVEIgc2NyZWVuaW5nIGFsZ29yaXRobSBPYnNlcnZhdGlvbiIKZGVmaW5lICJPdGhlciBUQiBzY3JlZW5pbmcgYWxnb3JpdGhtIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk90aGVyIFRCIHNjcmVlbmluZyBhbGdvcml0aG0gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJPdGhlciBUQiBzY3JlZW5pbmcgYWxnb3JpdGhtIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iT3RoZXIgVEIgc2NyZWVuaW5nIGFsZ29yaXRobSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE90aGVyIFRCIHNjcmVlbmluZyBhbGdvcml0aG0gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5NzMgLSBTeW1wdG9tcyBvZiBUQgpAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogU3ltcHRvbXMgdGhhdCBtYXkgaW5kaWNhdGUgVEIgZGlzZWFzZSBpbiBjbGllbnRzIGxpdmluZyB3aXRoIEhJViwgYmFzZWQgb24gYSBjbGluaWNhbCBhbGdvcml0aG0KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlN5bXB0b21zIG9mIFRCIjoKICBleGlzdHMgIlN5bXB0b21zIG9mIFRCIE9ic2VydmF0aW9uIgpkZWZpbmUgIlN5bXB0b21zIG9mIFRCIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU3ltcHRvbXMgb2YgVEIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTeW1wdG9tcyBvZiBUQiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk3NCAtIEN1cnJlbnQgY291Z2gKQGFjdGl2aXR5OiBISVYuRDQgU2NyZWVuIGZvciBUQgpAZGVzY3JpcHRpb246IENsaWVudCBoYXMgYSBjb3VnaCByZWdhcmRsZXNzIG9mIGR1cmF0aW9uCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDdXJyZW50IGNvdWdoIjoKICBleGlzdHMgIkN1cnJlbnQgY291Z2ggQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJDdXJyZW50IGNvdWdoIE9ic2VydmF0aW9uIgpkZWZpbmUgIkN1cnJlbnQgY291Z2ggQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQ3VycmVudCBjb3VnaCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkN1cnJlbnQgY291Z2ggT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDdXJyZW50IGNvdWdoIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQ3VycmVudCBjb3VnaCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk3NSAtIFByb2xvbmdlZCBjb3VnaCA+PTJ3CkBhY3Rpdml0eTogSElWLkQ0IFNjcmVlbiBmb3IgVEIKQGRlc2NyaXB0aW9uOiBDbGllbnQgaGFzIGEgcHJvbG9uZ2VkIGNvdWdoIG9mIDIgd2Vla3Mgb3IgbW9yZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUHJvbG9uZ2VkIGNvdWdoID49MnciOgogIGV4aXN0cyAiUHJvbG9uZ2VkIGNvdWdoID49MncgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQcm9sb25nZWQgY291Z2ggPj0ydyBPYnNlcnZhdGlvbiIKZGVmaW5lICJQcm9sb25nZWQgY291Z2ggPj0ydyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQcm9sb25nZWQgY291Z2ggPj0ydyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlByb2xvbmdlZCBjb3VnaCA+PTJ3IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUHJvbG9uZ2VkIGNvdWdoID49MncgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQcm9sb25nZWQgY291Z2ggPj0ydyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk3NiAtIEZldmVyIG9mIDM5IMKwQyBvciBncmVhdGVyCkBhY3Rpdml0eTogSElWLkQ0IFNjcmVlbiBmb3IgVEIKQGRlc2NyaXB0aW9uOiBDbGllbnQgaGFzIGEgZmV2ZXIgd2l0aCBhIG1lYXN1cmVkIHRlbXBlcmF0dXJlIG9mIDEwMi4yIMKwRi8zOSDCsEMgb3IgZ3JlYXRlcgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRmV2ZXIgb2YgMzkgwrBDIG9yIGdyZWF0ZXIiOgogIGV4aXN0cyAiRmV2ZXIgb2YgMzkgwrBDIG9yIGdyZWF0ZXIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJGZXZlciBvZiAzOSDCsEMgb3IgZ3JlYXRlciBPYnNlcnZhdGlvbiIKZGVmaW5lICJGZXZlciBvZiAzOSDCsEMgb3IgZ3JlYXRlciBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJGZXZlciBvZiAzOSDCsEMgb3IgZ3JlYXRlciBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkZldmVyIG9mIDM5IMKwQyBvciBncmVhdGVyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRmV2ZXIgb2YgMzkgwrBDIG9yIGdyZWF0ZXIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBGZXZlciBvZiAzOSDCsEMgb3IgZ3JlYXRlciAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk3NyAtIFdlaWdodCBsb3NzIHJlcG9ydGVkCkBhY3Rpdml0eTogSElWLkQ0IFNjcmVlbiBmb3IgVEIKQGRlc2NyaXB0aW9uOiBVbmV4cGxhaW5lZCB3ZWlnaHQgbG9zcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiV2VpZ2h0IGxvc3MgcmVwb3J0ZWQiOgogIGV4aXN0cyAiV2VpZ2h0IGxvc3MgcmVwb3J0ZWQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJXZWlnaHQgbG9zcyByZXBvcnRlZCBPYnNlcnZhdGlvbiIKZGVmaW5lICJXZWlnaHQgbG9zcyByZXBvcnRlZCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJXZWlnaHQgbG9zcyByZXBvcnRlZCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIldlaWdodCBsb3NzIHJlcG9ydGVkIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iV2VpZ2h0IGxvc3MgcmVwb3J0ZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBXZWlnaHQgbG9zcyByZXBvcnRlZCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk3OCAtIE5pZ2h0IHN3ZWF0cwpAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogQ2xpZW50IHJlcG9ydHMgZXhwZXJpZW5jaW5nIG5pZ2h0IHN3ZWF0cwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTmlnaHQgc3dlYXRzIjoKICBleGlzdHMgIk5pZ2h0IHN3ZWF0cyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk5pZ2h0IHN3ZWF0cyBPYnNlcnZhdGlvbiIKZGVmaW5lICJOaWdodCBzd2VhdHMgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTmlnaHQgc3dlYXRzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTmlnaHQgc3dlYXRzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTmlnaHQgc3dlYXRzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTmlnaHQgc3dlYXRzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTc5IC0gUG9vciB3ZWlnaHQgZ2FpbgpAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogQ2xpZW50IHJlcG9ydHMgcG9vciB3ZWlnaHQgZ2FpbiBvZiBjaGlsZCBvciBpbmZhbnQgb3IgZ3Jvd3RoIGN1cnZlIGZsYXR0ZW5pbmcgb3Igd2VpZ2h0IGZvciBhZ2UgPC0yIFotc2NvcmVzLgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUG9vciB3ZWlnaHQgZ2FpbiI6CiAgZXhpc3RzICJQb29yIHdlaWdodCBnYWluIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUG9vciB3ZWlnaHQgZ2FpbiBPYnNlcnZhdGlvbiIKZGVmaW5lICJQb29yIHdlaWdodCBnYWluIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlBvb3Igd2VpZ2h0IGdhaW4gQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQb29yIHdlaWdodCBnYWluIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUG9vciB3ZWlnaHQgZ2FpbiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFBvb3Igd2VpZ2h0IGdhaW4gKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5ODAgLSBSZWR1Y2VkIHBsYXlmdWxuZXNzCkBhY3Rpdml0eTogSElWLkQ0IFNjcmVlbiBmb3IgVEIKQGRlc2NyaXB0aW9uOiBDbGllbnQgcmVwb3J0cyByZWR1Y2VkIHBsYXlmdWxuZXNzIG9mIGNoaWxkCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSZWR1Y2VkIHBsYXlmdWxuZXNzIjoKICBleGlzdHMgIlJlZHVjZWQgcGxheWZ1bG5lc3MgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJSZWR1Y2VkIHBsYXlmdWxuZXNzIE9ic2VydmF0aW9uIgpkZWZpbmUgIlJlZHVjZWQgcGxheWZ1bG5lc3MgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUmVkdWNlZCBwbGF5ZnVsbmVzcyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlJlZHVjZWQgcGxheWZ1bG5lc3MgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSZWR1Y2VkIHBsYXlmdWxuZXNzIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUmVkdWNlZCBwbGF5ZnVsbmVzcyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk4MSAtIENoZXN0IHBhaW4KQGFjdGl2aXR5OiBISVYuRDQgU2NyZWVuIGZvciBUQgpAZGVzY3JpcHRpb246IENsaWVudCByZXBvcnRzIGNoZXN0IHBhaW4KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNoZXN0IHBhaW4iOgogIGV4aXN0cyAiQ2hlc3QgcGFpbiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkNoZXN0IHBhaW4gT2JzZXJ2YXRpb24iCmRlZmluZSAiQ2hlc3QgcGFpbiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJDaGVzdCBwYWluIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ2hlc3QgcGFpbiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkNoZXN0IHBhaW4gT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBDaGVzdCBwYWluICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTgyIC0gSGFlbW9wdHlzaXMKQGFjdGl2aXR5OiBISVYuRDQgU2NyZWVuIGZvciBUQgpAZGVzY3JpcHRpb246IENsaWVudCByZXBvcnRzIGV4cGVyaWVuY2luZyBoYWVtb3B0eXNpcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSGFlbW9wdHlzaXMiOgogIGV4aXN0cyAiSGFlbW9wdHlzaXMgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJIYWVtb3B0eXNpcyBPYnNlcnZhdGlvbiIKZGVmaW5lICJIYWVtb3B0eXNpcyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJIYWVtb3B0eXNpcyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkhhZW1vcHR5c2lzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSGFlbW9wdHlzaXMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBIYWVtb3B0eXNpcyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk4MyAtIExldGhhcmd5CkBhY3Rpdml0eTogSElWLkQ0IFNjcmVlbiBmb3IgVEIKQGRlc2NyaXB0aW9uOiBDbGllbnQgcmVwb3J0cyBsZXRoYXJneQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTGV0aGFyZ3kgRC5ERTk4MyI6CiAgZXhpc3RzICJMZXRoYXJneSBELkRFOTgzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTGV0aGFyZ3kgRC5ERTk4MyBPYnNlcnZhdGlvbiIKZGVmaW5lICJMZXRoYXJneSBELkRFOTgzIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkxldGhhcmd5IEQuREU5ODMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJMZXRoYXJneSBELkRFOTgzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTGV0aGFyZ3kgRC5ERTk4MyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIExldGhhcmd5IEQuREU5ODMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5ODQgLSBOb25lCkBhY3Rpdml0eTogSElWLkQ0IFNjcmVlbiBmb3IgVEIKQGRlc2NyaXB0aW9uOiBObyBzeW1wdG9tcyBvZiBUQiBpZGVudGlmaWVkCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJOb25lIjoKICBleGlzdHMgIk5vbmUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJOb25lIE9ic2VydmF0aW9uIgpkZWZpbmUgIk5vbmUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTm9uZSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk5vbmUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJOb25lIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTm9uZSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk4NSAtIEhpc3Rvcnkgb2YgY29udGFjdCB3aXRoIGEgcGVyc29uIHdpdGggVEIKQGFjdGl2aXR5OiBISVYuRDQgU2NyZWVuIGZvciBUQgpAZGVzY3JpcHRpb246IENsaWVudCBoYWQgYSBoaXN0b3J5IG9mIGEgY29udGFjdCB3aXRoIGEgcGVyc29uIHdpdGggVEIKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhpc3Rvcnkgb2YgY29udGFjdCB3aXRoIGEgcGVyc29uIHdpdGggVEIiOgogIGV4aXN0cyAiSGlzdG9yeSBvZiBjb250YWN0IHdpdGggYSBwZXJzb24gd2l0aCBUQiBPYnNlcnZhdGlvbiIKZGVmaW5lICJIaXN0b3J5IG9mIGNvbnRhY3Qgd2l0aCBhIHBlcnNvbiB3aXRoIFRCIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSGlzdG9yeSBvZiBjb250YWN0IHdpdGggYSBwZXJzb24gd2l0aCBUQiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhpc3Rvcnkgb2YgY29udGFjdCB3aXRoIGEgcGVyc29uIHdpdGggVEIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5ODYgLSBUQiBzY3JlZW5pbmcgcmVzdWx0CkBhY3Rpdml0eTogSElWLkQ0IFNjcmVlbiBmb3IgVEIKQGRlc2NyaXB0aW9uOiBSZWNvcmQgdGhlIHJlc3VsdCBvZiB0aGUgdHViZXJjdWxvc2lzIChUQikgc2NyZWVuaW5nCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUQiBzY3JlZW5pbmcgcmVzdWx0IjoKICBleGlzdHMgIlRCIHNjcmVlbmluZyByZXN1bHQgT2JzZXJ2YXRpb24iCmRlZmluZSAiVEIgc2NyZWVuaW5nIHJlc3VsdCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlRCIHNjcmVlbmluZyByZXN1bHQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUQiBzY3JlZW5pbmcgcmVzdWx0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFOTg3IC0gU2NyZWVuIHBvc2l0aXZlIGZvciBUQgpAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogU2NyZWVuaW5nIHJlc3VsdCB3YXMgcG9zaXRpdmUgZm9yIHR1YmVyY3Vsb3NpcyAoVEIpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTY3JlZW4gcG9zaXRpdmUgZm9yIFRCIjoKICBleGlzdHMgIlNjcmVlbiBwb3NpdGl2ZSBmb3IgVEIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJTY3JlZW4gcG9zaXRpdmUgZm9yIFRCIE9ic2VydmF0aW9uIgpkZWZpbmUgIlNjcmVlbiBwb3NpdGl2ZSBmb3IgVEIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iU2NyZWVuIHBvc2l0aXZlIGZvciBUQiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlNjcmVlbiBwb3NpdGl2ZSBmb3IgVEIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTY3JlZW4gcG9zaXRpdmUgZm9yIFRCIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgU2NyZWVuIHBvc2l0aXZlIGZvciBUQiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRC5ERTk4OCAtIFNjcmVlbiBuZWdhdGl2ZSBmb3IgVEIKQGFjdGl2aXR5OiBISVYuRDQgU2NyZWVuIGZvciBUQgpAZGVzY3JpcHRpb246IFNjcmVlbmluZyByZXN1bHQgd2FzIG5lZ2F0aXZlIGZvciB0dWJlcmN1bG9zaXMgKFRCKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2NyZWVuIG5lZ2F0aXZlIGZvciBUQiI6CiAgZXhpc3RzICJTY3JlZW4gbmVnYXRpdmUgZm9yIFRCIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiU2NyZWVuIG5lZ2F0aXZlIGZvciBUQiBPYnNlcnZhdGlvbiIKZGVmaW5lICJTY3JlZW4gbmVnYXRpdmUgZm9yIFRCIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNjcmVlbiBuZWdhdGl2ZSBmb3IgVEIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJTY3JlZW4gbmVnYXRpdmUgZm9yIFRCIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iU2NyZWVuIG5lZ2F0aXZlIGZvciBUQiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNjcmVlbiBuZWdhdGl2ZSBmb3IgVEIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREU5ODkgLSBJbmNvbmNsdXNpdmUKQGFjdGl2aXR5OiBISVYuRDQgU2NyZWVuIGZvciBUQgpAZGVzY3JpcHRpb246IFNjcmVlbmluZyByZXN1bHQgd2FzIGluY29uY2x1c2l2ZSBmb3IgdHViZXJjdWxvc2lzIChUQikKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkluY29uY2x1c2l2ZSBELkRFOTg5IjoKICBleGlzdHMgIkluY29uY2x1c2l2ZSBELkRFOTg5IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSW5jb25jbHVzaXZlIEQuREU5ODkgT2JzZXJ2YXRpb24iCmRlZmluZSAiSW5jb25jbHVzaXZlIEQuREU5ODkgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW5jb25jbHVzaXZlIEQuREU5ODkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJJbmNvbmNsdXNpdmUgRC5ERTk4OSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkluY29uY2x1c2l2ZSBELkRFOTg5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW5jb25jbHVzaXZlIEQuREU5ODkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkQuREUxMDIzIC0gVEIgcHJldmVudGlvbiBzZXJ2aWNlcyBhY2NlcHRlZApAYWN0aXZpdHk6IEhJVi5EMjEgRGV0ZXJtaW5lIHJlZ2ltZW4gYW5kIHRyZWF0bWVudCBvcHRpb25zCkBkZXNjcmlwdGlvbjogSW5kaWNhdGVzIGlmIHRoZSBjbGllbnQgYWNjZXB0cyB0byBiZSBldmFsdWF0ZWQgZm9yIFRCIGluZmVjdGlvbiBhbmQgdG8gdGFrZSB0aGUgdHJlYXRtZW50IGluIGNhc2UgaGUvc2hlIGlzIGVsaWdpYmxlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUQiBwcmV2ZW50aW9uIHNlcnZpY2VzIGFjY2VwdGVkIjoKICBleGlzdHMgIlRCIHByZXZlbnRpb24gc2VydmljZXMgYWNjZXB0ZWQgT2JzZXJ2YXRpb24iCmRlZmluZSAiVEIgcHJldmVudGlvbiBzZXJ2aWNlcyBhY2NlcHRlZCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlRCIHByZXZlbnRpb24gc2VydmljZXMgYWNjZXB0ZWQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUQiBwcmV2ZW50aW9uIHNlcnZpY2VzIGFjY2VwdGVkICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ELkRFMTAyNiAtIEMgcmVhY3RpdmUgcHJvdGVpbiB0ZXN0IHJlc3VsdApAYWN0aXZpdHk6IEhJVi5ENCBTY3JlZW4gZm9yIFRCCkBkZXNjcmlwdGlvbjogVGVzdCByZXN1bHQgb2YgdGhlIGNsaWVudCdzIEMgcmVhY3RpdmUgcHJvdGVpbiB0ZXN0IHJlc3VsdCBpbiBtZy9MCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJDIHJlYWN0aXZlIHByb3RlaW4gdGVzdCByZXN1bHQiOgogIEVsZW1lbnRzLiJDIHJlYWN0aXZlIHByb3RlaW4gdGVzdCByZXN1bHQiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQyByZWFjdGl2ZSBwcm90ZWluIHRlc3QgcmVzdWx0IFZhbHVlIjoKICAiQyByZWFjdGl2ZSBwcm90ZWluIHRlc3QgcmVzdWx0IiBPCiAgcmV0dXJuIE8udmFsdWUKLyogRW5kIG9mIEMgcmVhY3RpdmUgcHJvdGVpbiB0ZXN0IHJlc3VsdCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTg1IC0gQU5DIGNvbnRhY3QgZGF0ZQpAYWN0aXZpdHk6IEhJVi5FMSBDYXB0dXJlIG9yIHVwZGF0ZSBtb3RoZXIncyBoaXN0b3J5CkBkZXNjcmlwdGlvbjogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGNsaWVudCdzIEFOQyBjb250YWN0IChpbiB0aGUgQU5DIERBSyB0aGlzIGlzIGNhbGxlZCAnQ29udGFjdCBkYXRlJykKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFOQyBjb250YWN0IGRhdGUgRS5ERTg1IjoKICBFbGVtZW50cy4iQU5DIGNvbnRhY3QgZGF0ZSBFLkRFODUiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQU5DIGNvbnRhY3QgZGF0ZSBFLkRFODUgVmFsdWUiOgogICJBTkMgY29udGFjdCBkYXRlIEUuREU4NSIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBBTkMgY29udGFjdCBkYXRlIEUuREU4NSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTExMyAtIEtleSBwb3B1bGF0aW9uIG1lbWJlcgpAYWN0aXZpdHk6IEhJVi5FMSBDYXB0dXJlIG9yIHVwZGF0ZSBtb3RoZXIncyBoaXN0b3J5CkBkZXNjcmlwdGlvbjogTW90aGVyIGlzIGEgbWVtYmVyIG9mIGEga2V5IHBvcHVsYXRpb24gd2hpY2ggaGFzIGFuIGluY3JlYXNlZCByaXNrIG9mIEhJVgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiS2V5IHBvcHVsYXRpb24gbWVtYmVyIEUuREUxMTMiOgogIGV4aXN0cyAiS2V5IHBvcHVsYXRpb24gbWVtYmVyIEUuREUxMTMgT2JzZXJ2YXRpb24iCmRlZmluZSAiS2V5IHBvcHVsYXRpb24gbWVtYmVyIEUuREUxMTMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJLZXkgcG9wdWxhdGlvbiBtZW1iZXIgRS5ERTExMyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEtleSBwb3B1bGF0aW9uIG1lbWJlciBFLkRFMTEzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMTE0IC0gS2V5IHBvcHVsYXRpb24gbWVtYmVyIHR5cGUKQGFjdGl2aXR5OiBISVYuRTEgQ2FwdHVyZSBvciB1cGRhdGUgbW90aGVyJ3MgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoZSB0eXBlIG9mIGtleSBwb3B1bGF0aW9uIHRoYXQgdGhlIGluZmFudCdzIG1vdGhlciBpcyBpbmNsdWRlZCBpbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiS2V5IHBvcHVsYXRpb24gbWVtYmVyIHR5cGUgRS5ERTExNCI6CiAgZXhpc3RzICJLZXkgcG9wdWxhdGlvbiBtZW1iZXIgdHlwZSBFLkRFMTE0IE9ic2VydmF0aW9uIgpkZWZpbmUgIktleSBwb3B1bGF0aW9uIG1lbWJlciB0eXBlIEUuREUxMTQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJLZXkgcG9wdWxhdGlvbiBtZW1iZXIgdHlwZSBFLkRFMTE0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgS2V5IHBvcHVsYXRpb24gbWVtYmVyIHR5cGUgRS5ERTExNCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTExNSAtIFNleCB3b3JrZXIKQGFjdGl2aXR5OiBISVYuRTEgQ2FwdHVyZSBvciB1cGRhdGUgbW90aGVyJ3MgaGlzdG9yeQpAZGVzY3JpcHRpb246IEluZmFudCdzIG1vdGhlciBpcyBhIHNleCB3b3JrZXIKKi8KZGVmaW5lICJTZXggd29ya2VyIEUuREUxMTUiOgogIEVsZW1lbnRzLiJTZXggd29ya2VyIEUuREUxMTUiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTZXggd29ya2VyIEUuREUxMTUgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxMTYgLSBQZW9wbGUgd2hvIGluamVjdCBkcnVncwpAYWN0aXZpdHk6IEhJVi5FMSBDYXB0dXJlIG9yIHVwZGF0ZSBtb3RoZXIncyBoaXN0b3J5CkBkZXNjcmlwdGlvbjogSW5mYW50J3MgbW90aGVyIGlzIGEgcGVyc29uIHdobyBpbmplY3RzIGRydWdzCiovCmRlZmluZSAiUGVvcGxlIHdobyBpbmplY3QgZHJ1Z3MgRS5ERTExNiI6CiAgRWxlbWVudHMuIlBlb3BsZSB3aG8gaW5qZWN0IGRydWdzIEUuREUxMTYiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQZW9wbGUgd2hvIGluamVjdCBkcnVncyBFLkRFMTE2ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMTE3IC0gVHJhbnMgYW5kIGdlbmRlci1kaXZlcnNlIHBlb3BsZQpAYWN0aXZpdHk6IEhJVi5FMSBDYXB0dXJlIG9yIHVwZGF0ZSBtb3RoZXIncyBoaXN0b3J5CkBkZXNjcmlwdGlvbjogSW5mYW50J3MgbW90aGVyIGlkZW50aWZpZXMgYXMgdHJhbnMgYW5kIGdlbmRlci1kaXZlcnNlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUcmFucyBhbmQgZ2VuZGVyLWRpdmVyc2UgcGVvcGxlIEUuREUxMTciOgogIEVsZW1lbnRzLiJUcmFucyBhbmQgZ2VuZGVyLWRpdmVyc2UgcGVvcGxlIEUuREUxMTciIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUcmFucyBhbmQgZ2VuZGVyLWRpdmVyc2UgcGVvcGxlIEUuREUxMTcgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxMTggLSBQZW9wbGUgbGl2aW5nIGluIHByaXNvbnMgYW5kIG90aGVyIGNsb3NlZCBzZXR0aW5nCkBhY3Rpdml0eTogSElWLkUxIENhcHR1cmUgb3IgdXBkYXRlIG1vdGhlcidzIGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBJbmZhbnQncyBtb3RoZXIgaXMgaW4gYSBwcmlzb24gb3IgY2xvc2VkIHNldHRpbmcKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBlb3BsZSBsaXZpbmcgaW4gcHJpc29ucyBhbmQgb3RoZXIgY2xvc2VkIHNldHRpbmciOgogIEVsZW1lbnRzLiJQZW9wbGUgbGl2aW5nIGluIHByaXNvbnMgYW5kIG90aGVyIGNsb3NlZCBzZXR0aW5nIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUGVvcGxlIGxpdmluZyBpbiBwcmlzb25zIGFuZCBvdGhlciBjbG9zZWQgc2V0dGluZyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE1NSAtIFNpZ25zIG9mIHN1YnN0YW50aWFsIHJpc2sgb2YgSElWIGluZmVjdGlvbgpAYWN0aXZpdHk6IEhJVi5FMSBDYXB0dXJlIG9yIHVwZGF0ZSBtb3RoZXIncyBoaXN0b3J5CkBkZXNjcmlwdGlvbjogU2lnbnMgdGhlIGNsaWVudCBpcyBhdCBhIHN1YnN0YW50aWFsIHJpc2sgb2YgSElWIGluZmVjdGlvbgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2lnbnMgb2Ygc3Vic3RhbnRpYWwgcmlzayBvZiBISVYgaW5mZWN0aW9uIEUuREUxNTUiOgogIGV4aXN0cyAiU2lnbnMgb2Ygc3Vic3RhbnRpYWwgcmlzayBvZiBISVYgaW5mZWN0aW9uIEUuREUxNTUgT2JzZXJ2YXRpb24iCmRlZmluZSAiU2lnbnMgb2Ygc3Vic3RhbnRpYWwgcmlzayBvZiBISVYgaW5mZWN0aW9uIEUuREUxNTUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTaWducyBvZiBzdWJzdGFudGlhbCByaXNrIG9mIEhJViBpbmZlY3Rpb24gRS5ERTE1NSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNpZ25zIG9mIHN1YnN0YW50aWFsIHJpc2sgb2YgSElWIGluZmVjdGlvbiBFLkRFMTU1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMTU2IC0gTm8gY29uZG9tIHVzZSBkdXJpbmcgc2V4IHdpdGggbW9yZSB0aGFuIG9uZSBwYXJ0bmVyIGluIHRoZSBwYXN0IDYgbW9udGhzCkBhY3Rpdml0eTogSElWLkUxIENhcHR1cmUgb3IgdXBkYXRlIG1vdGhlcidzIGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBSZWNlbnQgdmFnaW5hbCBvciBhbmFsIHNleHVhbCBpbnRlcmNvdXJzZSB3aXRob3V0IGEgY29uZG9tIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJ0bmVyCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJObyBjb25kb20gdXNlIGR1cmluZyBzZXggd2l0aCBtb3JlIHRoYW4gb25lIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgRS5ERTE1NiI6CiAgZXhpc3RzICJObyBjb25kb20gdXNlIGR1cmluZyBzZXggd2l0aCBtb3JlIHRoYW4gb25lIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgRS5ERTE1NiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk5vIGNvbmRvbSB1c2UgZHVyaW5nIHNleCB3aXRoIG1vcmUgdGhhbiBvbmUgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBFLkRFMTU2IE9ic2VydmF0aW9uIgpkZWZpbmUgIk5vIGNvbmRvbSB1c2UgZHVyaW5nIHNleCB3aXRoIG1vcmUgdGhhbiBvbmUgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBFLkRFMTU2IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk5vIGNvbmRvbSB1c2UgZHVyaW5nIHNleCB3aXRoIG1vcmUgdGhhbiBvbmUgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBFLkRFMTU2IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTm8gY29uZG9tIHVzZSBkdXJpbmcgc2V4IHdpdGggbW9yZSB0aGFuIG9uZSBwYXJ0bmVyIGluIHRoZSBwYXN0IDYgbW9udGhzIEUuREUxNTYgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJObyBjb25kb20gdXNlIGR1cmluZyBzZXggd2l0aCBtb3JlIHRoYW4gb25lIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgRS5ERTE1NiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5vIGNvbmRvbSB1c2UgZHVyaW5nIHNleCB3aXRoIG1vcmUgdGhhbiBvbmUgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBFLkRFMTU2ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMTU3IC0gU1RJIGluIHRoZSBwYXN0IDYgbW9udGhzCkBhY3Rpdml0eTogSElWLkUxIENhcHR1cmUgb3IgdXBkYXRlIG1vdGhlcidzIGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBBIHJlY2VudCBoaXN0b3J5IChpbiB0aGUgbGFzdCA2IG1vbnRocykgb2YgYSBzZXh1YWxseSB0cmFuc21pdHRlZCBpbmZlY3Rpb24gKFNUSSkgYnkgbGFib3JhdG9yeSB0ZXN0aW5nIG9yIHNlbGYtcmVwb3J0IG9mIHN5bmRyb21pYyBTVEkgdHJlYXRtZW50CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJTVEkgaW4gdGhlIHBhc3QgNiBtb250aHMgRS5ERTE1NyI6CiAgZXhpc3RzICJTVEkgaW4gdGhlIHBhc3QgNiBtb250aHMgRS5ERTE1NyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlNUSSBpbiB0aGUgcGFzdCA2IG1vbnRocyBFLkRFMTU3IE9ic2VydmF0aW9uIgpkZWZpbmUgIlNUSSBpbiB0aGUgcGFzdCA2IG1vbnRocyBFLkRFMTU3IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlNUSSBpbiB0aGUgcGFzdCA2IG1vbnRocyBFLkRFMTU3IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiU1RJIGluIHRoZSBwYXN0IDYgbW9udGhzIEUuREUxNTcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTVEkgaW4gdGhlIHBhc3QgNiBtb250aHMgRS5ERTE1NyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFNUSSBpbiB0aGUgcGFzdCA2IG1vbnRocyBFLkRFMTU3ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMTU4IC0gQSBzZXh1YWwgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBoYWQgb25lIG9yIG1vcmUgSElWIHJpc2sgZmFjdG9ycwpAYWN0aXZpdHk6IEhJVi5FMSBDYXB0dXJlIG9yIHVwZGF0ZSBtb3RoZXIncyBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQSByZWNlbnQgc2V4IHBhcnRuZXIgb2YgdGhlIGNsaWVudCBoYWQgSElWIHJpc2sgZmFjdG9ycwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQSBzZXh1YWwgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBoYWQgb25lIG9yIG1vcmUgSElWIHJpc2sgZmFjdG9ycyBFLkRFMTU4IjoKICBleGlzdHMgIkEgc2V4dWFsIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgaGFkIG9uZSBvciBtb3JlIEhJViByaXNrIGZhY3RvcnMgRS5ERTE1OCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkEgc2V4dWFsIHBhcnRuZXIgaW4gdGhlIHBhc3QgNiBtb250aHMgaGFkIG9uZSBvciBtb3JlIEhJViByaXNrIGZhY3RvcnMgRS5ERTE1OCBPYnNlcnZhdGlvbiIKZGVmaW5lICJBIHNleHVhbCBwYXJ0bmVyIGluIHRoZSBwYXN0IDYgbW9udGhzIGhhZCBvbmUgb3IgbW9yZSBISVYgcmlzayBmYWN0b3JzIEUuREUxNTggQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQSBzZXh1YWwgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBoYWQgb25lIG9yIG1vcmUgSElWIHJpc2sgZmFjdG9ycyBFLkRFMTU4IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQSBzZXh1YWwgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBoYWQgb25lIG9yIG1vcmUgSElWIHJpc2sgZmFjdG9ycyBFLkRFMTU4IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQSBzZXh1YWwgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBoYWQgb25lIG9yIG1vcmUgSElWIHJpc2sgZmFjdG9ycyBFLkRFMTU4IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQSBzZXh1YWwgcGFydG5lciBpbiB0aGUgcGFzdCA2IG1vbnRocyBoYWQgb25lIG9yIG1vcmUgSElWIHJpc2sgZmFjdG9ycyBFLkRFMTU4ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMTU5IC0gUHJFUCByZXF1ZXN0ZWQgYnkgY2xpZW50CkBhY3Rpdml0eTogSElWLkUxIENhcHR1cmUgb3IgdXBkYXRlIG1vdGhlcidzIGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBDbGllbnQgaXMgcmVxdWVzdGluZyBQckVQLCByZWZsZWN0aW5nIGEgZGVjaXNpb24tbWFraW5nIHByb2Nlc3MgaGFzIGFscmVhZHkgdGFrZW4gcGxhY2UgYW5kIHN1Z2dlc3Rpbmcgb2Ygc3Vic3RhbnRpYWwgcmlzayBvZiBISVYKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlByRVAgcmVxdWVzdGVkIGJ5IGNsaWVudCBFLkRFMTU5IjoKICBleGlzdHMgIlByRVAgcmVxdWVzdGVkIGJ5IGNsaWVudCBFLkRFMTU5IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUHJFUCByZXF1ZXN0ZWQgYnkgY2xpZW50IEUuREUxNTkgT2JzZXJ2YXRpb24iCmRlZmluZSAiUHJFUCByZXF1ZXN0ZWQgYnkgY2xpZW50IEUuREUxNTkgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUHJFUCByZXF1ZXN0ZWQgYnkgY2xpZW50IEUuREUxNTkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQckVQIHJlcXVlc3RlZCBieSBjbGllbnQgRS5ERTE1OSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlByRVAgcmVxdWVzdGVkIGJ5IGNsaWVudCBFLkRFMTU5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUHJFUCByZXF1ZXN0ZWQgYnkgY2xpZW50IEUuREUxNTkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxNjAgLSBTZXJvZGlzY29yZGFudCBwYXJ0bmVyCkBhY3Rpdml0eTogSElWLkUxIENhcHR1cmUgb3IgdXBkYXRlIG1vdGhlcidzIGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBNb3RoZXIncyBISVYgc3RhdHVzIGlzIGRpZmZlcmVudCBmcm9tIGEgY3VycmVudCBwYXJ0bmVyJ3MgSElWIHN0YXR1cwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU2Vyb2Rpc2NvcmRhbnQgcGFydG5lciBFLkRFMTYwIjoKICBleGlzdHMgIlNlcm9kaXNjb3JkYW50IHBhcnRuZXIgRS5ERTE2MCBPYnNlcnZhdGlvbiIKZGVmaW5lICJTZXJvZGlzY29yZGFudCBwYXJ0bmVyIEUuREUxNjAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTZXJvZGlzY29yZGFudCBwYXJ0bmVyIEUuREUxNjAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTZXJvZGlzY29yZGFudCBwYXJ0bmVyIEUuREUxNjAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxNjggLSBISVYgdGVzdCB0eXBlCkBhY3Rpdml0eTogSElWLkU0IFRlc3QgbW90aGVyIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUeXBlIG9mIEhJViB0ZXN0CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJISVYgdGVzdCB0eXBlIEUuREUxNjgiOgogIGV4aXN0cyAiSElWIHRlc3QgdHlwZSBFLkRFMTY4IE9ic2VydmF0aW9uIgpkZWZpbmUgIkhJViB0ZXN0IHR5cGUgRS5ERTE2OCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJViB0ZXN0IHR5cGUgRS5ERTE2OCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhJViB0ZXN0IHR5cGUgRS5ERTE2OCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE2OSAtIFJhcGlkIGRpYWdub3N0aWMgdGVzdCBmb3IgSElWCkBhY3Rpdml0eTogSElWLkU0IFRlc3QgbW90aGVyIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBBbnRpYm9keSB0ZXN0IGZvciBISVYgcGVyZm9ybWVkIHdpdGggYSByYXBpZCBkaWFnbm9zdGljIChSRFQpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSYXBpZCBkaWFnbm9zdGljIHRlc3QgZm9yIEhJViBFLkRFMTY5IjoKICBleGlzdHMgIlJhcGlkIGRpYWdub3N0aWMgdGVzdCBmb3IgSElWIEUuREUxNjkgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJSYXBpZCBkaWFnbm9zdGljIHRlc3QgZm9yIEhJViBFLkRFMTY5IE9ic2VydmF0aW9uIgpkZWZpbmUgIlJhcGlkIGRpYWdub3N0aWMgdGVzdCBmb3IgSElWIEUuREUxNjkgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUmFwaWQgZGlhZ25vc3RpYyB0ZXN0IGZvciBISVYgRS5ERTE2OSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlJhcGlkIGRpYWdub3N0aWMgdGVzdCBmb3IgSElWIEUuREUxNjkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSYXBpZCBkaWFnbm9zdGljIHRlc3QgZm9yIEhJViBFLkRFMTY5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUmFwaWQgZGlhZ25vc3RpYyB0ZXN0IGZvciBISVYgRS5ERTE2OSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE3MCAtIEVuenltZSBpbW11bm9hc3NheSBmb3IgSElWCkBhY3Rpdml0eTogSElWLkU0IFRlc3QgbW90aGVyIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBBbnRpYm9keSB0ZXN0IGZvciBISVYgcGVyZm9ybWVkIHdpdGggYW4gZW56eW1lIGltbXVub2Fzc2F5IChFSUEpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJFbnp5bWUgaW1tdW5vYXNzYXkgZm9yIEhJViBFLkRFMTcwIjoKICBleGlzdHMgIkVuenltZSBpbW11bm9hc3NheSBmb3IgSElWIEUuREUxNzAgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJFbnp5bWUgaW1tdW5vYXNzYXkgZm9yIEhJViBFLkRFMTcwIE9ic2VydmF0aW9uIgpkZWZpbmUgIkVuenltZSBpbW11bm9hc3NheSBmb3IgSElWIEUuREUxNzAgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRW56eW1lIGltbXVub2Fzc2F5IGZvciBISVYgRS5ERTE3MCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkVuenltZSBpbW11bm9hc3NheSBmb3IgSElWIEUuREUxNzAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJFbnp5bWUgaW1tdW5vYXNzYXkgZm9yIEhJViBFLkRFMTcwIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRW56eW1lIGltbXVub2Fzc2F5IGZvciBISVYgRS5ERTE3MCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE3MSAtIE51Y2xlaWMgYWNpZCB0ZXN0IGZvciBISVYKQGFjdGl2aXR5OiBISVYuRTQgVGVzdCBtb3RoZXIgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFZpcm9sb2dpY2FsIHRlc3QsIHdoaWNoIGluY2x1ZGVzIHRlc3RpbmcgZm9yIGVhcmx5IGluZmFudCBkaWFnbm9zaXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk51Y2xlaWMgYWNpZCB0ZXN0IGZvciBISVYgRS5ERTE3MSI6CiAgZXhpc3RzICJOdWNsZWljIGFjaWQgdGVzdCBmb3IgSElWIEUuREUxNzEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJOdWNsZWljIGFjaWQgdGVzdCBmb3IgSElWIEUuREUxNzEgT2JzZXJ2YXRpb24iCmRlZmluZSAiTnVjbGVpYyBhY2lkIHRlc3QgZm9yIEhJViBFLkRFMTcxIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk51Y2xlaWMgYWNpZCB0ZXN0IGZvciBISVYgRS5ERTE3MSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk51Y2xlaWMgYWNpZCB0ZXN0IGZvciBISVYgRS5ERTE3MSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk51Y2xlaWMgYWNpZCB0ZXN0IGZvciBISVYgRS5ERTE3MSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE51Y2xlaWMgYWNpZCB0ZXN0IGZvciBISVYgRS5ERTE3MSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE3MiAtIER1YWwgSElWL3N5cGhpbGlzIHJhcGlkIGRpYWdub3N0aWMgdGVzdApAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogQW50aWJvZHkgdGVzdCBmb3IgSElWIGFuZCBzeXBoaWxpcyBwZXJmb3JtZWQgd2l0aCBhIHJhcGlkIGRpYWdub3N0aWMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkR1YWwgSElWL3N5cGhpbGlzIHJhcGlkIGRpYWdub3N0aWMgdGVzdCBFLkRFMTcyIjoKICBleGlzdHMgIkR1YWwgSElWL3N5cGhpbGlzIHJhcGlkIGRpYWdub3N0aWMgdGVzdCBFLkRFMTcyIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRHVhbCBISVYvc3lwaGlsaXMgcmFwaWQgZGlhZ25vc3RpYyB0ZXN0IEUuREUxNzIgT2JzZXJ2YXRpb24iCmRlZmluZSAiRHVhbCBISVYvc3lwaGlsaXMgcmFwaWQgZGlhZ25vc3RpYyB0ZXN0IEUuREUxNzIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRHVhbCBISVYvc3lwaGlsaXMgcmFwaWQgZGlhZ25vc3RpYyB0ZXN0IEUuREUxNzIgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEdWFsIEhJVi9zeXBoaWxpcyByYXBpZCBkaWFnbm9zdGljIHRlc3QgRS5ERTE3MiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkR1YWwgSElWL3N5cGhpbGlzIHJhcGlkIGRpYWdub3N0aWMgdGVzdCBFLkRFMTcyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRHVhbCBISVYvc3lwaGlsaXMgcmFwaWQgZGlhZ25vc3RpYyB0ZXN0IEUuREUxNzIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxODAgLSBFSUQgc2FtcGxlIG51bWJlcgpAYWN0aXZpdHk6IEhJVi5GOCBUZXN0IGluZmFudC9jaGlsZCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogRWFybHkgaW5mYW50IGRpYWdub3NpcyAoRUlEKSBzYW1wbGUgbnVtYmVyCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJFSUQgc2FtcGxlIG51bWJlciI6CiAgZXhpc3RzICJFSUQgc2FtcGxlIG51bWJlciBPYnNlcnZhdGlvbiIKZGVmaW5lICJFSUQgc2FtcGxlIG51bWJlciBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkVJRCBzYW1wbGUgbnVtYmVyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRUlEIHNhbXBsZSBudW1iZXIgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxODEgLSBFSUQgc2FtcGxlIDEKQGFjdGl2aXR5OiBISVYuRjggVGVzdCBpbmZhbnQvY2hpbGQgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IEZpcnN0IHNhbXBsZSB1c2VkIHRvIHRlc3QgYW4gaW5mYW50IGZvciBISVYKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkVJRCBzYW1wbGUgMSI6CiAgZXhpc3RzICJFSUQgc2FtcGxlIDEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJFSUQgc2FtcGxlIDEgT2JzZXJ2YXRpb24iCmRlZmluZSAiRUlEIHNhbXBsZSAxIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkVJRCBzYW1wbGUgMSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkVJRCBzYW1wbGUgMSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkVJRCBzYW1wbGUgMSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEVJRCBzYW1wbGUgMSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE4MiAtIEVJRCBzYW1wbGUgMgpAYWN0aXZpdHk6IEhJVi5GOCBUZXN0IGluZmFudC9jaGlsZCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogU2Vjb25kIHNhbXBsZSB1c2VkIHRvIHRlc3QgYW4gaW5mYW50IGZvciBISVYKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkVJRCBzYW1wbGUgMiI6CiAgZXhpc3RzICJFSUQgc2FtcGxlIDIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJFSUQgc2FtcGxlIDIgT2JzZXJ2YXRpb24iCmRlZmluZSAiRUlEIHNhbXBsZSAyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkVJRCBzYW1wbGUgMiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkVJRCBzYW1wbGUgMiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkVJRCBzYW1wbGUgMiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEVJRCBzYW1wbGUgMiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE4MyAtIEVJRCB0ZXN0IG51bWJlcgpAYWN0aXZpdHk6IEhJVi5GOCBUZXN0IGluZmFudC9jaGlsZCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogRWFybHkgaW5mYW50IGRpYWdub3NpcyAoRUlEKSBISVYgdGVzdCBudW1iZXIgdXNpbmcgdGhlIHNhbWUgc2FtcGxlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJFSUQgdGVzdCBudW1iZXIiOgogIGV4aXN0cyAiRUlEIHRlc3QgbnVtYmVyIE9ic2VydmF0aW9uIgpkZWZpbmUgIkVJRCB0ZXN0IG51bWJlciBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkVJRCB0ZXN0IG51bWJlciBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEVJRCB0ZXN0IG51bWJlciAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE4NCAtIEVJRCB0ZXN0IG51bWJlciAxCkBhY3Rpdml0eTogSElWLkY4IFRlc3QgaW5mYW50L2NoaWxkIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBGaXJzdCB0ZXN0IG9uIGEgc2FtcGxlIHRvIHRlc3QgYW4gaW5mYW50IGZvciBISVYKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkVJRCB0ZXN0IG51bWJlciAxIjoKICBleGlzdHMgIkVJRCB0ZXN0IG51bWJlciAxIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiRUlEIHRlc3QgbnVtYmVyIDEgT2JzZXJ2YXRpb24iCmRlZmluZSAiRUlEIHRlc3QgbnVtYmVyIDEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iRUlEIHRlc3QgbnVtYmVyIDEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJFSUQgdGVzdCBudW1iZXIgMSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkVJRCB0ZXN0IG51bWJlciAxIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgRUlEIHRlc3QgbnVtYmVyIDEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxODUgLSBFSUQgdGVzdCBudW1iZXIgMgpAYWN0aXZpdHk6IEhJVi5GOCBUZXN0IGluZmFudC9jaGlsZCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogU2Vjb25kIHRlc3Qgb24gYSBzYW1wbGUgdG8gdGVzdCBhbiBpbmZhbnQgZm9yIEhJVgoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRUlEIHRlc3QgbnVtYmVyIDIiOgogIGV4aXN0cyAiRUlEIHRlc3QgbnVtYmVyIDIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJFSUQgdGVzdCBudW1iZXIgMiBPYnNlcnZhdGlvbiIKZGVmaW5lICJFSUQgdGVzdCBudW1iZXIgMiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJFSUQgdGVzdCBudW1iZXIgMiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkVJRCB0ZXN0IG51bWJlciAyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRUlEIHRlc3QgbnVtYmVyIDIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBFSUQgdGVzdCBudW1iZXIgMiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE4NiAtIEVJRCB0ZXN0IG51bWJlciAxIHRlc3QgcmVzdWx0CkBhY3Rpdml0eTogSElWLkY4IFRlc3QgaW5mYW50L2NoaWxkIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBFYXJseSBpbmZhbnQgZGlhZ25vc2lzIHRlc3QgbnVtYmVyIDEgdGVzdCByZXN1bHQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkVJRCB0ZXN0IG51bWJlciAxIHRlc3QgcmVzdWx0IjoKICBleGlzdHMgIkVJRCB0ZXN0IG51bWJlciAxIHRlc3QgcmVzdWx0IE9ic2VydmF0aW9uIgpkZWZpbmUgIkVJRCB0ZXN0IG51bWJlciAxIHRlc3QgcmVzdWx0IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iRUlEIHRlc3QgbnVtYmVyIDEgdGVzdCByZXN1bHQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBFSUQgdGVzdCBudW1iZXIgMSB0ZXN0IHJlc3VsdCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE4NyAtIFBvc2l0aXZlCkBhY3Rpdml0eTogSElWLkY4IFRlc3QgaW5mYW50L2NoaWxkIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBQb3NpdGl2ZSBISVYgdGVzdCByZXN1bHQgZnJvbSB0aGUgbnVjbGVpYyBhY2lkIHRlc3QKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBvc2l0aXZlIEUuREUxODciOgogIGV4aXN0cyAiUG9zaXRpdmUgRS5ERTE4NyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlBvc2l0aXZlIEUuREUxODcgT2JzZXJ2YXRpb24iCmRlZmluZSAiUG9zaXRpdmUgRS5ERTE4NyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJQb3NpdGl2ZSBFLkRFMTg3IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUG9zaXRpdmUgRS5ERTE4NyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBvc2l0aXZlIEUuREUxODcgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBQb3NpdGl2ZSBFLkRFMTg3ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMTg4IC0gTmVnYXRpdmUKQGFjdGl2aXR5OiBISVYuRjggVGVzdCBpbmZhbnQvY2hpbGQgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IE5lZ2F0aXZlIEhJViB0ZXN0IHJlc3VsdCBmcm9tIHRoZSBudWNsZWljIGFjaWQgdGVzdAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTmVnYXRpdmUgRS5ERTE4OCI6CiAgZXhpc3RzICJOZWdhdGl2ZSBFLkRFMTg4IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTmVnYXRpdmUgRS5ERTE4OCBPYnNlcnZhdGlvbiIKZGVmaW5lICJOZWdhdGl2ZSBFLkRFMTg4IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk5lZ2F0aXZlIEUuREUxODggQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJOZWdhdGl2ZSBFLkRFMTg4IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTmVnYXRpdmUgRS5ERTE4OCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5lZ2F0aXZlIEUuREUxODggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxODkgLSBJbmRldGVybWluYXRlCkBhY3Rpdml0eTogSElWLkY4IFRlc3QgaW5mYW50L2NoaWxkIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBJbmRldGVybWluYXRlIEhJViB0ZXN0IHJlc3VsdCBmcm9tIHRoZSBudWNsZWljIGFjaWQgdGVzdAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW5kZXRlcm1pbmF0ZSBFLkRFMTg5IjoKICBleGlzdHMgIkluZGV0ZXJtaW5hdGUgRS5ERTE4OSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkluZGV0ZXJtaW5hdGUgRS5ERTE4OSBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbmRldGVybWluYXRlIEUuREUxODkgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW5kZXRlcm1pbmF0ZSBFLkRFMTg5IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSW5kZXRlcm1pbmF0ZSBFLkRFMTg5IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW5kZXRlcm1pbmF0ZSBFLkRFMTg5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW5kZXRlcm1pbmF0ZSBFLkRFMTg5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMTkwIC0gRUlEIHRlc3QgbnVtYmVyIDIgdGVzdCByZXN1bHQKQGFjdGl2aXR5OiBISVYuRjggVGVzdCBpbmZhbnQvY2hpbGQgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IEVhcmx5IGluZmFudCBkaWFnbm9zaXMgdGVzdCBudW1iZXIgMiB0ZXN0IHJlc3VsdAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiRUlEIHRlc3QgbnVtYmVyIDIgdGVzdCByZXN1bHQiOgogIGV4aXN0cyAiRUlEIHRlc3QgbnVtYmVyIDIgdGVzdCByZXN1bHQgT2JzZXJ2YXRpb24iCmRlZmluZSAiRUlEIHRlc3QgbnVtYmVyIDIgdGVzdCByZXN1bHQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJFSUQgdGVzdCBudW1iZXIgMiB0ZXN0IHJlc3VsdCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEVJRCB0ZXN0IG51bWJlciAyIHRlc3QgcmVzdWx0ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMTkxIC0gUG9zaXRpdmUKQGFjdGl2aXR5OiBISVYuRjggVGVzdCBpbmZhbnQvY2hpbGQgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFBvc2l0aXZlIEhJViB0ZXN0IHJlc3VsdCBmcm9tIHRoZSBudWNsZWljIGFjaWQgdGVzdAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUG9zaXRpdmUgRS5ERTE5MSI6CiAgZXhpc3RzICJQb3NpdGl2ZSBFLkRFMTkxIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUG9zaXRpdmUgRS5ERTE5MSBPYnNlcnZhdGlvbiIKZGVmaW5lICJQb3NpdGl2ZSBFLkRFMTkxIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlBvc2l0aXZlIEUuREUxOTEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJQb3NpdGl2ZSBFLkRFMTkxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUG9zaXRpdmUgRS5ERTE5MSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFBvc2l0aXZlIEUuREUxOTEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxOTIgLSBOZWdhdGl2ZQpAYWN0aXZpdHk6IEhJVi5GOCBUZXN0IGluZmFudC9jaGlsZCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogTmVnYXRpdmUgSElWIHRlc3QgcmVzdWx0IGZyb20gdGhlIG51Y2xlaWMgYWNpZCB0ZXN0CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJOZWdhdGl2ZSBFLkRFMTkyIjoKICBleGlzdHMgIk5lZ2F0aXZlIEUuREUxOTIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJOZWdhdGl2ZSBFLkRFMTkyIE9ic2VydmF0aW9uIgpkZWZpbmUgIk5lZ2F0aXZlIEUuREUxOTIgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTmVnYXRpdmUgRS5ERTE5MiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk5lZ2F0aXZlIEUuREUxOTIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJOZWdhdGl2ZSBFLkRFMTkyIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTmVnYXRpdmUgRS5ERTE5MiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE5MyAtIEluZGV0ZXJtaW5hdGUKQGFjdGl2aXR5OiBISVYuRjggVGVzdCBpbmZhbnQvY2hpbGQgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IEluZGV0ZXJtaW5hdGUgSElWIHRlc3QgcmVzdWx0IGZyb20gdGhlIG51Y2xlaWMgYWNpZCB0ZXN0CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJJbmRldGVybWluYXRlIEUuREUxOTMiOgogIGV4aXN0cyAiSW5kZXRlcm1pbmF0ZSBFLkRFMTkzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSW5kZXRlcm1pbmF0ZSBFLkRFMTkzIE9ic2VydmF0aW9uIgpkZWZpbmUgIkluZGV0ZXJtaW5hdGUgRS5ERTE5MyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJJbmRldGVybWluYXRlIEUuREUxOTMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJJbmRldGVybWluYXRlIEUuREUxOTMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJJbmRldGVybWluYXRlIEUuREUxOTMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBJbmRldGVybWluYXRlIEUuREUxOTMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxOTQgLSBBc3NheSBudW1iZXIgaW4gdGVzdGluZyBzdHJhdGVneQpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIG51bWJlciBvZiB0aGUgYXNzYXkgKHRlc3Qga2l0KSBpbiB0aGUgSElWIHRlc3Rpbmcgc3RyYXRlZ3kKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFzc2F5IG51bWJlciBpbiB0ZXN0aW5nIHN0cmF0ZWd5IEUuREUxOTQiOgogIGV4aXN0cyAiQXNzYXkgbnVtYmVyIGluIHRlc3Rpbmcgc3RyYXRlZ3kgRS5ERTE5NCBPYnNlcnZhdGlvbiIKZGVmaW5lICJBc3NheSBudW1iZXIgaW4gdGVzdGluZyBzdHJhdGVneSBFLkRFMTk0IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQXNzYXkgbnVtYmVyIGluIHRlc3Rpbmcgc3RyYXRlZ3kgRS5ERTE5NCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFzc2F5IG51bWJlciBpbiB0ZXN0aW5nIHN0cmF0ZWd5IEUuREUxOTQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxOTUgLSBBc3NheSAwCkBhY3Rpdml0eTogSElWLkU0IFRlc3QgbW90aGVyIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBBIGNvbW11bml0eSBvdXRyZWFjaCB0ZXN0LWZvci10cmlhZ2Ugb3Igc2VsZi10ZXN0IHdoaWNoIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgSElWIHRlc3Rpbmcgc3RyYXRlZ3kKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFzc2F5IDAgRS5ERTE5NSI6CiAgZXhpc3RzICJBc3NheSAwIEUuREUxOTUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBc3NheSAwIEUuREUxOTUgT2JzZXJ2YXRpb24iCmRlZmluZSAiQXNzYXkgMCBFLkRFMTk1IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFzc2F5IDAgRS5ERTE5NSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFzc2F5IDAgRS5ERTE5NSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFzc2F5IDAgRS5ERTE5NSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFzc2F5IDAgRS5ERTE5NSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTE5NiAtIEFzc2F5IDEKQGFjdGl2aXR5OiBISVYuRTQgVGVzdCBtb3RoZXIgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSBmaXJzdCB0ZXN0IGluIHRoZSBISVYgdGVzdGluZyBzdHJhdGVneQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQXNzYXkgMSBFLkRFMTk2IjoKICBleGlzdHMgIkFzc2F5IDEgRS5ERTE5NiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFzc2F5IDEgRS5ERTE5NiBPYnNlcnZhdGlvbiIKZGVmaW5lICJBc3NheSAxIEUuREUxOTYgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQXNzYXkgMSBFLkRFMTk2IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQXNzYXkgMSBFLkRFMTk2IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQXNzYXkgMSBFLkRFMTk2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQXNzYXkgMSBFLkRFMTk2ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMTk3IC0gQXNzYXkgMgpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHNlY29uZCB0ZXN0IGluIHRoZSBISVYgdGVzdGluZyBzdHJhdGVneQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQXNzYXkgMiBFLkRFMTk3IjoKICBleGlzdHMgIkFzc2F5IDIgRS5ERTE5NyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkFzc2F5IDIgRS5ERTE5NyBPYnNlcnZhdGlvbiIKZGVmaW5lICJBc3NheSAyIEUuREUxOTcgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iQXNzYXkgMiBFLkRFMTk3IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQXNzYXkgMiBFLkRFMTk3IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iQXNzYXkgMiBFLkRFMTk3IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQXNzYXkgMiBFLkRFMTk3ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMTk4IC0gQXNzYXkgMwpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHRoaXJkIHRlc3QgaW4gdGhlIEhJViB0ZXN0aW5nIHN0cmF0ZWd5CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBc3NheSAzIEUuREUxOTgiOgogIGV4aXN0cyAiQXNzYXkgMyBFLkRFMTk4IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiQXNzYXkgMyBFLkRFMTk4IE9ic2VydmF0aW9uIgpkZWZpbmUgIkFzc2F5IDMgRS5ERTE5OCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJBc3NheSAzIEUuREUxOTggQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBc3NheSAzIEUuREUxOTggT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJBc3NheSAzIEUuREUxOTggT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBBc3NheSAzIEUuREUxOTggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUxOTkgLSBBc3NheSAxIHJlcGVhdGVkCkBhY3Rpdml0eTogSElWLkU0IFRlc3QgbW90aGVyIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgZmlyc3QgdGVzdCBpbiB0aGUgSElWIHRlc3Rpbmcgc3RyYXRlZ3kKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkFzc2F5IDEgcmVwZWF0ZWQgRS5ERTE5OSI6CiAgZXhpc3RzICJBc3NheSAxIHJlcGVhdGVkIEUuREUxOTkgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJBc3NheSAxIHJlcGVhdGVkIEUuREUxOTkgT2JzZXJ2YXRpb24iCmRlZmluZSAiQXNzYXkgMSByZXBlYXRlZCBFLkRFMTk5IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkFzc2F5IDEgcmVwZWF0ZWQgRS5ERTE5OSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkFzc2F5IDEgcmVwZWF0ZWQgRS5ERTE5OSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkFzc2F5IDEgcmVwZWF0ZWQgRS5ERTE5OSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEFzc2F5IDEgcmVwZWF0ZWQgRS5ERTE5OSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTIwMCAtIFRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxCkBhY3Rpdml0eTogSElWLkU0IFRlc3QgbW90aGVyIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgcmVzdWx0IG9mIHRoZSBmaXJzdCBISVYgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxIEUuREUyMDAiOgogIGV4aXN0cyAiVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDEgRS5ERTIwMCBPYnNlcnZhdGlvbiIKZGVmaW5lICJUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMSBFLkRFMjAwIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDEgRS5ERTIwMCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxIEUuREUyMDAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUyMDEgLSBSZWFjdGl2ZQpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IHdhcyByZWFjdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmVhY3RpdmUgRS5ERTIwMSI6CiAgZXhpc3RzICJSZWFjdGl2ZSBFLkRFMjAxIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmVhY3RpdmUgRS5ERTIwMSBPYnNlcnZhdGlvbiIKZGVmaW5lICJSZWFjdGl2ZSBFLkRFMjAxIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJlYWN0aXZlIEUuREUyMDEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSZWFjdGl2ZSBFLkRFMjAxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmVhY3RpdmUgRS5ERTIwMSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJlYWN0aXZlIEUuREUyMDEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUyMDIgLSBOb24tcmVhY3RpdmUKQGFjdGl2aXR5OiBISVYuRTQgVGVzdCBtb3RoZXIgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneSB3YXMgbm9uLXJlYWN0aXZlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJOb24tcmVhY3RpdmUgRS5ERTIwMiI6CiAgZXhpc3RzICJOb24tcmVhY3RpdmUgRS5ERTIwMiBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk5vbi1yZWFjdGl2ZSBFLkRFMjAyIE9ic2VydmF0aW9uIgpkZWZpbmUgIk5vbi1yZWFjdGl2ZSBFLkRFMjAyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk5vbi1yZWFjdGl2ZSBFLkRFMjAyIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTm9uLXJlYWN0aXZlIEUuREUyMDIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJOb24tcmVhY3RpdmUgRS5ERTIwMiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5vbi1yZWFjdGl2ZSBFLkRFMjAyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMjAzIC0gSW52YWxpZApAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IHdhcyBpbnZhbGlkCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJJbnZhbGlkIEUuREUyMDMiOgogIGV4aXN0cyAiSW52YWxpZCBFLkRFMjAzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSW52YWxpZCBFLkRFMjAzIE9ic2VydmF0aW9uIgpkZWZpbmUgIkludmFsaWQgRS5ERTIwMyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJJbnZhbGlkIEUuREUyMDMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJJbnZhbGlkIEUuREUyMDMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJJbnZhbGlkIEUuREUyMDMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBJbnZhbGlkIEUuREUyMDMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUyMDQgLSBUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMgpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgc2Vjb25kIEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDIgRS5ERTIwNCI6CiAgZXhpc3RzICJUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMiBFLkRFMjA0IE9ic2VydmF0aW9uIgpkZWZpbmUgIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAyIEUuREUyMDQgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMiBFLkRFMjA0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDIgRS5ERTIwNCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTIwNSAtIFJlYWN0aXZlCkBhY3Rpdml0eTogSElWLkU0IFRlc3QgbW90aGVyIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgcmVzdWx0IG9mIHRoZSBISVYgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kgd2FzIHJlYWN0aXZlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSZWFjdGl2ZSBFLkRFMjA1IjoKICBleGlzdHMgIlJlYWN0aXZlIEUuREUyMDUgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJSZWFjdGl2ZSBFLkRFMjA1IE9ic2VydmF0aW9uIgpkZWZpbmUgIlJlYWN0aXZlIEUuREUyMDUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUmVhY3RpdmUgRS5ERTIwNSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlJlYWN0aXZlIEUuREUyMDUgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSZWFjdGl2ZSBFLkRFMjA1IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUmVhY3RpdmUgRS5ERTIwNSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTIwNiAtIE5vbi1yZWFjdGl2ZQpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IHdhcyBub24tcmVhY3RpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk5vbi1yZWFjdGl2ZSBFLkRFMjA2IjoKICBleGlzdHMgIk5vbi1yZWFjdGl2ZSBFLkRFMjA2IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTm9uLXJlYWN0aXZlIEUuREUyMDYgT2JzZXJ2YXRpb24iCmRlZmluZSAiTm9uLXJlYWN0aXZlIEUuREUyMDYgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTm9uLXJlYWN0aXZlIEUuREUyMDYgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJOb24tcmVhY3RpdmUgRS5ERTIwNiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk5vbi1yZWFjdGl2ZSBFLkRFMjA2IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTm9uLXJlYWN0aXZlIEUuREUyMDYgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUyMDcgLSBJbnZhbGlkCkBhY3Rpdml0eTogSElWLkU0IFRlc3QgbW90aGVyIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgcmVzdWx0IG9mIHRoZSBISVYgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kgd2FzIGludmFsaWQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkludmFsaWQgRS5ERTIwNyI6CiAgZXhpc3RzICJJbnZhbGlkIEUuREUyMDcgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJJbnZhbGlkIEUuREUyMDcgT2JzZXJ2YXRpb24iCmRlZmluZSAiSW52YWxpZCBFLkRFMjA3IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkludmFsaWQgRS5ERTIwNyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkludmFsaWQgRS5ERTIwNyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkludmFsaWQgRS5ERTIwNyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEludmFsaWQgRS5ERTIwNyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTIwOCAtIFRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAzCkBhY3Rpdml0eTogSElWLkU0IFRlc3QgbW90aGVyIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgcmVzdWx0IG9mIHRoZSB0aGlyZCBISVYgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAzIEUuREUyMDgiOgogIGV4aXN0cyAiVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDMgRS5ERTIwOCBPYnNlcnZhdGlvbiIKZGVmaW5lICJUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMyBFLkRFMjA4IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDMgRS5ERTIwOCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAzIEUuREUyMDggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUyMDkgLSBSZWFjdGl2ZQpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IHdhcyByZWFjdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUmVhY3RpdmUgRS5ERTIwOSI6CiAgZXhpc3RzICJSZWFjdGl2ZSBFLkRFMjA5IENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiUmVhY3RpdmUgRS5ERTIwOSBPYnNlcnZhdGlvbiIKZGVmaW5lICJSZWFjdGl2ZSBFLkRFMjA5IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlJlYWN0aXZlIEUuREUyMDkgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJSZWFjdGl2ZSBFLkRFMjA5IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUmVhY3RpdmUgRS5ERTIwOSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFJlYWN0aXZlIEUuREUyMDkgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUyMTAgLSBOb24tcmVhY3RpdmUKQGFjdGl2aXR5OiBISVYuRTQgVGVzdCBtb3RoZXIgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneSB3YXMgbm9uLXJlYWN0aXZlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJOb24tcmVhY3RpdmUgRS5ERTIxMCI6CiAgZXhpc3RzICJOb24tcmVhY3RpdmUgRS5ERTIxMCBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk5vbi1yZWFjdGl2ZSBFLkRFMjEwIE9ic2VydmF0aW9uIgpkZWZpbmUgIk5vbi1yZWFjdGl2ZSBFLkRFMjEwIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk5vbi1yZWFjdGl2ZSBFLkRFMjEwIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTm9uLXJlYWN0aXZlIEUuREUyMTAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJOb24tcmVhY3RpdmUgRS5ERTIxMCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5vbi1yZWFjdGl2ZSBFLkRFMjEwICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMjExIC0gSW52YWxpZApAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IHdhcyBpbnZhbGlkCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJJbnZhbGlkIEUuREUyMTEiOgogIGV4aXN0cyAiSW52YWxpZCBFLkRFMjExIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSW52YWxpZCBFLkRFMjExIE9ic2VydmF0aW9uIgpkZWZpbmUgIkludmFsaWQgRS5ERTIxMSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJJbnZhbGlkIEUuREUyMTEgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJJbnZhbGlkIEUuREUyMTEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJJbnZhbGlkIEUuREUyMTEgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBJbnZhbGlkIEUuREUyMTEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUyMTIgLSBUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMSByZXBlYXRlZApAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgcmVwZWF0ZWQgZmlyc3QgSElWIGFzc2F5IGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMSByZXBlYXRlZCBFLkRFMjEyIjoKICBleGlzdHMgIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxIHJlcGVhdGVkIEUuREUyMTIgT2JzZXJ2YXRpb24iCmRlZmluZSAiVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDEgcmVwZWF0ZWQgRS5ERTIxMiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxIHJlcGVhdGVkIEUuREUyMTIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMSByZXBlYXRlZCBFLkRFMjEyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMjEzIC0gUmVhY3RpdmUKQGFjdGl2aXR5OiBISVYuRTQgVGVzdCBtb3RoZXIgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneSB3YXMgcmVhY3RpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlJlYWN0aXZlIEUuREUyMTMiOgogIGV4aXN0cyAiUmVhY3RpdmUgRS5ERTIxMyBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlJlYWN0aXZlIEUuREUyMTMgT2JzZXJ2YXRpb24iCmRlZmluZSAiUmVhY3RpdmUgRS5ERTIxMyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJSZWFjdGl2ZSBFLkRFMjEzIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUmVhY3RpdmUgRS5ERTIxMyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlJlYWN0aXZlIEUuREUyMTMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBSZWFjdGl2ZSBFLkRFMjEzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMjE0IC0gTm9uLXJlYWN0aXZlCkBhY3Rpdml0eTogSElWLkU0IFRlc3QgbW90aGVyIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgcmVzdWx0IG9mIHRoZSBISVYgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kgd2FzIG5vbi1yZWFjdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTm9uLXJlYWN0aXZlIEUuREUyMTQiOgogIGV4aXN0cyAiTm9uLXJlYWN0aXZlIEUuREUyMTQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJOb24tcmVhY3RpdmUgRS5ERTIxNCBPYnNlcnZhdGlvbiIKZGVmaW5lICJOb24tcmVhY3RpdmUgRS5ERTIxNCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJOb24tcmVhY3RpdmUgRS5ERTIxNCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk5vbi1yZWFjdGl2ZSBFLkRFMjE0IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTm9uLXJlYWN0aXZlIEUuREUyMTQgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBOb24tcmVhY3RpdmUgRS5ERTIxNCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTIxNSAtIEludmFsaWQKQGFjdGl2aXR5OiBISVYuRTQgVGVzdCBtb3RoZXIgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneSB3YXMgaW52YWxpZAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW52YWxpZCBFLkRFMjE1IjoKICBleGlzdHMgIkludmFsaWQgRS5ERTIxNSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkludmFsaWQgRS5ERTIxNSBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbnZhbGlkIEUuREUyMTUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW52YWxpZCBFLkRFMjE1IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSW52YWxpZCBFLkRFMjE1IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW52YWxpZCBFLkRFMjE1IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW52YWxpZCBFLkRFMjE1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMjE2IC0gVGVzdCByZXN1bHQgb2Ygc3lwaGlsaXMgYXNzYXkgMQpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgZmlyc3Qgc3lwaGlsaXMgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRlc3QgcmVzdWx0IG9mIHN5cGhpbGlzIGFzc2F5IDEiOgogIGV4aXN0cyAiVGVzdCByZXN1bHQgb2Ygc3lwaGlsaXMgYXNzYXkgMSBPYnNlcnZhdGlvbiIKZGVmaW5lICJUZXN0IHJlc3VsdCBvZiBzeXBoaWxpcyBhc3NheSAxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVGVzdCByZXN1bHQgb2Ygc3lwaGlsaXMgYXNzYXkgMSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFRlc3QgcmVzdWx0IG9mIHN5cGhpbGlzIGFzc2F5IDEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUyMTcgLSBSZWFjdGl2ZQpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgZmlyc3Qgc3lwaGlsaXMgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kgd2FzIHJlYWN0aXZlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSZWFjdGl2ZSBFLkRFMjE3IjoKICBleGlzdHMgIlJlYWN0aXZlIEUuREUyMTcgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJSZWFjdGl2ZSBFLkRFMjE3IE9ic2VydmF0aW9uIgpkZWZpbmUgIlJlYWN0aXZlIEUuREUyMTcgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUmVhY3RpdmUgRS5ERTIxNyBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlJlYWN0aXZlIEUuREUyMTcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSZWFjdGl2ZSBFLkRFMjE3IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUmVhY3RpdmUgRS5ERTIxNyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTIxOCAtIE5vbi1yZWFjdGl2ZQpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgZmlyc3Qgc3lwaGlsaXMgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kgd2FzIG5vbi1yZWFjdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTm9uLXJlYWN0aXZlIEUuREUyMTgiOgogIGV4aXN0cyAiTm9uLXJlYWN0aXZlIEUuREUyMTggQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJOb24tcmVhY3RpdmUgRS5ERTIxOCBPYnNlcnZhdGlvbiIKZGVmaW5lICJOb24tcmVhY3RpdmUgRS5ERTIxOCBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJOb24tcmVhY3RpdmUgRS5ERTIxOCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk5vbi1yZWFjdGl2ZSBFLkRFMjE4IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTm9uLXJlYWN0aXZlIEUuREUyMTggT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBOb24tcmVhY3RpdmUgRS5ERTIxOCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTIxOSAtIEludmFsaWQKQGFjdGl2aXR5OiBISVYuRTQgVGVzdCBtb3RoZXIgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIEhJViBhc3NheSBpbiB0aGUgdGVzdGluZyBzdHJhdGVneSB3YXMgaW52YWxpZAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW52YWxpZCBFLkRFMjE5IjoKICBleGlzdHMgIkludmFsaWQgRS5ERTIxOSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIkludmFsaWQgRS5ERTIxOSBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbnZhbGlkIEUuREUyMTkgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSW52YWxpZCBFLkRFMjE5IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiSW52YWxpZCBFLkRFMjE5IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW52YWxpZCBFLkRFMjE5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSW52YWxpZCBFLkRFMjE5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5FLkRFMjIwIC0gVGVzdCByZXN1bHQgb2Ygc3lwaGlsaXMgYXNzYXkgMSByZXBlYXRlZApAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgZmlyc3Qgc3lwaGlsaXMgYXNzYXkgcmVwZWF0ZWQgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRlc3QgcmVzdWx0IG9mIHN5cGhpbGlzIGFzc2F5IDEgcmVwZWF0ZWQiOgogIGV4aXN0cyAiVGVzdCByZXN1bHQgb2Ygc3lwaGlsaXMgYXNzYXkgMSByZXBlYXRlZCBPYnNlcnZhdGlvbiIKZGVmaW5lICJUZXN0IHJlc3VsdCBvZiBzeXBoaWxpcyBhc3NheSAxIHJlcGVhdGVkIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVGVzdCByZXN1bHQgb2Ygc3lwaGlsaXMgYXNzYXkgMSByZXBlYXRlZCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFRlc3QgcmVzdWx0IG9mIHN5cGhpbGlzIGFzc2F5IDEgcmVwZWF0ZWQgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkUuREUyMjEgLSBSZWFjdGl2ZQpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgZmlyc3Qgc3lwaGlsaXMgYXNzYXkgcmVwZWF0ZWQgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kgd2FzIHJlYWN0aXZlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJSZWFjdGl2ZSBFLkRFMjIxIjoKICBleGlzdHMgIlJlYWN0aXZlIEUuREUyMjEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJSZWFjdGl2ZSBFLkRFMjIxIE9ic2VydmF0aW9uIgpkZWZpbmUgIlJlYWN0aXZlIEUuREUyMjEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUmVhY3RpdmUgRS5ERTIyMSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlJlYWN0aXZlIEUuREUyMjEgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJSZWFjdGl2ZSBFLkRFMjIxIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUmVhY3RpdmUgRS5ERTIyMSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTIyMiAtIE5vbi1yZWFjdGl2ZQpAYWN0aXZpdHk6IEhJVi5FNCBUZXN0IG1vdGhlciBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBvZiB0aGUgZmlyc3Qgc3lwaGlsaXMgYXNzYXkgcmVwZWF0ZWQgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kgd2FzIG5vbi1yZWFjdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTm9uLXJlYWN0aXZlIEUuREUyMjIiOgogIGV4aXN0cyAiTm9uLXJlYWN0aXZlIEUuREUyMjIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJOb24tcmVhY3RpdmUgRS5ERTIyMiBPYnNlcnZhdGlvbiIKZGVmaW5lICJOb24tcmVhY3RpdmUgRS5ERTIyMiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJOb24tcmVhY3RpdmUgRS5ERTIyMiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk5vbi1yZWFjdGl2ZSBFLkRFMjIyIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTm9uLXJlYWN0aXZlIEUuREUyMjIgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBOb24tcmVhY3RpdmUgRS5ERTIyMiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRS5ERTIyMyAtIEludmFsaWQKQGFjdGl2aXR5OiBISVYuRTQgVGVzdCBtb3RoZXIgZm9yIEhJViB1c2luZyB0ZXN0aW5nIGFsZ29yaXRobQpAZGVzY3JpcHRpb246IFRoZSByZXN1bHQgb2YgdGhlIGZpcnN0IHN5cGhpbGlzIGFzc2F5IHJlcGVhdGVkIGluIHRoZSB0ZXN0aW5nIHN0cmF0ZWd5IHdhcyBpbnZhbGlkCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJJbnZhbGlkIEUuREUyMjMiOgogIGV4aXN0cyAiSW52YWxpZCBFLkRFMjIzIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSW52YWxpZCBFLkRFMjIzIE9ic2VydmF0aW9uIgpkZWZpbmUgIkludmFsaWQgRS5ERTIyMyBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJJbnZhbGlkIEUuREUyMjMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJJbnZhbGlkIEUuREUyMjMgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJJbnZhbGlkIEUuREUyMjMgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBJbnZhbGlkIEUuREUyMjMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkcuREUxIC0gQ0Q0IGNvdW50CkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IENENCBjZWxsIGNvdW50IGluIGNlbGxzL21tXjMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNENCBjb3VudCBHLkRFMSI6CiAgRWxlbWVudHMuIkNENCBjb3VudCBHLkRFMSIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJDRDQgY291bnQgRy5ERTEgVmFsdWUiOgogICJDRDQgY291bnQgRy5ERTEiIE8KICByZXR1cm4gTy52YWx1ZQovKiBFbmQgb2YgQ0Q0IGNvdW50IEcuREUxICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5HLkRFOCAtIERhdGUgb2YgdmlyYWwgbG9hZCBzYW1wbGUgY29sbGVjdGlvbgpAYWN0aXZpdHk6IEhJVi5EMjAgRGlhZ25vc3RpY3MKQGRlc2NyaXB0aW9uOiBEYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHNhbXBsZSB3YXMgY29sbGVjdGVkIHRvIHRlc3QgdGhlIGNsaWVudCdzIEhJViB2aXJhbCBsb2FkCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJEYXRlIG9mIHZpcmFsIGxvYWQgc2FtcGxlIGNvbGxlY3Rpb24gRy5ERTgiOgogIEVsZW1lbnRzLiJEYXRlIG9mIHZpcmFsIGxvYWQgc2FtcGxlIGNvbGxlY3Rpb24gRy5ERTgiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiRGF0ZSBvZiB2aXJhbCBsb2FkIHNhbXBsZSBjb2xsZWN0aW9uIEcuREU4IFZhbHVlIjoKICAiRGF0ZSBvZiB2aXJhbCBsb2FkIHNhbXBsZSBjb2xsZWN0aW9uIEcuREU4IiBPCiAgcmV0dXJuIE8udmFsdWUKLyogRW5kIG9mIERhdGUgb2YgdmlyYWwgbG9hZCBzYW1wbGUgY29sbGVjdGlvbiBHLkRFOCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRy5ERTEyIC0gVmlyYWwgbG9hZCB0ZXN0IHJlc3VsdApAYWN0aXZpdHk6IEhJVi5EMjAgRGlhZ25vc3RpY3MKQGRlc2NyaXB0aW9uOiBSZXN1bHQgZnJvbSB0aGUgdmlyYWwgbG9hZCB0ZXN0IGluIG51bWJlciBvZiBjb3BpZXMvbUwKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlZpcmFsIGxvYWQgdGVzdCByZXN1bHQgRy5ERTEyIjoKICBFbGVtZW50cy4iVmlyYWwgbG9hZCB0ZXN0IHJlc3VsdCBHLkRFMTIiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiVmlyYWwgbG9hZCB0ZXN0IHJlc3VsdCBHLkRFMTIgVmFsdWUiOgogICJWaXJhbCBsb2FkIHRlc3QgcmVzdWx0IEcuREUxMiIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBWaXJhbCBsb2FkIHRlc3QgcmVzdWx0IEcuREUxMiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRy5ERTE4IC0gSEJzQWcgdGVzdCByZXN1bHQKQGFjdGl2aXR5OiBISVYuRDIwIERpYWdub3N0aWNzCkBkZXNjcmlwdGlvbjogSGVwYXRpdGlzIEIgdmlydXMgdGVzdCByZXN1bHQgKEhCc0FnKQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSEJzQWcgdGVzdCByZXN1bHQgRy5ERTE4IjoKICBleGlzdHMgIkhCc0FnIHRlc3QgcmVzdWx0IEcuREUxOCBPYnNlcnZhdGlvbiIKZGVmaW5lICJIQnNBZyB0ZXN0IHJlc3VsdCBHLkRFMTggT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJIQnNBZyB0ZXN0IHJlc3VsdCBHLkRFMTggT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBIQnNBZyB0ZXN0IHJlc3VsdCBHLkRFMTggKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkcuREUxOSAtIFBvc2l0aXZlCkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IEhCc0FnIHRlc3QgcmVzdWx0IHdhcyBwb3NpdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUG9zaXRpdmUgRy5ERTE5IjoKICBleGlzdHMgIlBvc2l0aXZlIEcuREUxOSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlBvc2l0aXZlIEcuREUxOSBPYnNlcnZhdGlvbiIKZGVmaW5lICJQb3NpdGl2ZSBHLkRFMTkgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUG9zaXRpdmUgRy5ERTE5IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUG9zaXRpdmUgRy5ERTE5IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUG9zaXRpdmUgRy5ERTE5IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUG9zaXRpdmUgRy5ERTE5ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5HLkRFMjAgLSBOZWdhdGl2ZQpAYWN0aXZpdHk6IEhJVi5EMjAgRGlhZ25vc3RpY3MKQGRlc2NyaXB0aW9uOiBIQnNBZyB0ZXN0IHJlc3VsdCB3YXMgbmVnYXRpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk5lZ2F0aXZlIEcuREUyMCI6CiAgZXhpc3RzICJOZWdhdGl2ZSBHLkRFMjAgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJOZWdhdGl2ZSBHLkRFMjAgT2JzZXJ2YXRpb24iCmRlZmluZSAiTmVnYXRpdmUgRy5ERTIwIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk5lZ2F0aXZlIEcuREUyMCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk5lZ2F0aXZlIEcuREUyMCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk5lZ2F0aXZlIEcuREUyMCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5lZ2F0aXZlIEcuREUyMCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRy5ERTIxIC0gSW5kZXRlcm1pbmF0ZQpAYWN0aXZpdHk6IEhJVi5EMjAgRGlhZ25vc3RpY3MKQGRlc2NyaXB0aW9uOiBIQnNBZyB0ZXN0IHJlc3VsdCB3YXMgaW5kZXRlcm1pbmF0ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW5kZXRlcm1pbmF0ZSBHLkRFMjEiOgogIGV4aXN0cyAiSW5kZXRlcm1pbmF0ZSBHLkRFMjEgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJJbmRldGVybWluYXRlIEcuREUyMSBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbmRldGVybWluYXRlIEcuREUyMSBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJJbmRldGVybWluYXRlIEcuREUyMSBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkluZGV0ZXJtaW5hdGUgRy5ERTIxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW5kZXRlcm1pbmF0ZSBHLkRFMjEgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBJbmRldGVybWluYXRlIEcuREUyMSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRy5ERTQzIC0gSENWIHRlc3QgcmVzdWx0CkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IEhlcGF0aXRpcyBDIHZpcnVzIHRlc3QgcmVzdWx0IChIQ1YgYW50aWJvZHksIEhDViBSTkEgb3IgSENWIGNvcmUgYW50aWdlbikKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhDViB0ZXN0IHJlc3VsdCBHLkRFNDMiOgogIGV4aXN0cyAiSENWIHRlc3QgcmVzdWx0IEcuREU0MyBPYnNlcnZhdGlvbiIKZGVmaW5lICJIQ1YgdGVzdCByZXN1bHQgRy5ERTQzIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSENWIHRlc3QgcmVzdWx0IEcuREU0MyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhDViB0ZXN0IHJlc3VsdCBHLkRFNDMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkcuREU0NCAtIFBvc2l0aXZlCkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IEhDViB0ZXN0IHJlc3VsdCB3YXMgcG9zaXRpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlBvc2l0aXZlIEcuREU0NCI6CiAgZXhpc3RzICJQb3NpdGl2ZSBHLkRFNDQgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJQb3NpdGl2ZSBHLkRFNDQgT2JzZXJ2YXRpb24iCmRlZmluZSAiUG9zaXRpdmUgRy5ERTQ0IENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIlBvc2l0aXZlIEcuREU0NCBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIlBvc2l0aXZlIEcuREU0NCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIlBvc2l0aXZlIEcuREU0NCBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIFBvc2l0aXZlIEcuREU0NCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRy5ERTQ1IC0gTmVnYXRpdmUKQGFjdGl2aXR5OiBISVYuRDIwIERpYWdub3N0aWNzCkBkZXNjcmlwdGlvbjogSENWIHRlc3QgcmVzdWx0IHdhcyBuZWdhdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTmVnYXRpdmUgRy5ERTQ1IjoKICBleGlzdHMgIk5lZ2F0aXZlIEcuREU0NSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIk5lZ2F0aXZlIEcuREU0NSBPYnNlcnZhdGlvbiIKZGVmaW5lICJOZWdhdGl2ZSBHLkRFNDUgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iTmVnYXRpdmUgRy5ERTQ1IENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiTmVnYXRpdmUgRy5ERTQ1IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTmVnYXRpdmUgRy5ERTQ1IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgTmVnYXRpdmUgRy5ERTQ1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5HLkRFNDYgLSBJbmRldGVybWluYXRlCkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IEhDViB0ZXN0IHJlc3VsdCB3YXMgaW5kZXRlcm1pbmF0ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW5kZXRlcm1pbmF0ZSBHLkRFNDYiOgogIGV4aXN0cyAiSW5kZXRlcm1pbmF0ZSBHLkRFNDYgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJJbmRldGVybWluYXRlIEcuREU0NiBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbmRldGVybWluYXRlIEcuREU0NiBDb25kaXRpb24iOgogIEVsZW1lbnRzLiJJbmRldGVybWluYXRlIEcuREU0NiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIkluZGV0ZXJtaW5hdGUgRy5ERTQ2IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW5kZXRlcm1pbmF0ZSBHLkRFNDYgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBJbmRldGVybWluYXRlIEcuREU0NiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRy5ERTcwIC0gU3lwaGlsaXMgdGVzdCByZXN1bHQKQGFjdGl2aXR5OiBISVYuRDIwIERpYWdub3N0aWNzCkBkZXNjcmlwdGlvbjogUmVzdWx0IGZyb20gc3lwaGlsaXMgdGVzdAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiU3lwaGlsaXMgdGVzdCByZXN1bHQgRy5ERTcwIjoKICBleGlzdHMgIlN5cGhpbGlzIHRlc3QgcmVzdWx0IEcuREU3MCBPYnNlcnZhdGlvbiIKZGVmaW5lICJTeXBoaWxpcyB0ZXN0IHJlc3VsdCBHLkRFNzAgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJTeXBoaWxpcyB0ZXN0IHJlc3VsdCBHLkRFNzAgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBTeXBoaWxpcyB0ZXN0IHJlc3VsdCBHLkRFNzAgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkcuREU3MSAtIFBvc2l0aXZlCkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IFRlc3QgcmVzdWx0IGlzIHBvc2l0aXZlIGZvciBzeXBoaWxpcwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiUG9zaXRpdmUgRy5ERTcxIjoKICBleGlzdHMgIlBvc2l0aXZlIEcuREU3MSBDb25kaXRpb24iCiAgICBvciBleGlzdHMgIlBvc2l0aXZlIEcuREU3MSBPYnNlcnZhdGlvbiIKZGVmaW5lICJQb3NpdGl2ZSBHLkRFNzEgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iUG9zaXRpdmUgRy5ERTcxIENvbmRpdGlvbiIgQwogICAgd2hlcmUgQy5wcmV2YWxlbmNlSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiUG9zaXRpdmUgRy5ERTcxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iUG9zaXRpdmUgRy5ERTcxIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgUG9zaXRpdmUgRy5ERTcxICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5HLkRFNzIgLSBOZWdhdGl2ZQpAYWN0aXZpdHk6IEhJVi5EMjAgRGlhZ25vc3RpY3MKQGRlc2NyaXB0aW9uOiBUZXN0IHJlc3VsdCBpcyBuZWdhdGl2ZSBmb3Igc3lwaGlsaXMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk5lZ2F0aXZlIEcuREU3MiI6CiAgZXhpc3RzICJOZWdhdGl2ZSBHLkRFNzIgQ29uZGl0aW9uIgogICAgb3IgZXhpc3RzICJOZWdhdGl2ZSBHLkRFNzIgT2JzZXJ2YXRpb24iCmRlZmluZSAiTmVnYXRpdmUgRy5ERTcyIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIk5lZ2F0aXZlIEcuREU3MiBDb25kaXRpb24iIEMKICAgIHdoZXJlIEMucHJldmFsZW5jZUludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQpkZWZpbmUgIk5lZ2F0aXZlIEcuREU3MiBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk5lZ2F0aXZlIEcuREU3MiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5lZ2F0aXZlIEcuREU3MiAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuRy5ERTczIC0gSW5jb25jbHVzaXZlCkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IFRlc3QgcmVzdWx0IGlzIGluY29uY2x1c2l2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSW5jb25jbHVzaXZlIEcuREU3MyI6CiAgZXhpc3RzICJJbmNvbmNsdXNpdmUgRy5ERTczIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSW5jb25jbHVzaXZlIEcuREU3MyBPYnNlcnZhdGlvbiIKZGVmaW5lICJJbmNvbmNsdXNpdmUgRy5ERTczIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkluY29uY2x1c2l2ZSBHLkRFNzMgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJJbmNvbmNsdXNpdmUgRy5ERTczIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSW5jb25jbHVzaXZlIEcuREU3MyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEluY29uY2x1c2l2ZSBHLkRFNzMgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkguREUzNCAtIEhJViBzdGF0dXMgb2YgcGFydG5lciBvciBjb250YWN0CkBhY3Rpdml0eTogSElWLkI2IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogSElWIHN0YXR1cyBvZiB0aGUgcGFydG5lciBvciBjb250YWN0IGdpdmVuIGJ5IHRoZSBpbmRleCBjYXNlCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJISVYgc3RhdHVzIG9mIHBhcnRuZXIgb3IgY29udGFjdCI6CiAgZXhpc3RzICJISVYgc3RhdHVzIG9mIHBhcnRuZXIgb3IgY29udGFjdCBPYnNlcnZhdGlvbiIKZGVmaW5lICJISVYgc3RhdHVzIG9mIHBhcnRuZXIgb3IgY29udGFjdCBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhJViBzdGF0dXMgb2YgcGFydG5lciBvciBjb250YWN0IE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSElWIHN0YXR1cyBvZiBwYXJ0bmVyIG9yIGNvbnRhY3QgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkguREUzNSAtIEFscmVhZHkga25ldyBwb3NpdGl2ZQpAYWN0aXZpdHk6IEhJVi5CNiBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoZSBwYXJ0bmVyIG9yIGNvbnRhY3Qgb2YgdGhlIGluZGV4IGNhc2UgYWxyZWFkeSBrbmV3IHRoZXkgYXJlIEhJVi1wb3NpdGl2ZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQWxyZWFkeSBrbmV3IHBvc2l0aXZlIjoKICBFbGVtZW50cy4iQWxyZWFkeSBrbmV3IHBvc2l0aXZlIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQWxyZWFkeSBrbmV3IHBvc2l0aXZlICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5ILkRFMzYgLSBOZXdseSBkaWFnbm9zZWQKQGFjdGl2aXR5OiBISVYuQjYgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUaGUgcGFydG5lciBvciBjb250YWN0IG9mIHRoZSBpbmRleCBjYXNlIGlzIG5ld2x5IGRpYWdub3NlZCBhcyBISVYtcG9zaXRpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk5ld2x5IGRpYWdub3NlZCI6CiAgRWxlbWVudHMuIk5ld2x5IGRpYWdub3NlZCIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5ld2x5IGRpYWdub3NlZCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuSC5ERTM3IC0gTmVnYXRpdmUKQGFjdGl2aXR5OiBISVYuQjYgQ2FwdHVyZSBvciB1cGRhdGUgY2xpZW50IGhpc3RvcnkKQGRlc2NyaXB0aW9uOiBUaGUgcGFydG5lciBvciBjb250YWN0IG9mIHRoZSBpbmRleCBjYXNlIGlzIG5ld2x5IGRpYWdub3NlZCBpcyBISVYtbmVnYXRpdmUKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk5lZ2F0aXZlIEguREUzNyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk5lZ2F0aXZlIEguREUzNyIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIE5lZ2F0aXZlIEguREUzNyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuSC5ERTQ3IC0gT24gQVJUCkBhY3Rpdml0eTogSElWLkgzIFJlY29yZCBvdXRyZWFjaCBhbmQgcmVzdWx0CkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIGN1cnJlbnRseSB0YWtpbmcgQVJUIAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiT24gQVJUIEguREU0NyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIk9uIEFSVCBILkRFNDciIE1TCiAgICB3aGVyZSBNUy5jb250ZXh0LnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE1TLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgT24gQVJUIEguREU0NyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuUFJWLkRFMSAtIEF0IGVsZXZhdGVkIHJpc2sgZm9yIEhJViBhY3F1aXNpdGlvbgpAYWN0aXZpdHk6IEhJVi5CNiBDYXB0dXJlIG9yIHVwZGF0ZSBjbGllbnQgaGlzdG9yeQpAZGVzY3JpcHRpb246IENsaWVudCBpcyBhdCBlbGV2YXRlZCByaXNrIGZvciBISVYgYWNxdWlzaXRpb24sIGRlZmluZWQgYWNjb3JkaW5nIHRvIGNvdW50cnkvcHJvZ3JhbW1lIGNvbnRleHQKKi8KZGVmaW5lICJBdCBlbGV2YXRlZCByaXNrIGZvciBISVYgYWNxdWlzaXRpb24gUFJWLkRFMSBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkF0IGVsZXZhdGVkIHJpc2sgZm9yIEhJViBhY3F1aXNpdGlvbiBQUlYuREUxIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgQXQgZWxldmF0ZWQgcmlzayBmb3IgSElWIGFjcXVpc2l0aW9uIFBSVi5ERTEgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLlNSVi5ERTIgLSBISVYgdGVzdCByZXN1bHQKQGFjdGl2aXR5OiBISVYuQjcgVGVzdCBmb3IgSElWIHVzaW5nIHRlc3RpbmcgYWxnb3JpdGhtCkBkZXNjcmlwdGlvbjogVGhlIHJlc3VsdCBmcm9tIEhJViB0ZXN0aW5nIGFmdGVyIGFwcGx5aW5nIHRoZSB0ZXN0aW5nIGFsZ29yaXRobQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSElWIHRlc3QgcmVzdWx0IFNSVi5ERTIiOgogIGV4aXN0cyAiSElWIHRlc3QgcmVzdWx0IFNSVi5ERTIgT2JzZXJ2YXRpb24iCmRlZmluZSAiSElWIHRlc3QgcmVzdWx0IFNSVi5ERTIgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJISVYgdGVzdCByZXN1bHQgU1JWLkRFMiBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhJViB0ZXN0IHJlc3VsdCBTUlYuREUyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5TUlYuREU1IC0gSElWIGNsaW5pY2FsIHN0YWdlCkBhY3Rpdml0eTogSElWLkQ4IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogV0hPIGNsaW5pY2FsIHN0YWdlIG9mIGNsaWVudCBiYXNlZCBvbiBzaWducyBhbmQgc3ltcHRvbXMuIFdITyBjbGluaWNhbCBzdGFnaW5nIGlzIGEgd2F5IHRvIGNhdGVnb3JpemUgSElWIGRpc2Vhc2Ugc2V2ZXJpdHkgYmFzZWQgb24gbmV3IG9yIHJlY3VycmVudCBjbGluaWNhbCBldmVudHMuIFRoZXJlIGFyZSA0IFdITyBjbGluaWNhbCBzdGFnZXMgdGhhdCByYW5nZSBmcm9tIG1pbGQgc3ltcHRvbXMgKFdITyBjbGluaWNhbCBzdGFnZSAxKSB0byBzZXZlcmUgc3ltcHRvbXMgKFdITyBjbGluaWNhbCBzdGFnZSA0KS4KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhJViBjbGluaWNhbCBzdGFnZSBTUlYuREU1IjoKICBleGlzdHMgIkhJViBjbGluaWNhbCBzdGFnZSBTUlYuREU1IE9ic2VydmF0aW9uIgpkZWZpbmUgIkhJViBjbGluaWNhbCBzdGFnZSBTUlYuREU1IE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iSElWIGNsaW5pY2FsIHN0YWdlIFNSVi5ERTUgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBISVYgY2xpbmljYWwgc3RhZ2UgU1JWLkRFNSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuU1JWLkRFNiAtIEFSVCBzdGFydCBkYXRlCkBhY3Rpdml0eTogSElWLkI4IFByb3ZpZGUgcG9zdC10ZXN0IGNvdW5zZWxsaW5nCkBkZXNjcmlwdGlvbjogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGNsaWVudCBzdGFydGVkIG9yIHJlc3RhcnRlZCBhbnRpcmV0cm92aXJhbCB0aGVyYXB5IChBUlQpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBUlQgc3RhcnQgZGF0ZSBTUlYuREU2IjoKICBFbGVtZW50cy4iQVJUIHN0YXJ0IGRhdGUgU1JWLkRFNiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBUlQgc3RhcnQgZGF0ZSBTUlYuREU2IFZhbHVlIjoKICAiQVJUIHN0YXJ0IGRhdGUgU1JWLkRFNiIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBBUlQgc3RhcnQgZGF0ZSBTUlYuREU2ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5TUlYuREU3IC0gQ3VycmVudGx5IHByZWduYW50CkBhY3Rpdml0eTogSElWLkI2IENhcHR1cmUgb3IgdXBkYXRlIGNsaWVudCBoaXN0b3J5CkBkZXNjcmlwdGlvbjogQ2xpZW50IGlzIGN1cnJlbnRseSBwcmVnbmFudAoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiQ3VycmVudGx5IHByZWduYW50IFNSVi5ERTciOgogIGV4aXN0cyAiQ3VycmVudGx5IHByZWduYW50IFNSVi5ERTcgT2JzZXJ2YXRpb24iCmRlZmluZSAiQ3VycmVudGx5IHByZWduYW50IFNSVi5ERTcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJDdXJyZW50bHkgcHJlZ25hbnQgU1JWLkRFNyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEN1cnJlbnRseSBwcmVnbmFudCBTUlYuREU3ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5TUlYuREU4IC0gQ0Q0IGNvdW50CkBhY3Rpdml0eTogSElWLkQyMCBEaWFnbm9zdGljcwpAZGVzY3JpcHRpb246IENENCBjZWxsIGNvdW50IGluIGNlbGxzL21tXjMKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkNENCBjb3VudCBTUlYuREU4IjoKICBFbGVtZW50cy4iQ0Q0IGNvdW50IFNSVi5ERTgiIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5CmRlZmluZSAiQ0Q0IGNvdW50IFNSVi5ERTggVmFsdWUiOgogICJDRDQgY291bnQgU1JWLkRFOCIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBDRDQgY291bnQgU1JWLkRFOCAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuU1JWLkRFMTIgLSBEYXRlIG9mIHZpcmFsIGxvYWQgc2FtcGxlIGNvbGxlY3Rpb24KQGFjdGl2aXR5OiBISVYuRDEwIENvdW5zZWwgcmV0dXJuaW5nIGNsaWVudApAZGVzY3JpcHRpb246IERhdGUgYW5kIHRpbWUgd2hlbiB0aGUgc2FtcGxlIHdhcyBjb2xsZWN0ZWQgdG8gdGVzdCB0aGUgY2xpZW50J3MgSElWIHZpcmFsIGxvYWQKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkRhdGUgb2YgdmlyYWwgbG9hZCBzYW1wbGUgY29sbGVjdGlvbiBTUlYuREUxMiI6CiAgRWxlbWVudHMuIkRhdGUgb2YgdmlyYWwgbG9hZCBzYW1wbGUgY29sbGVjdGlvbiBTUlYuREUxMiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJEYXRlIG9mIHZpcmFsIGxvYWQgc2FtcGxlIGNvbGxlY3Rpb24gU1JWLkRFMTIgVmFsdWUiOgogICJEYXRlIG9mIHZpcmFsIGxvYWQgc2FtcGxlIGNvbGxlY3Rpb24gU1JWLkRFMTIiIE8KICByZXR1cm4gTy52YWx1ZQovKiBFbmQgb2YgRGF0ZSBvZiB2aXJhbCBsb2FkIHNhbXBsZSBjb2xsZWN0aW9uIFNSVi5ERTEyICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5TUlYuREUxMyAtIFZpcmFsIGxvYWQgdGVzdCByZXN1bHQKQGFjdGl2aXR5OiBISVYuRDIwIERpYWdub3N0aWNzCkBkZXNjcmlwdGlvbjogUmVzdWx0IGZyb20gdGhlIHZpcmFsIGxvYWQgdGVzdCBpbiBudW1iZXIgb2YgY29waWVzL21MCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJWaXJhbCBsb2FkIHRlc3QgcmVzdWx0IFNSVi5ERTEzIjoKICBFbGVtZW50cy4iVmlyYWwgbG9hZCB0ZXN0IHJlc3VsdCBTUlYuREUxMyIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJWaXJhbCBsb2FkIHRlc3QgcmVzdWx0IFNSVi5ERTEzIFZhbHVlIjoKICAiVmlyYWwgbG9hZCB0ZXN0IHJlc3VsdCBTUlYuREUxMyIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBWaXJhbCBsb2FkIHRlc3QgcmVzdWx0IFNSVi5ERTEzICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5TUlYuREUxNSAtIFZpc2l0IGRhdGUKQGFjdGl2aXR5OiBISVYuQTIgR2F0aGVyIGNsaWVudCBkZXRhaWxzCkBkZXNjcmlwdGlvbjogVGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGNsaWVudCdzIHZpc2l0CiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJWaXNpdCBkYXRlIFNSVi5ERTE1IjoKICBFbGVtZW50cy4iVmlzaXQgZGF0ZSBTUlYuREUxNSIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJWaXNpdCBkYXRlIFNSVi5ERTE1IFZhbHVlIjoKICAiVmlzaXQgZGF0ZSBTUlYuREUxNSIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBWaXNpdCBkYXRlIFNSVi5ERTE1ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5TUlYuREUxOCAtIEFOQyBjb250YWN0IGRhdGUKQGFjdGl2aXR5OiBISVYuRTEgQ2FwdHVyZSBvciB1cGRhdGUgbW90aGVyJ3MgaGlzdG9yeQpAZGVzY3JpcHRpb246IFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBjbGllbnQncyBBTkMgY29udGFjdCAoaW4gdGhlIEFOQyBEQUsgdGhpcyBpcyBjYWxsZWQgJ0NvbnRhY3QgZGF0ZScpCiovCi8vIFRPRE86IFJlcGxhY2UgcGxhY2Vob2xkZXIgd2l0aCByZWxldmFudCBDUUwgbG9naWMKZGVmaW5lICJBTkMgY29udGFjdCBkYXRlIFNSVi5ERTE4IjoKICBFbGVtZW50cy4iQU5DIGNvbnRhY3QgZGF0ZSBTUlYuREUxOCIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJBTkMgY29udGFjdCBkYXRlIFNSVi5ERTE4IFZhbHVlIjoKICAiQU5DIGNvbnRhY3QgZGF0ZSBTUlYuREUxOCIgTwogIHJldHVybiBPLnZhbHVlCi8qIEVuZCBvZiBBTkMgY29udGFjdCBkYXRlIFNSVi5ERTE4ICovCgovKgpAZGF0YUVsZW1lbnQ6IEhJVi5TUlYuREUyMSAtIFRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxCkBhY3Rpdml0eTogSElWLkU0IFRlc3QgbW90aGVyIGZvciBISVYgdXNpbmcgdGVzdGluZyBhbGdvcml0aG0KQGRlc2NyaXB0aW9uOiBUaGUgcmVzdWx0IG9mIHRoZSBmaXJzdCBISVYgYXNzYXkgaW4gdGhlIHRlc3Rpbmcgc3RyYXRlZ3kKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxIFNSVi5ERTIxIjoKICBleGlzdHMgIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxIFNSVi5ERTIxIE9ic2VydmF0aW9uIgpkZWZpbmUgIlRlc3QgcmVzdWx0IG9mIEhJViBhc3NheSAxIFNSVi5ERTIxIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iVGVzdCByZXN1bHQgb2YgSElWIGFzc2F5IDEgU1JWLkRFMjEgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBUZXN0IHJlc3VsdCBvZiBISVYgYXNzYXkgMSBTUlYuREUyMSAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQ29uZmlnLkRFNiAtIE1hbGFyaWEtZW5kZW1pYyBzZXR0aW5nCkBhY3Rpdml0eTogSElWLkNvbmZpZ3VyYXRpb24KQGRlc2NyaXB0aW9uOiBXaGV0aGVyIHRoZSBzZXR0aW5nIGlzIGEgbWFsYXJpYS1lbmRlbWljIHNldHRpbmcKKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIk1hbGFyaWEtZW5kZW1pYyBzZXR0aW5nIjoKICBleGlzdHMgIk1hbGFyaWEtZW5kZW1pYyBzZXR0aW5nIE9ic2VydmF0aW9uIgpkZWZpbmUgIk1hbGFyaWEtZW5kZW1pYyBzZXR0aW5nIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTWFsYXJpYS1lbmRlbWljIHNldHRpbmcgT2JzZXJ2YXRpb24iIE8KICAgIHdoZXJlIE8uZW5jb3VudGVyLnJlZmVyZW5jZXMoRW5jb3VudGVySWQpCiAgICAgIG9yIE8uZWZmZWN0aXZlLnRvSW50ZXJ2YWwoKSBzdGFydHMgb24gb3IgYmVmb3JlIFRvZGF5Ci8qIEVuZCBvZiBNYWxhcmlhLWVuZGVtaWMgc2V0dGluZyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQ29uZmlnLkRFMTIgLSBISVYgYnVyZGVuIG9mIHRoZSBzZXR0aW5nCkBhY3Rpdml0eTogSElWLkNvbmZpZ3VyYXRpb24KQGRlc2NyaXB0aW9uOiBISVYgYnVyZGVuIG9mIHRoZSBzZXR0aW5nIChoaWdoIG9yIGxvdykgYmFzZWQgb24gdGhlIG5hdGlvbmFsIEhJViBwcmV2YWxlbmNlIG9yIHdoZXJlIHRoZSBISVYgcHJldmFsZW5jZSBhbmQvb3IgaW5jaWRlbmNlIGluIGEgZ2VvZ3JhcGhpY2FsIHNldHRpbmcgaXMgaGlnaGVyIHRoYW4gbmF0aW9uYWwgcHJldmFsZW5jZSBhbmQsIHRoZXJlZm9yZSwgbmVlZHMgcHJpb3JpdHkgaW4gdGhlIEhJViByZXNwb25zZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSElWIGJ1cmRlbiBvZiB0aGUgc2V0dGluZyI6CiAgZXhpc3RzICJISVYgYnVyZGVuIG9mIHRoZSBzZXR0aW5nIE9ic2VydmF0aW9uIgpkZWZpbmUgIkhJViBidXJkZW4gb2YgdGhlIHNldHRpbmcgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJISVYgYnVyZGVuIG9mIHRoZSBzZXR0aW5nIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSElWIGJ1cmRlbiBvZiB0aGUgc2V0dGluZyAqLwoKLyoKQGRhdGFFbGVtZW50OiBISVYuQ29uZmlnLkRFMTMgLSBIaWdoIEhJViBidXJkZW4gc2V0dGluZwpAYWN0aXZpdHk6IEhJVi5Db25maWd1cmF0aW9uCkBkZXNjcmlwdGlvbjogU2V0dGluZ3Mgd2l0aCA+NSUgbmF0aW9uYWwgSElWIHByZXZhbGVuY2UgYW5kIHN1YnBvcHVsYXRpb25zIGFuZCBnZW9ncmFwaGljIHNldHRpbmdzIHdoZXJlIEhJViBwcmV2YWxlbmNlIGFuZC9vciBpbmNpZGVuY2UgaXMgaGlnaGVyIHRoYW4gbmF0aW9uYWxseS4KKi8KLy8gVE9ETzogUmVwbGFjZSBwbGFjZWhvbGRlciB3aXRoIHJlbGV2YW50IENRTCBsb2dpYwpkZWZpbmUgIkhpZ2ggSElWIGJ1cmRlbiBzZXR0aW5nIjoKICBleGlzdHMgIkhpZ2ggSElWIGJ1cmRlbiBzZXR0aW5nIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiSGlnaCBISVYgYnVyZGVuIHNldHRpbmcgT2JzZXJ2YXRpb24iCmRlZmluZSAiSGlnaCBISVYgYnVyZGVuIHNldHRpbmcgQ29uZGl0aW9uIjoKICBFbGVtZW50cy4iSGlnaCBISVYgYnVyZGVuIHNldHRpbmcgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJIaWdoIEhJViBidXJkZW4gc2V0dGluZyBPYnNlcnZhdGlvbiI6CiAgRWxlbWVudHMuIkhpZ2ggSElWIGJ1cmRlbiBzZXR0aW5nIE9ic2VydmF0aW9uIiBPCiAgICB3aGVyZSBPLmVuY291bnRlci5yZWZlcmVuY2VzKEVuY291bnRlcklkKQogICAgICBvciBPLmVmZmVjdGl2ZS50b0ludGVydmFsKCkgc3RhcnRzIG9uIG9yIGJlZm9yZSBUb2RheQovKiBFbmQgb2YgSGlnaCBISVYgYnVyZGVuIHNldHRpbmcgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkNvbmZpZy5ERTE0IC0gTG93IEhJViBidXJkZW4gc2V0dGluZwpAYWN0aXZpdHk6IEhJVi5Db25maWd1cmF0aW9uCkBkZXNjcmlwdGlvbjogU2V0dGluZ3Mgd2l0aCA8NSUgSElWIG5hdGlvbmFsIHByZXZhbGVuY2UgYnV0IHdoZXJlIGNlcnRhaW4gcG9wdWxhdGlvbnMgKHByaW1hcmlseSBrZXkgcG9wdWxhdGlvbnMgYW5kIHRoZWlyIHBhcnRuZXJzKSBhbmQgZ2VvZ3JhcGhpYyBzZXR0aW5ncyBtYXkgaGF2ZSBoaWdoZXIgSElWIHByZXZhbGVuY2UgYW5kL29yIGluY2lkZW5jZSB0aGFuIG5hdGlvbmFsbHkgYW5kLCB0aGVyZWZvcmUsIG5lZWQgcHJpb3JpdHkgaW4gdGhlIEhJViByZXNwb25zZQoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiTG93IEhJViBidXJkZW4gc2V0dGluZyI6CiAgZXhpc3RzICJMb3cgSElWIGJ1cmRlbiBzZXR0aW5nIENvbmRpdGlvbiIKICAgIG9yIGV4aXN0cyAiTG93IEhJViBidXJkZW4gc2V0dGluZyBPYnNlcnZhdGlvbiIKZGVmaW5lICJMb3cgSElWIGJ1cmRlbiBzZXR0aW5nIENvbmRpdGlvbiI6CiAgRWxlbWVudHMuIkxvdyBISVYgYnVyZGVuIHNldHRpbmcgQ29uZGl0aW9uIiBDCiAgICB3aGVyZSBDLnByZXZhbGVuY2VJbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKZGVmaW5lICJMb3cgSElWIGJ1cmRlbiBzZXR0aW5nIE9ic2VydmF0aW9uIjoKICBFbGVtZW50cy4iTG93IEhJViBidXJkZW4gc2V0dGluZyBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIExvdyBISVYgYnVyZGVuIHNldHRpbmcgKi8KCi8qCkBkYXRhRWxlbWVudDogSElWLkNvbmZpZy5ERTE1IC0gSFBWIEROQSB0ZXN0aW5nIG9wZXJhdGlvbmFsIGF0IHRoZSBoZWFsdGggZmFjaWxpdHkKQGFjdGl2aXR5OiBISVYuQ29uZmlndXJhdGlvbgpAZGVzY3JpcHRpb246IElzIEhQViBETkEgdGVzdGluZyBvcGVyYXRpb25hbCBhdCB0aGUgaGVhbHRoIGZhY2lsaXR5IGZvciBjZXJ2aWNhbCBjYW5jZXIgc2NyZWVuaW5nPwoqLwovLyBUT0RPOiBSZXBsYWNlIHBsYWNlaG9sZGVyIHdpdGggcmVsZXZhbnQgQ1FMIGxvZ2ljCmRlZmluZSAiSFBWIEROQSB0ZXN0aW5nIG9wZXJhdGlvbmFsIGF0IHRoZSBoZWFsdGggZmFjaWxpdHkiOgogIGV4aXN0cyAiSFBWIEROQSB0ZXN0aW5nIG9wZXJhdGlvbmFsIGF0IHRoZSBoZWFsdGggZmFjaWxpdHkgT2JzZXJ2YXRpb24iCmRlZmluZSAiSFBWIEROQSB0ZXN0aW5nIG9wZXJhdGlvbmFsIGF0IHRoZSBoZWFsdGggZmFjaWxpdHkgT2JzZXJ2YXRpb24iOgogIEVsZW1lbnRzLiJIUFYgRE5BIHRlc3Rpbmcgb3BlcmF0aW9uYWwgYXQgdGhlIGhlYWx0aCBmYWNpbGl0eSBPYnNlcnZhdGlvbiIgTwogICAgd2hlcmUgTy5lbmNvdW50ZXIucmVmZXJlbmNlcyhFbmNvdW50ZXJJZCkKICAgICAgb3IgTy5lZmZlY3RpdmUudG9JbnRlcnZhbCgpIHN0YXJ0cyBvbiBvciBiZWZvcmUgVG9kYXkKLyogRW5kIG9mIEhQViBETkEgdGVzdGluZyBvcGVyYXRpb25hbCBhdCB0aGUgaGVhbHRoIGZhY2lsaXR5ICovCgoKLyoKICogQ3VzdG9tIGVsZW1lbnRzIGFuZCBsb2dpYyBmb3IgdXNlIERUIGFuZCBJTkQgQ1FMIExpYnJhcmllcwogKi8="
    },
    {
      "contentType" : "application/elm+xml"
    }
  ]
}